outcomesdp q on one uses edge between members of two components whose layers form a forbidden pair.spec:validation.architecture-constraints.forbidden-layer-pairPacks: pack:corpus-checks-v1, pack:self-hosting-v1
Design: no design entries · no pinned declarations · no decisions
Findings: no errors, no warnings
specs/validation/architecture-constraints.forbidden-layer-pair.sdp.md
No open questions and no blocking questions; implementation binding none, verifier binding present, and expected-outcome oracle none.
Given
a member of a component at the layer {fromLayer: "domain"} in the context {fromContext: "orders"} that uses a member of a component at the layer {toLayer: "infrastructure"} in the context {toContext: "orders"}When
the architecture walk runs {invocation: "through sdp q"} with the forbidden pair domain to infrastructure and the isolated context platformThen
the walk reports {findings: 1} findings with the rule ids {ruleIds: "forbidden-layer"}
the walk lists {unclassified: 0} unclassified edges
the command exits {exitCode: 0}Composing needs the script.
outcomesdp q on one uses edge between members of two components whose layers form a forbidden pair.assumptionscomponent: anchors, each with one impl: member; the using member's anchor uses the used member. Each component states the layer and context its slots give, and the Protocol's validators find the root clean. The world runs the walk's shipped recipe file through sdp q --json with params { "forbidden": [{ "from": "domain", "to": "infrastructure" }], "isolated": ["platform"] }; the rule ids are the findings' validatorId values joined by a comma and a space, in answer order.Given a member of a component at the layer {fromLayer: "domain"} in the context {fromContext: "orders"} that uses a member of a component at the layer {toLayer: "infrastructure"} in the context {toContext: "orders"}
When the architecture walk runs {invocation: "through sdp q"} with the forbidden pair domain to infrastructure and the isolated context platform
Then the walk reports {findings: 1} findings with the rule ids {ruleIds: "forbidden-layer"}
Then the walk lists {unclassified: 0} unclassified edges
Then the command exits {exitCode: 0}test/self-hosting-corpus-checks.test.ts:346test/self-hosting-corpus-checks.test.tsTest anchors: test:protocol.model.planned-architecture.differing-layer-and-uses, test:protocol.model.planned-architecture.matching-design, test:protocol.model.planned-architecture.unrealized-design, test:protocol.validation.architecture-constraints.forbidden-layer-pair, test:protocol.validation.architecture-constraints.isolated-context-as-rule, test:protocol.validation.architecture-constraints.unstated-layer-unclassified, test:protocol.validation.corpus-rules.copies-contain-changes, test:protocol.validation.corpus-rules.error-finding-fails, test:protocol.validation.corpus-rules.malformed-finding-fails, test:protocol.validation.corpus-rules.warning-finding-informs. Specs verified by those bindings: spec:model.planned-architecture, spec:model.planned-architecture.differing-layer-and-uses, spec:model.planned-architecture.matching-design, spec:model.planned-architecture.unrealized-design, spec:validation.architecture-constraints, spec:validation.architecture-constraints.forbidden-layer-pair, spec:validation.architecture-constraints.isolated-context-as-rule, spec:validation.architecture-constraints.unstated-layer-unclassified, spec:validation.corpus-rules, spec:validation.corpus-rules.copies-contain-changes, spec:validation.corpus-rules.error-finding-fails, spec:validation.corpus-rules.malformed-finding-fails, spec:validation.corpus-rules.warning-finding-informs.
Build: CI 391 · Branch: cursor/media-plan-and-articles-09b1 · Commit: 076cd4f1f85640d8236e5cca1bffffa68ab79a33 · Start: 2026-10-31T15:32:20.471Z · Stop: 2026-10-31T15:34:02.073Z
| Name | Suite | Result | Duration |
|---|---|---|---|
| executes the bound example against a fresh world | A rules file that empties its graph leaves the next file's graph whole (spec:validation.corpus-rules.copies-contain-changes) | passed | 21.88 ms |
| executes the bound example against a fresh world | An error from a corpus rule fails validation and leaves the Protocol's line alone (spec:validation.corpus-rules.error-finding-fails) | passed | 4.69 ms |
| executes the bound example against a fresh world | A finding with no subject fails its rules file (spec:validation.corpus-rules.malformed-finding-fails) | passed | 4.13 ms |
| executes the bound example against a fresh world | A warning from a corpus rule informs and passes (spec:validation.corpus-rules.warning-finding-informs) | passed | 3.83 ms |
| executes the bound example against a fresh world | A domain member that uses an infrastructure member breaks a forbidden pair (spec:validation.architecture-constraints.forbidden-layer-pair) | passed | 15.92 ms |
| executes the bound example against a fresh world | The walk named as a rules file fails validation on an isolation breach (spec:validation.architecture-constraints.isolated-context-as-rule) | passed | 4.55 ms |
| executes the bound example against a fresh world | A component with no layer leaves its edge unclassified (spec:validation.architecture-constraints.unstated-layer-unclassified) | passed | 2.97 ms |
| executes the bound example against a fresh world | A realized component that differs from its design gives one row per field (spec:model.planned-architecture.differing-layer-and-uses) | passed | 6.29 ms |
| executes the bound example against a fresh world | A realized component that matches its design gives no row (spec:model.planned-architecture.matching-design) | passed | 17.77 ms |
| executes the bound example against a fresh world | A component design no anchor satisfies is listed as unrealized (spec:model.planned-architecture.unrealized-design) | passed | 6.93 ms |
test/self-hosting-corpus-checks.test.ts:346Copyable source; the Studio draws static SVG.
Preferred and chosen syntax: requirementDiagram; exact refines, satisfies and verifies, with claim words in nodes and per-edge comments.
No decision record named.
No implementation neighborhood recorded.
Runtime observation: not tracked.
Runtime observation: not tracked.
Build attestations: not tracked.
Deployments: not tracked.
Bills of materials: not tracked.
Copyable source; the Studio draws static SVG.
Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.
No Spec rests on this Spec.
| Relation and direction | Other end | Claim | Reason | Exercised keys |
|---|---|---|---|---|
| refines · outgoing | Declared architecture rules are checked against anchored structurespec:validation.architecture-constraints · resolves | declared | None | None |
| verifies · outgoing | Declared architecture rules are checked against anchored structurespec:validation.architecture-constraints · resolves | declared | None | walk |
test/self-hosting-corpus-checks.test.ts:346Runtime observation: not tracked.
Run results: not recorded in the graph.
None.
Composing needs the script.