@n8r/surface 0.0.0-stage → 0.1.0-experimental.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE-DOCS +395 -0
  3. package/LICENSING.md +36 -0
  4. package/README.md +207 -2
  5. package/dist/activity.d.ts +16 -0
  6. package/dist/activity.js +44 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +412 -0
  9. package/dist/codec.d.ts +6 -0
  10. package/dist/codec.js +56 -0
  11. package/dist/codex.d.ts +72 -0
  12. package/dist/codex.js +526 -0
  13. package/dist/contracts.d.ts +235 -0
  14. package/dist/contracts.js +1 -0
  15. package/dist/cyclonedx-schemas/bom-1.7.schema.json +6700 -0
  16. package/dist/cyclonedx-schemas/cryptography-defs.schema.json +576 -0
  17. package/dist/cyclonedx-schemas/jsf-0.82.schema.json +240 -0
  18. package/dist/cyclonedx-schemas/spdx.schema.json +786 -0
  19. package/dist/cyclonedx-validation.d.ts +1 -0
  20. package/dist/cyclonedx-validation.js +45 -0
  21. package/dist/html.d.ts +5 -0
  22. package/dist/html.js +74 -0
  23. package/dist/index.d.ts +7 -0
  24. package/dist/index.js +5 -0
  25. package/dist/notes.d.ts +52 -0
  26. package/dist/notes.js +184 -0
  27. package/dist/portable.d.ts +10 -0
  28. package/dist/portable.js +71 -0
  29. package/dist/recent.d.ts +9 -0
  30. package/dist/recent.js +71 -0
  31. package/dist/revisions.d.ts +2 -0
  32. package/dist/revisions.js +60 -0
  33. package/dist/settings.d.ts +23 -0
  34. package/dist/settings.js +100 -0
  35. package/dist/setup.d.ts +9 -0
  36. package/dist/setup.js +161 -0
  37. package/dist/skill-artifacts-cli.d.ts +1 -0
  38. package/dist/skill-artifacts-cli.js +13 -0
  39. package/dist/skill-artifacts.d.ts +15 -0
  40. package/dist/skill-artifacts.js +184 -0
  41. package/dist/skill-cyclonedx.d.ts +26 -0
  42. package/dist/skill-cyclonedx.js +214 -0
  43. package/dist/skill-presentation.d.ts +10 -0
  44. package/dist/skill-presentation.js +108 -0
  45. package/dist/skill-surface-cli.d.ts +1 -0
  46. package/dist/skill-surface-cli.js +37 -0
  47. package/dist/skill-surface-store.d.ts +7 -0
  48. package/dist/skill-surface-store.js +126 -0
  49. package/dist/source-tools.d.ts +102 -0
  50. package/dist/source-tools.js +201 -0
  51. package/dist/startup.d.ts +7 -0
  52. package/dist/startup.js +74 -0
  53. package/dist/surface-bom.d.ts +73 -0
  54. package/dist/surface-bom.js +139 -0
  55. package/dist/surface-draft.d.ts +22 -0
  56. package/dist/surface-draft.js +112 -0
  57. package/dist/surface-instructions.d.ts +3 -0
  58. package/dist/surface-instructions.js +32 -0
  59. package/dist/surface-overview.d.ts +15 -0
  60. package/dist/surface-overview.js +86 -0
  61. package/dist/surface-store.d.ts +34 -0
  62. package/dist/surface-store.js +213 -0
  63. package/dist/surface-view.d.ts +3 -0
  64. package/dist/surface-view.js +50 -0
  65. package/dist/validate.d.ts +4 -0
  66. package/dist/validate.js +482 -0
  67. package/docs/n8r-surface/README.md +133 -0
  68. package/docs/n8r-surface/cli-bundles.md +72 -0
  69. package/docs/n8r-surface/codex-research-transcript.md +51 -0
  70. package/docs/n8r-surface/codex-research-verification.md +176 -0
  71. package/docs/n8r-surface/command-outcomes.md +711 -0
  72. package/docs/n8r-surface/contracts.md +220 -0
  73. package/docs/n8r-surface/critical-path.md +184 -0
  74. package/docs/n8r-surface/design.md +289 -0
  75. package/docs/n8r-surface/first-use-access.md +143 -0
  76. package/docs/n8r-surface/first-use-overview.md +262 -0
  77. package/docs/n8r-surface/getting-started.md +74 -0
  78. package/docs/n8r-surface/guided-journey-verification.md +137 -0
  79. package/docs/n8r-surface/host-contract.md +176 -0
  80. package/docs/n8r-surface/implementation-decisions.md +96 -0
  81. package/docs/n8r-surface/instance-first-research.md +209 -0
  82. package/docs/n8r-surface/npm-distribution.md +107 -0
  83. package/docs/n8r-surface/npm-release.md +315 -0
  84. package/docs/n8r-surface/product-direction.md +327 -0
  85. package/docs/n8r-surface/recreation-handoff.md +117 -0
  86. package/docs/n8r-surface/researcher-discovery.md +157 -0
  87. package/docs/n8r-surface/researcher-prepared-check.md +117 -0
  88. package/docs/n8r-surface/researcher-reconciliation-trial.md +149 -0
  89. package/docs/n8r-surface/researcher-repository-check.md +95 -0
  90. package/docs/n8r-surface/researcher-skeleton-check.md +84 -0
  91. package/docs/n8r-surface/researcher-skill-verification.md +725 -0
  92. package/docs/n8r-surface/researcher-skill.md +309 -0
  93. package/docs/n8r-surface/researcher-vault.md +134 -0
  94. package/docs/n8r-surface/save-reopen-transcript.md +211 -0
  95. package/docs/n8r-surface/save-reopen-verification.md +152 -0
  96. package/docs/n8r-surface/security-assurance-strategy.md +267 -0
  97. package/docs/n8r-surface/skill-bom-verification.md +142 -0
  98. package/docs/n8r-surface/skill-cyclonedx-verification.md +144 -0
  99. package/docs/n8r-surface/skill-cyclonedx.md +85 -0
  100. package/docs/n8r-surface/skill-manual.md +129 -0
  101. package/docs/n8r-surface/skill-surface-artifacts.md +234 -0
  102. package/docs/n8r-surface/skill-usefulness-verification.md +135 -0
  103. package/docs/n8r-surface/skill-workspace-automation.md +359 -0
  104. package/docs/n8r-surface/startup-human-check.md +172 -0
  105. package/docs/n8r-surface/startup-verification.md +161 -0
  106. package/docs/n8r-surface/startup.md +151 -0
  107. package/docs/n8r-surface/surface-description-contract.md +224 -0
  108. package/docs/n8r-surface/surface-descriptions.md +173 -0
  109. package/docs/n8r-surface/surface-relationships.md +231 -0
  110. package/docs/n8r-surface/surface-revisions-transcript.md +552 -0
  111. package/docs/n8r-surface/surface-revisions-verification.md +161 -0
  112. package/docs/n8r-surface/tester-candidate.md +158 -0
  113. package/docs/n8r-surface/vault-setup-verification.md +210 -0
  114. package/docs/n8r-surface/verification.md +117 -0
  115. package/docs/n8r-surface/versioning.md +172 -0
  116. package/docs/n8r-surface/workspace-human-check.md +101 -0
  117. package/docs/n8r-surface/workspace-installation.md +68 -0
  118. package/docs/n8r-surface/workspace-verification.md +350 -0
  119. package/docs/n8r-surface/workspace.md +83 -0
  120. package/examples/researcher/README.md +100 -0
  121. package/examples/researcher/composed.surface.json +430 -0
  122. package/examples/researcher/composed.surface.yaml +283 -0
  123. package/examples/researcher/cyclonedx/configured/README.md +7 -0
  124. package/examples/researcher/cyclonedx/configured/manifest.json +10 -0
  125. package/examples/researcher/cyclonedx/configured/mapping.json +323 -0
  126. package/examples/researcher/cyclonedx/configured/surface-records.json +1275 -0
  127. package/examples/researcher/cyclonedx/configured/surface.cdx.json +79 -0
  128. package/examples/researcher/descriptions/README.md +29 -0
  129. package/examples/researcher/descriptions/bound-r1.json +141 -0
  130. package/examples/researcher/descriptions/bound-r2.json +153 -0
  131. package/examples/researcher/descriptions/capability.json +167 -0
  132. package/examples/researcher/descriptions/research-r1.json +153 -0
  133. package/examples/researcher/descriptions/research-r2.json +157 -0
  134. package/examples/researcher/descriptions/sources.md +24 -0
  135. package/examples/researcher/harbor-r1.research.html +193 -0
  136. package/examples/researcher/harbor-r2.research.html +226 -0
  137. package/examples/researcher/lumen-manual-edit.pending.html +271 -0
  138. package/examples/researcher/lumen-r1.research.html +271 -0
  139. package/examples/researcher/lumen-r2.research.html +280 -0
  140. package/examples/researcher/relationships/README.md +34 -0
  141. package/examples/researcher/relationships/bound-r1.json +346 -0
  142. package/examples/researcher/relationships/bound-r2.json +358 -0
  143. package/examples/researcher/relationships/capability.json +325 -0
  144. package/examples/researcher/relationships/config/assistant.env.example +4 -0
  145. package/examples/researcher/relationships/research-r1.json +300 -0
  146. package/examples/researcher/relationships/research-r2.json +304 -0
  147. package/examples/researcher/relationships/sources.md +38 -0
  148. package/examples/researcher/sources/harbor-api.md +16 -0
  149. package/examples/researcher/sources/harbor-auth.md +8 -0
  150. package/examples/researcher/sources/lumen-guide.md +28 -0
  151. package/examples/researcher/sources/lumen-settings.md +9 -0
  152. package/examples/researcher/surface-bom/README.md +17 -0
  153. package/examples/researcher/surface-bom/initial.cdx.json +188 -0
  154. package/package.json +45 -4
  155. package/plugins/n8r-surface/.codex-plugin/plugin.json +31 -0
  156. package/plugins/n8r-surface/LICENSE +202 -0
  157. package/plugins/n8r-surface/LICENSE-DOCS +395 -0
  158. package/plugins/n8r-surface/LICENSING.md +39 -0
  159. package/plugins/n8r-surface/assets/icon.svg +5 -0
  160. package/plugins/n8r-surface/plugin.json +27 -0
  161. package/plugins/n8r-surface/skills/research/SKILL.md +163 -0
  162. package/plugins/n8r-surface/skills/research/agents/openai.yaml +4 -0
  163. package/plugins/n8r-surface/skills/research/references/artifacts.md +152 -0
  164. package/plugins/n8r-surface/skills/research/references/cyclonedx.md +207 -0
  165. package/plugins/n8r-surface/skills/research/references/discovery-map.md +178 -0
  166. package/plugins/n8r-surface/skills/research/references/examples/bound-r1.json +346 -0
  167. package/plugins/n8r-surface/skills/research/references/examples/capability.json +325 -0
  168. package/plugins/n8r-surface/skills/research/references/examples/research-r1.json +300 -0
  169. package/plugins/n8r-surface/skills/research/references/examples/surface.cdx.json +188 -0
  170. package/plugins/n8r-surface/skills/research/references/first-use-access.md +97 -0
  171. package/plugins/n8r-surface/skills/research/references/first-use-overview.md +101 -0
  172. package/plugins/n8r-surface/skills/research/references/instance-first.md +125 -0
  173. package/plugins/n8r-surface/skills/research/references/model-meanings.md +55 -0
  174. package/plugins/n8r-surface/skills/research/references/skeleton-surface.md +105 -0
  175. package/plugins/n8r-surface/skills/research/references/working-notes.md +121 -0
  176. package/plugins/n8r-surface/skills/research/references/workspace.md +89 -0
  177. package/plugins/n8r-surface/skills/research/scripts/THIRD-PARTY-NOTICES.txt +273 -0
  178. package/plugins/n8r-surface/skills/research/scripts/artifacts.mjs +8348 -0
  179. package/plugins/n8r-surface/skills/research/scripts/cyclonedx.mjs +28113 -0
  180. package/plugins/n8r-surface/skills/research/scripts/surface.mjs +27800 -0
  181. package/plugins/n8r-surface/skills/research/scripts/workspace.mjs +120 -0
@@ -0,0 +1,315 @@
1
+ # First public npm release
2
+
3
+ ## Verified scoped release
4
+
5
+ Published on 5 November 2026:
6
+ **[`@n8r/surface@0.1.0-experimental.2`](https://www.npmjs.com/package/@n8r/surface/v/0.1.0-experimental.2)**,
7
+ from commit `f38153645cd12f7ea60f76af251edfbaebb73409` and permanent tag
8
+ `v0.1.0-experimental.2`. The
9
+ [GitHub prerelease](https://github.com/injectionator/n8r-surface/releases/tag/v0.1.0-experimental.2)
10
+ is finalized and read back as `immutable: true`. Its attached
11
+ [verification summary](https://github.com/injectionator/n8r-surface/releases/download/v0.1.0-experimental.2/scoped-registry-verification.json)
12
+ records the exact digest and checks.
13
+
14
+ The maintainer approved **scoped-only** publication after npm accepted the scoped
15
+ stage but rejected the unscoped submission with E403. `n8r-surface` remains the
16
+ executable name; the unscoped registry package was not published or secured.
17
+ Its archive remains retained solely as evidence of the original dual build.
18
+ Unscoped publication and name reservation have since been removed from the plan.
19
+
20
+ Independent readback verified registry bytes against the retained archive,
21
+ installed library/assets and CLI identity on Node 22.23.2, 24.22.2 and 26.13.0,
22
+ empty-home startup and a fresh-cache npm-exec invocation. npm audit verified
23
+ registry signatures and the scoped package's provenance. Separate cryptographic
24
+ verification required the exact GitHub workflow/tag certificate identity; the
25
+ attestation subject digest and source commit/repository matched the release.
26
+ These release checks are not new real-model research evidence.
27
+
28
+ Use the exact version or npm tag `experimental`. `latest` still points to npm's
29
+ `0.0.0-stage` placeholder; it has not been promoted. The `.1` preparation stopped
30
+ before npm staging because of a faulty remote-tag API lookup. Its permanent tag
31
+ and unpublished draft artifacts remain retained.
32
+
33
+ ## Experimental.5 release
34
+
35
+ The maintainer authorized a new scoped release on 14 November 2026 after accepting
36
+ PR #82. Version `0.1.0-experimental.5` packages the current library/CLI and
37
+ Researcher skill 0.1.16. Earlier `.3`/`.4` candidates remain distinct; their older
38
+ CLI evidence does not establish current release behavior. Only `@n8r/surface`
39
+ is built or submitted. The source stays private and `latest` is unchanged.
40
+
41
+ This release includes self-contained CycloneDX Surface saves in the skill,
42
+ connected overviews and journals, instance-first investigation and progressive
43
+ source-access guidance. CLI save formats remain separate; bundling the skill does
44
+ not establish CLI/BOM parity. The [first-use evidence](first-use-access.md)
45
+ records useful signed-in web responses but unresolved portable delivery/helper
46
+ execution. Those limits remain; publication does not establish end-to-end web
47
+ acceptance, runtime conformance or consumer compatibility.
48
+
49
+ ### Preparation and publication
50
+
51
+ Start at the reviewed, clean release commit after Node 22/24/26 tests and installed
52
+ package checks pass. Confirm GitHub account/repository and commit author. Create
53
+ an annotated `v0.1.0-experimental.5` tag and push only that tag. It must be on `main`.
54
+ Do not reuse or move a permanent release tag.
55
+
56
+ ```sh
57
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.5 -f operation=prepare
58
+ ```
59
+
60
+ The workflow builds one fresh publishable scoped archive, records its revision and
61
+ SHA-256, retains a build artifact and creates a draft prerelease. Inspect its
62
+ `candidates.json` and archive manifest: exact version, `@n8r/surface`,
63
+ `private: false`, public registry and `experimental`. The source remains private.
64
+ Download those assets; do not rebuild between preparation and staging.
65
+
66
+ ```sh
67
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.5 -f operation=stage
68
+ ```
69
+
70
+ The existing stage-only `NPM_BOOTSTRAP_TOKEN` route requires valid package write
71
+ access. An expired credential blocks staging; renew it outside tracked files or
72
+ review trusted publishing separately. A stage is not publication. Inspect the
73
+ reported stage ID and validation state, then approve that exact stage with npm
74
+ 2FA. [npm's staged-publishing procedure](https://docs.npmjs.com/staged-publishing/)
75
+ was rechecked on 14 November 2026. After approval:
76
+
77
+ ```sh
78
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.5 -f operation=verify
79
+ ```
80
+
81
+ Independently verify registry signatures and the package's own signed provenance,
82
+ workflow/tag identity, source commit and archive digest. Exercise the isolated
83
+ installation below on supported Node majors and a fresh-cache exact-version
84
+ npm-exec route. Attach evidence and release notes before finalizing the immutable
85
+ GitHub prerelease. Verify `immutable: true` afterward. Never promote `latest` as
86
+ part of this procedure. Failed staging/readback leaves the draft incomplete;
87
+ retain its bytes and verify existing registry state before retrying.
88
+
89
+ ### Human verification task list
90
+
91
+ Maintainer preparation: provide the retained scoped archive from the draft release
92
+ in a temporary directory, with Node 22/24/26 and npm installed. Run from that
93
+ directory; `ARCHIVE` below is the archive's absolute path. No normal installation,
94
+ Codex sign-in or research vault changes are needed.
95
+
96
+ - [ ] Create an isolated consumer and install the archive:
97
+
98
+ ```sh
99
+ export ARCHIVE="$PWD/n8r-surface-0.1.0-experimental.5-scoped.tgz"
100
+ mkdir consumer
101
+ cd consumer
102
+ npm init --yes
103
+ npm install --ignore-scripts --no-audit --no-fund --package-lock=false "$ARCHIVE"
104
+ node --input-type=module -e 'import {decode} from "@n8r/surface"; console.log(typeof decode)'
105
+ ./node_modules/.bin/n8r-surface --version
106
+ ```
107
+
108
+ Expect exits 0, `function`, and `n8r-surface 0.1.0-experimental.5`.
109
+ - [ ] Inspect `node_modules/@n8r/surface/plugins/n8r-surface/plugin.json`.
110
+ Expect skill version `0.1.16`. This does not install a plugin into a web host.
111
+ - [ ] Exercise closed-input startup in an isolated home:
112
+
113
+ ```sh
114
+ mkdir empty-home
115
+ env HOME="$PWD/empty-home" USERPROFILE="$PWD/empty-home" ./node_modules/.bin/n8r-surface </dev/null
116
+ echo "$?"
117
+ ls -A empty-home
118
+ ```
119
+
120
+ Expect setup guidance, exit **1**, and an empty home. Missing imports, wrong
121
+ versions or home writes fail. After publication, repeat installation using
122
+ `@n8r/surface@0.1.0-experimental.5` in a new consumer and compare the result.
123
+ - [ ] Report **Pass / Fail / Blocked**, Node/npm versions, archive digest and CLI
124
+ output. Missing archive/authentication is Blocked; any unexpected behavior is
125
+ Fail. Keep evidence, leave the consumer and remove only these temporary files.
126
+
127
+ Agent rehearsal and human acceptance are separate. Build/registry evidence will
128
+ be attached to the release; this preparation document does not assert publication.
129
+
130
+ ## Retained preparation procedure
131
+
132
+ The procedure below records the original dual-package preparation. Its two-name
133
+ acceptance requirement was superseded by the maintainer's scoped-only decision.
134
+ Do not rerun it for the released version. The current workflow targets scoped experimental.5; the historical commands
135
+ below are retained as first-release evidence only. Future
136
+ releases require updated version guards, reviewed
137
+ authentication configuration, and a new permanent version/tag. Trusted publishing
138
+ has not been exercised; this release used stage-only token authentication and
139
+ maintainer 2FA approval.
140
+
141
+ ## User outcome and starting evidence
142
+
143
+ Given private local candidates and no verified registry versions, the maintainer
144
+ can prepare both publishable archives from one reviewed commit, publish their
145
+ retained bytes with provenance, and independently install either exact version.
146
+ The source remains private to prevent publishing the checkout accidentally.
147
+
148
+ The original installed/candidate checks passed, but those archives were private.
149
+ Before this increment, `npm whoami` returned E401 and both names returned E404.
150
+ After interactive login, npm identified the intended account and confirmed its
151
+ `n8r` owner role. Both names still returned E404. These responses do not prove
152
+ name availability or successful first publication. At that starting point, no placeholder existed.
153
+
154
+ ## Maintainer preparation
155
+
156
+ 1. Review and merge the release-preparation PR after acceptance. Merging is a
157
+ separate maintainer decision. The workflow must exist on the default branch.
158
+ 2. Use an authorized npm account with `n8r` organization rights and permission
159
+ to create the unscoped package. For this first release, the selected route is
160
+ a short-lived granular npm token with package **read/write (stage only)**
161
+ permission covering `@n8r/surface` and the new unscoped `n8r-surface`.
162
+ Selecting package `n8r` or scope `@injectionator` is insufficient. If npm
163
+ cannot select an unpublished unscoped name, temporarily use all-packages
164
+ coverage; organization-management permissions are unnecessary. Store it only as
165
+ repository Actions secret `NPM_BOOTSTRAP_TOKEN`. Never put it in a command,
166
+ issue, report or committed file. npm account 2FA remains enabled.
167
+ 3. Enable **Settings → General → Releases → Enable release immutability** before
168
+ creating the draft. An administrator may be needed; an API 404 under a
169
+ non-admin account is not proof the setting is disabled.
170
+ 4. Verify all required Node 22/24/26 checks on the reviewed revision. From its
171
+ clean checkout, create an annotated `v0.1.0-experimental.2` tag and push only
172
+ that tag. Never move or reuse it. Record its full commit SHA.
173
+
174
+ References checked 5 November 2026: [npm token setup](https://docs.npmjs.com/creating-and-viewing-access-tokens/),
175
+ [provenance](https://docs.npmjs.com/generating-provenance-statements/),
176
+ [trusted publishing](https://docs.npmjs.com/trusted-publishers/), and
177
+ [release immutability](https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/establish-provenance-and-integrity/prevent-release-changes).
178
+ Trusted publishers require existing packages. npm offered stage-only tokens;
179
+ the maintainer explicitly approved staged first publication, including the
180
+ public `0.0.0-stage` placeholders it creates. The actual release versions require
181
+ maintainer approval with 2FA. See [npm staged publishing](https://docs.npmjs.com/staged-publishing/).
182
+
183
+ ## Human check before publication
184
+
185
+ Prerequisites: the PR checkout with dependencies installed, Node 22/24/26, npm,
186
+ Git and POSIX `tar`. Staging uses npm 11.20.0 (staging requires 11.15+). Start in the repository root. These steps require no npm
187
+ write credentials and do not alter normal settings or installations.
188
+
189
+ - Create fresh publishable candidates:
190
+
191
+ ```sh
192
+ release_run=$(mktemp -d)
193
+ npm run pack:candidates -- "$release_run/packages" --publishable
194
+ tar -xOf "$release_run/packages/scoped/n8r-surface-0.1.0-experimental.2.tgz" package/package.json
195
+ ```
196
+
197
+ Expect exit 0, version `0.1.0-experimental.2`, name `@n8r/surface`,
198
+ `private: false`, public npm registry/access and tag `experimental`.
199
+ The source `package.json` must still have `private: true`.
200
+ - Install and run the preferred archive:
201
+
202
+ ```sh
203
+ mkdir "$release_run/consumer"
204
+ cd "$release_run/consumer"
205
+ npm install --offline --ignore-scripts --no-audit --no-fund --package-lock=false "$release_run/packages/scoped/n8r-surface-0.1.0-experimental.2.tgz"
206
+ node --input-type=module -e 'import {decode} from "@n8r/surface"; console.log(typeof decode)'
207
+ ./node_modules/.bin/n8r-surface --version
208
+ mkdir "$release_run/home"
209
+ HOME="$release_run/home" USERPROFILE="$release_run/home" ./node_modules/.bin/n8r-surface </dev/null
210
+ echo "$?"
211
+ ls -A "$release_run/home"
212
+ ```
213
+
214
+ Expect install/import/version exits 0, `function`, and
215
+ `n8r-surface 0.1.0-experimental.2`. Bare startup prints setup guidance,
216
+ exits **1**, and leaves the isolated home empty.
217
+ - Repeat in a new consumer and home directory using the `unscoped/` archive
218
+ and import `n8r-surface`. Expect identical behavior, with that installed name.
219
+ - Report **Pass / Fail / Blocked**, both CLI outputs, Node/npm versions and
220
+ candidate revision/dirty flag. Unexpected version, missing imports, or home
221
+ writes are Fail. Missing prerequisites are Blocked. Leave the consumer and
222
+ remove only the temporary directory created above after retaining evidence.
223
+
224
+ ## Prepare and stage retained artifacts
225
+
226
+ The manual [workflow](../../.github/workflows/npm-release.yml) accepts only the
227
+ annotated first-version tag, requires it to be on `main`, and checks clean source.
228
+ Preparation runs tests and both installed-package suites, builds both archives
229
+ once, retains the complete build as an Actions artifact for 90 days, and stores
230
+ the archives with `candidates.json` on a draft GitHub Release. An existing
231
+ release prevents preparation from rebuilding. Downloads and hash validation are
232
+ performed before any publication. Network access includes npm, GitHub and Sigstore;
233
+ write effects are draft release assets and, only for `stage`, npm staged versions and first-package placeholders.
234
+
235
+ From the repository root with GitHub CLI access:
236
+
237
+ ```sh
238
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.2 -f operation=prepare
239
+ gh run list --workflow npm-release.yml --limit 1
240
+ ```
241
+
242
+ Inspect the run and draft assets; record the run ID and full source revision.
243
+ Preparation must finish successfully before selecting staging:
244
+
245
+ ```sh
246
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.2 -f operation=stage
247
+ ```
248
+
249
+ The publisher reads both registry versions first. An existing version must match
250
+ retained SHA-256 and registry SHA-512 integrity and expose provenance metadata;
251
+ only absent versions are staged. Existing stages are downloaded and compared
252
+ to retained SHA-256 before they are reused; duplicate stages or differing bytes
253
+ stop the run. Non-404 lookup errors stop the run. The
254
+ workflow never finalizes the GitHub Release and never promotes `latest`.
255
+ Provenance metadata presence is not cryptographic verification.
256
+
257
+ On partial failure, retain the draft and its exact assets. Retry **stage** only
258
+ after diagnosing the failure; never rerun preparation or rebuild a published
259
+ version. Existing bytes that differ require a new approved version for both
260
+ packages. If draft creation succeeds but an upload fails, recover missing assets
261
+ from the original run's `npm-release-COMMIT_SHA` Actions artifact. Download it
262
+ with `gh run download RUN_ID -n npm-release-COMMIT_SHA -D NEW_DIRECTORY`, verify
263
+ `candidates.json` revision and each archive SHA-256, and upload only missing
264
+ assets without `--clobber`. Run `check:release` before retrying staging.
265
+ Keep a durable independent copy before the 90-day retention expires. If the
266
+ original bytes cannot be recovered, stop; do not regenerate them.
267
+
268
+ ## Approve each staged version with 2FA
269
+
270
+ Open npm's **Staged Packages** page as the authorized maintainer. For each of
271
+ `@n8r/surface` and `n8r-surface`, inspect version `0.1.0-experimental.2`, tag
272
+ `experimental`, the workflow's stage ID and downloaded bytes. Approve each with
273
+ 2FA. Alternatively run `npm stage approve STAGE_ID` in your authenticated terminal.
274
+ These actions publish the real versions; the placeholders are not acceptance.
275
+
276
+ Then run the read-only verification operation:
277
+
278
+ ```sh
279
+ gh workflow run npm-release.yml --ref v0.1.0-experimental.2 -f operation=verify
280
+ ```
281
+
282
+ Expect success only when both exact registry versions match retained bytes and
283
+ expose provenance metadata. This operation cannot stage or approve anything.
284
+
285
+ ## Independent registry acceptance and finalization
286
+
287
+ For each package, use a separate fresh consumer outside the checkout. Install
288
+ its exact version with lifecycle scripts disabled, run `npm audit signatures`,
289
+ read the installed name/version, import `decode`, run `--version` and the isolated
290
+ closed-input startup above. Also exercise the two explicit one-off routes:
291
+
292
+ ```sh
293
+ npm exec --yes --package=@n8r/surface@0.1.0-experimental.2 -- n8r-surface --version
294
+ npm exec --yes --package=n8r-surface@0.1.0-experimental.2 -- n8r-surface --version
295
+ ```
296
+
297
+ Both must print `n8r-surface 0.1.0-experimental.2` and exit 0. Download each
298
+ registry tarball and compare its bytes/digests with the draft assets. Inspect
299
+ its own provenance attestation, including source repository, full commit,
300
+ workflow identity and subject digest; an attested dependency is insufficient.
301
+ Record registry `dist.integrity`, publication and install results independently.
302
+
303
+ After both routes pass, configure trusted publishing separately for both names:
304
+ GitHub owner `injectionator`, repository `n8r-surface`, workflow `npm-release.yml`,
305
+ no environment, permission to stage. Keep maintainer 2FA approval for promotion. A new configuration must succeed within
306
+ two days; do not configure it long before its next use. Verify the configuration
307
+ and its first actual OIDC publication before claiming it works. Remove the
308
+ bootstrap secret and revoke its token when no longer needed. A future version
309
+ requires a reviewed update to the deliberate first-version guards.
310
+
311
+ Attach independent evidence and final release notes, then finalize the draft
312
+ with prerelease true and latest false. Read it back with `check:release` and
313
+ require `immutable: true`. Finalization remains blocked on failed registry,
314
+ provenance, identity or immutability checks. Record **Pass / Fail / Blocked** with
315
+ both package results; local rehearsals do not establish a completed release.
@@ -0,0 +1,327 @@
1
+ # Product direction: security investigation of composed AI systems
2
+
3
+ Captured 11 November 2026; strategic context expanded 12 November 2026.
4
+ Documentation scope:
5
+ [#64](https://github.com/injectionator/n8r-surface/issues/64).
6
+ This records the user-established direction and a proposed smallest demonstration.
7
+ The demonstration scope below is a recommendation for review, not authorization
8
+ to implement, deploy or test a system. No demonstration results are claimed here.
9
+
10
+ The next proposed increment is the [Joe/Maya design and delivery sequence](../superpowers/specs/2026-11-14-joe-maya-proof-design.md):
11
+ recover the existing lab, revisit the same evolving target, and connect a bounded
12
+ policy/evaluation/observation proof to retained Surface history. Surface is the
13
+ independently useful public node; target operations and harness authoring/execution
14
+ belong to n8r-runtime and n8r-probe respectively, initially private Labs modules.
15
+ Surface discovers Promptfoo, alternatives and Langfuse integrations without
16
+ operating them. Prompt injection remains a test family within wider AI surface
17
+ security; the original inline sidecar is deferred. Developing the integrated proof
18
+ does not make Labs a prerequisite or release its private components.
19
+
20
+ ## Strategic context
21
+
22
+ The agreed destination is a practical [AI Surface security assurance framework](security-assurance-strategy.md)
23
+ and professional service: policy and assurance levels connect to controls,
24
+ implementation guidance, static/live assessment and observable verification.
25
+ The primary reader is the consultant advising an engineer or architect and the
26
+ system owner. Discovery and this first demonstration are increments toward that
27
+ destination; they do not constitute the whole framework. The strategy maps existing
28
+ work and proposed milestones, including assessment coverage and scoring decisions.
29
+
30
+ ## Why and for whom
31
+
32
+ People use AI to assemble software and services into agentic systems they did
33
+ not architect and may not understand. Others inherit those systems or must make
34
+ a release decision about them. They may not know which security questions to ask.
35
+ Firing inputs at an interface and hoping for a useful score does not explain
36
+ where authority is exercised, which controls exist or what downstream effects
37
+ occurred. Experienced investigators may instead arrive with a precise question.
38
+
39
+ The product direction is professional security investigation: discover enough of
40
+ the system to identify consequential questions, establish what the evidence says,
41
+ and help the owner make and verify a corrective change. The first value should
42
+ be an understandable, reproducible security finding and demonstrated improvement,
43
+ with legitimate use preserved. Findings support a release decision; they do not
44
+ certify that an entire system is secure.
45
+
46
+ The AI Surface Model makes this work traceable across components, relationships,
47
+ configurations and revisions. It remains independently usable; security
48
+ investigation is a product use of the model, not a restriction on its meaning.
49
+ The installed n8r-surface skill in Codex is the discovery entry point. CLI breadth,
50
+ a general telemetry backend and a larger schema are not outcomes in themselves.
51
+
52
+ ## Presentation: brief by default, explanation within reach
53
+
54
+ Default to a short, at-a-glance view with colour where the host supports it,
55
+ recognizable short names and plain-language status labels. Show the relevant
56
+ components and connections, the main finding or question, material uncertainty
57
+ and the next useful action. Short names must remain unambiguous within the view
58
+ and resolve to the same full names and stable identities in expanded detail.
59
+
60
+ Keep “Explain this” or “More” one click away where interactive controls are
61
+ available, or one natural-language request away in Codex. Explain the selected
62
+ item in context: what it means, why it matters, the supporting evidence and its
63
+ limits. Evidence links should lead to the underlying sources or retained records.
64
+ Expansion uses the same claims and revisions as the summary; fetching new evidence
65
+ is a separate investigation and must be identified as such.
66
+
67
+ Users who prefer a longer explanation can request it directly. Honour their
68
+ chosen level of detail throughout the current conversation. Persistent preferences
69
+ across chats are a later implementation choice, not an existing capability claim.
70
+
71
+ Colour reinforces text and symbols; it is never the only carrier of meaning.
72
+ Provide a readable plain-text fallback and keep labels consistent across views.
73
+ Evidence status (possible, configured, observed, unknown) is distinct from a
74
+ security result (for example, a demonstrated unauthorized read). Colour must not
75
+ turn “configured” into “safe”, or a passing scoped check into whole-system approval.
76
+ Material gaps and conditions stay visible in the compact view; longer reasoning,
77
+ source excerpts and investigation history can sit behind expansion.
78
+
79
+ ## Investigations we bring to the system
80
+
81
+ For broad intake, the investigator selects relevant questions from discovered
82
+ boundaries rather than requiring the owner to identify a vulnerability first.
83
+ A specific user question can narrow the same process. Each investigation needs
84
+ an intended rule with a stated basis: owner policy, documented contract or an
85
+ explicit hypothesis awaiting confirmation.
86
+
87
+ | Family | Questions to investigate |
88
+ | --- | --- |
89
+ | Enforcement | Where is a promised rule not enforced? Where is a rule enforced in one component but only assumed in another? Which security assumptions are never checked? |
90
+ | Dependencies and composition | Which undocumented behaviours matter, and what happens if they change? Which individually permitted operations become unsafe when chained? |
91
+ | Identity and access paths | Can different paths to the same object confer different permissions? Can object ownership or identity be rebound without the required checks? |
92
+ | Failures and effects | Can rejected or failed requests still cause effects? Can a transaction roll back while external effects survive? |
93
+ | Ordering and lifecycle | Do checks depend on event order? Does access survive deletion or revocation? Can unauthorized users undo transitions? Can contradictory states enable forbidden operations? |
94
+
95
+ Component configuration, internal composition and external behaviour provide
96
+ complementary evidence. There is no prerequisite to finish auditing every
97
+ component before examining their composition. Prompt injection is one possible
98
+ trigger; direct requests, alternate paths and state transitions can also reveal
99
+ an authority failure. A service account alone does not establish a vulnerability.
100
+
101
+ ## Start with resources, not an assumed deployed system
102
+
103
+ A user can bring local folders, repositories, websites and documentation URLs
104
+ into a selected workspace, then add sources as the conversation develops. The
105
+ skill follows relevant evidence as a graph, preserving source identity and
106
+ unresolved endpoints. Repository boundaries are not necessarily component
107
+ boundaries: several repositories may contribute to one system, and one repository
108
+ may describe several components or alternatives.
109
+
110
+ Consider a synthetic three-repository case: a conventional HR application, a
111
+ separate chat integration and a separate MCP interface. The HR application alone
112
+ need not contain AI. The chat and MCP repositories are additional sources for a
113
+ possible AI composition, not proof that such a composition exists. Whether the
114
+ chat actually calls MCP, calls the HR API directly or supports alternatives must
115
+ come from evidence. Include the model/provider and relevant identities when
116
+ supported; do not invent an AI node inside the HR application.
117
+
118
+ Documentation or a blog post may describe a possible connection. Record its
119
+ source, applicability, prerequisites and uncertainty; follow available code and
120
+ configuration to investigate it. An external reference is a lead, not automatic
121
+ permission to access private resources or execute imported instructions.
122
+
123
+ | Evidence available | Useful result | Claim that must not follow |
124
+ | --- | --- | --- |
125
+ | Documentation or code describing a supported option | Capability Surface with conditions, alternatives and evidence | These components are integrated for this user. |
126
+ | User intent to combine components | Dated selection or proposed composition, plus work still needed | Intent is an instance binding. |
127
+ | Explicit instance configuration | Bound Surface for evidenced relationships | Configured means deployed, reachable or exercised. |
128
+ | Dated inspection or execution evidence | Scoped observation of state or behaviour, linked to the applicable setup | One observed path establishes complete coverage. |
129
+ | Missing or conflicting evidence | Explicit gaps, conflicts and the next evidence needed | Missing evidence proves absence or an unbound relationship. |
130
+
131
+ These are claim distinctions, not a single maturity label for the entire graph.
132
+ A description may contain configured relationships alongside unresolved or
133
+ possible ones. Keep their meanings visible at the relationship and claim level.
134
+ Existing [Capability/Bound semantics](surface-descriptions.md) remain authoritative.
135
+
136
+ ### Recommended boundary for the first demonstration
137
+
138
+ Accept unintegrated sources for discovery. Return a useful map of possibilities,
139
+ security questions, prerequisites and integration work remaining. Do not make
140
+ integration or deployment a condition for using the skill.
141
+
142
+ Require an already integrated, authorized test environment for the runtime part
143
+ of the first demonstration. Configuration alone is not sufficient: establish the
144
+ actual path and usable test access before making runtime claims. If it is missing,
145
+ finish the discovery output and mark runtime proof Blocked, with a specific handoff
146
+ of what must be supplied. Discovery success is not completion of the full demo.
147
+
148
+ Assisted integration, deployment and arbitrary component replacement are later
149
+ work. For this first proof a maintainer supplies a controlled running setup and
150
+ applies a narrow defensive change manually. This bounds execution work without
151
+ excluding users who are still discovering what they could assemble.
152
+
153
+ ## Smallest end-to-end value demonstration
154
+
155
+ Use one synthetic HR composition with three source repositories: domain service,
156
+ chat interface and MCP adapter. It exposes one record-read operation and uses
157
+ synthetic records for two users. The fixture has a known reproducible authority
158
+ failure and a minimal corrective change, retained in a separate maintainer oracle.
159
+ The investigator receives ordinary source and system access, not the expected
160
+ finding, faulty location or fix. This demonstrates discovery on a controlled case,
161
+ not general vulnerability detection accuracy or a finding about a real HR product.
162
+
163
+ The intended policy is supplied as normal business context: each employee can
164
+ read their own restricted record, but cannot read another employee's record.
165
+ This provides a testable rule without supplying the security diagnosis.
166
+ The fixture's exact technology and enforcement location are builder choices;
167
+ choose the smallest setup that exposes the real cross-component path. A scripted
168
+ runner or developer-written findings cannot substitute for the installed skill.
169
+
170
+ **State X:** an identified installed skill in Codex, an established local workspace,
171
+ three permitted source repositories with known revisions, and docs URLs or local
172
+ snapshots. Initially the investigator receives the domain application source and
173
+ business policy. Chat/MCP sources and instance evidence arrive in later turns.
174
+ A maintainer has a running isolated composition, test identities and synthetic
175
+ data ready for the runtime handoff; source-only discovery must not infer that fact.
176
+
177
+ **Input Y:** the user asks what has been built and where its security boundaries
178
+ might fail, then adds the other sources, configuration and permitted test access.
179
+ They request saved output and fresh-chat continuation. The investigator proposes
180
+ a bounded test based on its discoveries. The owner authorizes its execution on
181
+ the fixture, and a maintainer later applies the defensive change.
182
+
183
+ **Outcome Z:** the user receives an evidence-backed composition, a discovered
184
+ security question, a reproduced unauthorized read through the composed path,
185
+ a supported explanation of the enforcement failure and a before/after comparison
186
+ showing denial after the change while the authorized read still works. Saved
187
+ artifacts can be reopened without losing identities, gaps or the original result.
188
+
189
+ ### Demonstration task list
190
+
191
+ These are proposed acceptance interactions, not rehearsed passing behaviour.
192
+ Use the [installed-skill setup](researcher-skill.md) and
193
+ [workspace guide](workspace.md); the maintainer supplies the fixture and access.
194
+
195
+ - [ ] Open the prepared workspace in Codex with the installed skill. Ask:
196
+ “Explore this HR application folder and its documentation. Tell me what is
197
+ known about its AI connections and security boundaries. Do not assume it has
198
+ AI built in.” Expect a bounded account with source evidence and unknowns;
199
+ no invented internal AI component.
200
+ - [ ] Add the chat and MCP repository folders and documentation URLs. Ask:
201
+ “Include these sources, follow the relevant links between them, and save a
202
+ Surface brief explaining possible integrations, security questions and what
203
+ remains to be configured or established.” Expect cross-source relationships,
204
+ prerequisites and alternatives without an unsupported deployed-system claim.
205
+ - [ ] Supply sanitized instance configuration. Ask:
206
+ “Show which relationships this configuration binds, what is still unknown,
207
+ and which security question most needs investigation. Save a successor.”
208
+ Expect traceable configured relationships and an independently derived question
209
+ about authority, without assuming runtime use or copying credentials.
210
+ - [ ] Supply the fixture's permitted test access and approve the proposed bounded
211
+ test through the separately identified execution owner. Expect a legitimate
212
+ read and a prohibited cross-user read to be exercised through the composed
213
+ interface, with actual downstream requests, decisions and results inspected.
214
+ A model refusal alone is not evidence that the tool did not access data.
215
+ - [ ] Have the maintainer apply the narrow defence. Repeat the same tests against
216
+ the identified successor setup. Expect the prohibited fresh read to be denied
217
+ by effective enforcement and the legitimate read to remain available. Inspect
218
+ downstream evidence, not only chat wording. Use records not already disclosed
219
+ in conversation when checking fresh retrieval.
220
+ - [ ] Save the evidence-linked result, then open a fresh Codex chat. Ask:
221
+ “Reopen this investigation. Explain what was possible, configured and actually
222
+ demonstrated before and after the change, and what remains unproved.” Expect
223
+ stable identities, distinct setup/run references, accessible evidence and
224
+ unchanged predecessor artifacts.
225
+ - [ ] Inspect the default brief. Expect recognizable short names, concise text
226
+ labels, visible material gaps and colour where supported. Ask: “Explain this
227
+ connection and show its evidence.” Expect a contextual explanation tied to the
228
+ same identities and revisions, within one request; a UI control may provide
229
+ the same action. Ask for a longer explanation, then return to the brief. Expect
230
+ consistent claims and readable meaning without colour. Record whether both
231
+ presentation levels help the tester understand the finding.
232
+ - [ ] Report **Pass / Fail / Blocked**, artifact links, failed or blocked steps and
233
+ whether the result explains an actionable security problem. Generated wording
234
+ and identifiers may vary. Unsupported integration claims, a missed seeded
235
+ failure, missing runtime evidence, broken legitimate access, lost history or
236
+ sensitive-data leakage fail this demonstration. Missing prerequisites block it;
237
+ they are not a passing negative security result.
238
+
239
+ ### Maintainer preparation and independent verification
240
+
241
+ Pin fixture revisions, initial configuration and policy, installed skill bytes,
242
+ host/model/version and test environment. Keep the oracle separate from investigator
243
+ inputs and record everything disclosed. Fresh chats alone do not prove isolation;
244
+ record source/tool access and any contamination. Before implementation, attempt
245
+ this path through the current installed skill or record the exact unavailable
246
+ prerequisite. No such attempt is claimed by this documentation change.
247
+
248
+ An independent reviewer compares consequential graph claims with source locations
249
+ and the runtime finding with the oracle and underlying evidence. Retain actual
250
+ inputs, expected policy, observed outputs, effective identities, authorization
251
+ decisions and downstream data access. Correlate these with run and setup identities;
252
+ record conflicts, unavailable telemetry and inference separately from observation.
253
+ Read saved files independently and compare predecessor hashes after continuation.
254
+ Keep raw research and telemetry outside this public repository; publish only
255
+ permitted sanitized summaries. Synthetic fixtures must contain no real HR data.
256
+
257
+ Expected state changes are new workspace research/Surface artifacts, fixture test
258
+ sessions and a separately recorded defensive configuration/code revision. The read
259
+ scenario does not require business-data mutation. Preserve source and prior
260
+ artifact bytes; record any fixture-generated audit/session state. Cleanup resets
261
+ only owned test state after evidence retention and explicit cleanup authorization.
262
+ Agent rehearsal, independent technical checks and human acceptance are separate.
263
+
264
+ ## What n8r-surface needs to support
265
+
266
+ The current skill already instructs graph-first research, incremental source
267
+ intake, evidence identity, explicit gaps and continuation. Capability/Bound
268
+ artifacts have a bounded helper and contract. These mechanisms are foundations;
269
+ they do not establish that this three-repository demonstration passes. Verify the
270
+ installed path before deciding which implementation changes are necessary.
271
+
272
+ | Needed outcome | Existing basis and next proof |
273
+ | --- | --- |
274
+ | One investigation across folders, repositories and URLs | Exercise incremental intake and follow-up through the installed skill; preserve source revisions, access limits and unresolved external links. |
275
+ | A useful graph without an integrated system | Reuse Capability semantics; verify no invented AI inside the domain application and no promotion of docs/blog claims into bindings. |
276
+ | Evidence of configured composition | Reuse Bound semantics and safe configuration references; verify mixed supported/configured/unknown relationships and distinct role versus instance identities. |
277
+ | Questions selected from discovered boundaries | Demonstrate an investigator-generated authority question with rationale and policy basis, rather than a user-supplied diagnosis. This needs explicit acceptance evidence. |
278
+ | A runtime handoff another actor can execute | Provide the relevant graph identities, policy, proposed test, required observation points and gaps. Execution remains outside the current read-only skill. |
279
+ | Evidence-linked findings and before/after comparison | Define the smallest linkage between claims, source revisions, effective setups, runs and retained evidence. Start with readable working records where needed; do not mislabel them as validated structured Observed Surfaces. |
280
+ | Brief and expanded explanations | Verify concise defaults, unambiguous short names, accessible status cues and one-request explanation/evidence access in the installed host. Material uncertainty must survive both views. |
281
+ | Durable continuation | Exercise saved artifact readback and fresh-chat reopening with stable identities, predecessor history and explicit remaining work. |
282
+
283
+ Observed Surface delivery is currently deferred in the
284
+ [description contract](surface-descriptions.md). This proposal calls for a bounded
285
+ runtime-evidence handoff and linkage, not a silent expansion of that contract or
286
+ permission for the skill to launch tests. Before implementing this part, specify
287
+ the execution owner and interface, evidence references, privacy/retention rules
288
+ and any versioned contract changes. No new command or output format is introduced
289
+ by this document. Update conversational intents and their verification together
290
+ if behaviour is subsequently changed.
291
+
292
+ ## Observability and consumer boundary
293
+
294
+ For this demonstration, collect only enough evidence to correlate the initiating
295
+ user, proposed and executed tool request, effective downstream identity,
296
+ authorization decision, returned data and relevant effects with the exact run and
297
+ setup. A prompt/response trace alone cannot prove downstream enforcement. State
298
+ what was not observed; missing telemetry must not become a claim of no effect.
299
+
300
+ An observability sink is a candidate implementation, not yet a prerequisite.
301
+ Evaluate existing telemetry, log references and narrow collection against this
302
+ case before choosing adapters or storage. Langfuse and OTEL are possible integration
303
+ directions, not evaluated compatibility claims. A general backend, continuous
304
+ collection and broad adapter support are outside the smallest proof.
305
+
306
+ n8r-surface owns discovery descriptions and the meanings needed for evidence
307
+ handoff. Test execution, resource configuration and later component swapping
308
+ belong to the consumer integration boundary, with n8r-labs application design
309
+ kept in its separate repository. A Lab contains Experiments; an Experiment asks
310
+ its Lab for setup, and the Lab owns configuration and local bindings. The first
311
+ manual consumer rehearsal neither requires Labs automation nor establishes Labs
312
+ compatibility. No n8r-labs implementation is specified here.
313
+
314
+ ## Delivery decisions and remaining work
315
+
316
+ The recommended first scope is one composed path, one policy, two test identities,
317
+ one demonstrated authority failure and one defensive change, plus a legitimate-use
318
+ check and saved continuation. A broad audit, all investigation families, automated
319
+ integration, component substitution and a release score are outside this increment.
320
+
321
+ The next useful work is to select the permitted fixture and execution owner, then
322
+ rehearse source intake through the installed skill and record gaps. Fix only gaps
323
+ that block this proof; retain existing behaviour that already satisfies it.
324
+ No target has been selected, no runtime test has been run and no implementation
325
+ has been authorized by capturing this direction. The proposed integrated-runtime
326
+ boundary and fixture choice remain reviewable decisions. Existing acceptance and
327
+ release work is not automatically closed or reprioritized by this document.