@n8r/surface 0.1.0-experimental.2 → 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 (118) hide show
  1. package/README.md +30 -4
  2. package/dist/cli.js +174 -22
  3. package/dist/codec.d.ts +2 -0
  4. package/dist/codec.js +22 -7
  5. package/dist/codex.d.ts +1 -1
  6. package/dist/codex.js +26 -10
  7. package/dist/contracts.d.ts +108 -2
  8. package/dist/cyclonedx-schemas/bom-1.7.schema.json +6700 -0
  9. package/dist/cyclonedx-schemas/cryptography-defs.schema.json +576 -0
  10. package/dist/cyclonedx-schemas/jsf-0.82.schema.json +240 -0
  11. package/dist/cyclonedx-schemas/spdx.schema.json +786 -0
  12. package/dist/cyclonedx-validation.d.ts +1 -0
  13. package/dist/cyclonedx-validation.js +45 -0
  14. package/dist/html.js +27 -3
  15. package/dist/recent.d.ts +9 -0
  16. package/dist/recent.js +71 -0
  17. package/dist/revisions.js +42 -0
  18. package/dist/skill-artifacts-cli.d.ts +1 -0
  19. package/dist/skill-artifacts-cli.js +13 -0
  20. package/dist/skill-artifacts.d.ts +15 -0
  21. package/dist/skill-artifacts.js +184 -0
  22. package/dist/skill-cyclonedx.d.ts +26 -0
  23. package/dist/skill-cyclonedx.js +214 -0
  24. package/dist/skill-presentation.d.ts +10 -0
  25. package/dist/skill-presentation.js +108 -0
  26. package/dist/skill-surface-cli.d.ts +1 -0
  27. package/dist/skill-surface-cli.js +37 -0
  28. package/dist/skill-surface-store.d.ts +7 -0
  29. package/dist/skill-surface-store.js +126 -0
  30. package/dist/surface-bom.d.ts +73 -0
  31. package/dist/surface-bom.js +139 -0
  32. package/dist/surface-draft.d.ts +6 -3
  33. package/dist/surface-draft.js +20 -3
  34. package/dist/surface-instructions.d.ts +2 -1
  35. package/dist/surface-instructions.js +10 -1
  36. package/dist/surface-overview.d.ts +15 -0
  37. package/dist/surface-overview.js +86 -0
  38. package/dist/surface-store.d.ts +5 -7
  39. package/dist/surface-store.js +34 -2
  40. package/dist/surface-view.d.ts +3 -0
  41. package/dist/surface-view.js +50 -0
  42. package/dist/validate.js +298 -0
  43. package/docs/n8r-surface/cli-bundles.md +72 -0
  44. package/docs/n8r-surface/command-outcomes.md +151 -4
  45. package/docs/n8r-surface/contracts.md +10 -0
  46. package/docs/n8r-surface/critical-path.md +21 -0
  47. package/docs/n8r-surface/first-use-access.md +143 -0
  48. package/docs/n8r-surface/first-use-overview.md +262 -0
  49. package/docs/n8r-surface/getting-started.md +55 -88
  50. package/docs/n8r-surface/guided-journey-verification.md +137 -0
  51. package/docs/n8r-surface/implementation-decisions.md +14 -14
  52. package/docs/n8r-surface/instance-first-research.md +209 -0
  53. package/docs/n8r-surface/npm-distribution.md +39 -69
  54. package/docs/n8r-surface/npm-release.md +141 -14
  55. package/docs/n8r-surface/product-direction.md +327 -0
  56. package/docs/n8r-surface/researcher-skill.md +105 -51
  57. package/docs/n8r-surface/security-assurance-strategy.md +267 -0
  58. package/docs/n8r-surface/skill-bom-verification.md +142 -0
  59. package/docs/n8r-surface/skill-cyclonedx-verification.md +144 -0
  60. package/docs/n8r-surface/skill-cyclonedx.md +85 -0
  61. package/docs/n8r-surface/skill-manual.md +129 -0
  62. package/docs/n8r-surface/skill-surface-artifacts.md +234 -0
  63. package/docs/n8r-surface/skill-usefulness-verification.md +135 -0
  64. package/docs/n8r-surface/skill-workspace-automation.md +359 -0
  65. package/docs/n8r-surface/surface-description-contract.md +224 -0
  66. package/docs/n8r-surface/surface-descriptions.md +173 -0
  67. package/docs/n8r-surface/surface-relationships.md +231 -0
  68. package/docs/n8r-surface/tester-candidate.md +158 -0
  69. package/docs/n8r-surface/versioning.md +55 -66
  70. package/docs/n8r-surface/workspace-human-check.md +101 -0
  71. package/docs/n8r-surface/workspace-installation.md +68 -0
  72. package/docs/n8r-surface/workspace-verification.md +350 -0
  73. package/docs/n8r-surface/workspace.md +83 -0
  74. package/examples/researcher/README.md +8 -0
  75. package/examples/researcher/cyclonedx/configured/README.md +7 -0
  76. package/examples/researcher/cyclonedx/configured/manifest.json +10 -0
  77. package/examples/researcher/cyclonedx/configured/mapping.json +323 -0
  78. package/examples/researcher/cyclonedx/configured/surface-records.json +1275 -0
  79. package/examples/researcher/cyclonedx/configured/surface.cdx.json +79 -0
  80. package/examples/researcher/descriptions/README.md +29 -0
  81. package/examples/researcher/descriptions/bound-r1.json +141 -0
  82. package/examples/researcher/descriptions/bound-r2.json +153 -0
  83. package/examples/researcher/descriptions/capability.json +167 -0
  84. package/examples/researcher/descriptions/research-r1.json +153 -0
  85. package/examples/researcher/descriptions/research-r2.json +157 -0
  86. package/examples/researcher/descriptions/sources.md +24 -0
  87. package/examples/researcher/relationships/README.md +34 -0
  88. package/examples/researcher/relationships/bound-r1.json +346 -0
  89. package/examples/researcher/relationships/bound-r2.json +358 -0
  90. package/examples/researcher/relationships/capability.json +325 -0
  91. package/examples/researcher/relationships/config/assistant.env.example +4 -0
  92. package/examples/researcher/relationships/research-r1.json +300 -0
  93. package/examples/researcher/relationships/research-r2.json +304 -0
  94. package/examples/researcher/relationships/sources.md +38 -0
  95. package/examples/researcher/surface-bom/README.md +17 -0
  96. package/examples/researcher/surface-bom/initial.cdx.json +188 -0
  97. package/package.json +1 -1
  98. package/plugins/n8r-surface/.codex-plugin/plugin.json +2 -2
  99. package/plugins/n8r-surface/LICENSING.md +3 -0
  100. package/plugins/n8r-surface/plugin.json +2 -2
  101. package/plugins/n8r-surface/skills/research/SKILL.md +79 -38
  102. package/plugins/n8r-surface/skills/research/references/artifacts.md +152 -0
  103. package/plugins/n8r-surface/skills/research/references/cyclonedx.md +207 -0
  104. package/plugins/n8r-surface/skills/research/references/discovery-map.md +20 -2
  105. package/plugins/n8r-surface/skills/research/references/examples/bound-r1.json +346 -0
  106. package/plugins/n8r-surface/skills/research/references/examples/capability.json +325 -0
  107. package/plugins/n8r-surface/skills/research/references/examples/research-r1.json +300 -0
  108. package/plugins/n8r-surface/skills/research/references/examples/surface.cdx.json +188 -0
  109. package/plugins/n8r-surface/skills/research/references/first-use-access.md +97 -0
  110. package/plugins/n8r-surface/skills/research/references/first-use-overview.md +101 -0
  111. package/plugins/n8r-surface/skills/research/references/instance-first.md +125 -0
  112. package/plugins/n8r-surface/skills/research/references/working-notes.md +6 -1
  113. package/plugins/n8r-surface/skills/research/references/workspace.md +89 -0
  114. package/plugins/n8r-surface/skills/research/scripts/THIRD-PARTY-NOTICES.txt +273 -0
  115. package/plugins/n8r-surface/skills/research/scripts/artifacts.mjs +8348 -0
  116. package/plugins/n8r-surface/skills/research/scripts/cyclonedx.mjs +28113 -0
  117. package/plugins/n8r-surface/skills/research/scripts/surface.mjs +27800 -0
  118. package/plugins/n8r-surface/skills/research/scripts/workspace.mjs +120 -0
@@ -0,0 +1,350 @@
1
+ # Workspace verification status
2
+
3
+ Issue [#41](https://github.com/injectionator/n8r-surface/issues/41) adds identity
4
+ and safeguards to expected README-based baseline behavior. Code/test success is
5
+ not closure: installed-product scenarios now pass within the recorded limits;
6
+ overall PM acceptance, review readiness, merge and release remain separate.
7
+
8
+ ## Installed 0.1.8 baseline — 8 November 2026
9
+
10
+ Two separate local desktop chats exercised setup and readiness. The installed
11
+ plugin's files matched source commit `3effc41bf7e8466651722b7b4c64035f862b1901`;
12
+ exact installation provenance was unknown. SKILL.md SHA-256:
13
+ `cd38dcd85f67ca962f06d86178009308aea527c9783fa0e0a3f834f783f1ebf4`.
14
+ Host version was 26.1023.51421, build 22530. The PM reported GPT-6 Astra medium;
15
+ the chat API did not independently expose the per-run model.
16
+
17
+ Create took one turn and about 36 seconds. It created README and a research
18
+ placeholder, with no identity record or research. PM feedback: “No problems.”
19
+ Fresh-chat readiness took one turn and about 30 seconds, recovered saved purpose,
20
+ accurately stated that no findings existed and offered useful next actions without
21
+ research. No separate reopen satisfaction rating was supplied. Content bytes were
22
+ unchanged; a host Git checkpoint subtree appeared. The destination already had
23
+ `.git` at its first product listing, so a strictly empty initial state is unproved.
24
+
25
+ The future identity contract was absent, as expected in 0.1.8, not a regression.
26
+ Outcome against that new contract was not met; useful interaction and saved-context
27
+ continuation were observed strengths. Other baseline scenarios were untested.
28
+ Fresh chats were observed, but enforced denial of history/filesystem access was
29
+ not established. Private transcripts and machine paths are retained outside this
30
+ public repository; this summary contains only sanitized observations.
31
+
32
+ ## Candidate 0.1.9
33
+
34
+ Source changes implement the helper and skill guidance. All planned product
35
+ scenario outcomes passed: empty/missing creation, repeat, fresh-chat recognition,
36
+ both adoption choices, all refusals and moved identity. The chronological entries
37
+ below preserve earlier incomplete attempts and their status at the time.
38
+ No PM product acceptance, merge or release is claimed. Normal installation was
39
+ subsequently replaced with explicit PM authorization, as recorded below. CLI/Labs workspace integration and other hosts remain unverified.
40
+
41
+ ## Scenario and evidence mapping
42
+
43
+ | Canonical scenario | Deterministic supporting evidence | Product/experience evidence |
44
+ | --- | --- | --- |
45
+ | Create; missing/empty | `tests/workspace.test.mjs`: actual files, record readback and no scaffolds | Candidate empty and missing destination creation passed |
46
+ | Repeat with note | Same suite: byte-preserving reuse and unknown fields | Candidate PM repeat passed; independent hashes unchanged |
47
+ | Fresh reopen; moved identity | Same suite: separate process and moved folder inspection | Fresh-chat reopen passed after destination clarification; independent moved-folder chat passed |
48
+ | Adoption question and both choices | Same suite: no-write refusal, in-place and alternative destination | Both adoption choices passed |
49
+ | Malformed/conflicting/unsupported | Same suite: complete before/after snapshots | All three installed-product refusal trials passed |
50
+ | Interrupted setup | Same suite: publication failure and no-overwrite guard | Technical evidence only |
51
+ | Installed helper availability | Same suite: copied helper with no checkout dependencies; package smoke | Installed 0.1.9 reads and helper execution verified in product chats |
52
+
53
+ Run `node --test tests/workspace.test.mjs` or the full `npm test` from the repo
54
+ root. These tests own temporary folders and remove them. Publication failure is
55
+ injected at the filesystem boundary; this is not a real machine crash trial.
56
+ The [human checklist and rubric](workspace-human-check.md) retain exact prompts,
57
+ readback, ownership and separate outcome/experience reports. All canonical
58
+ Gherkin is in [the feature file](../../tests/acceptance/skill-workspace.feature).
59
+
60
+ ## Implementation checks
61
+
62
+ On macOS with Node.js 26.13.0, the full `npm test` passed 139 tests, including
63
+ nine workspace checks. `npm run check:package` passed both legacy archive names
64
+ and their offline installed-command rehearsals. The expanded installed helper/terminal checks passed on Node 22.23.4, 24.22.2
65
+ and 26.13.0 for both legacy archive names. The full 139-test suite also passed
66
+ on Node 22 and 24. An initial parallel matrix run collided on the existing
67
+ `dist/obsolete-candidate-check.js` fixture in two Node 24 distribution tests;
68
+ the serial rerun passed. No product fix was required for that orchestration error.
69
+ Markdownlint 0.24.0, lychee 0.24.2 offline links/fragments, cffconvert 2.0.0,
70
+ Python fixture/workflow tests (24), shell syntax and skill frontmatter validation
71
+ passed. A fresh independent code review found no actionable findings and reran
72
+ the nine helper tests. These are technical checks, not PM acceptance.
73
+
74
+ The initial helper test failed because it was absent; eight behavioral checks
75
+ then failed against placeholder exports before implementation. The first full
76
+ implementation exposed a macOS temporary-directory alias in executable detection;
77
+ using the real script path fixed the copied-helper check. Failed test output remains in the implementation chat evidence. No fixture was silently repaired to claim a product pass.
78
+
79
+ ## Identified installed candidate — 8 November 2026
80
+
81
+ Candidate commit: `3cb08f59a4a932121bdd1c742fbac724d12a6d74`, plugin `0.1.9`,
82
+ [draft PR #42](https://github.com/injectionator/n8r-surface/pull/42).
83
+ Codex CLI 0.166.0 fetched this exact commit through the Git repository marketplace.
84
+ Clean installation and upgrade from baseline `3effc41` were exercised in separate
85
+ isolated homes. Every one of the 14 plugin files matched the committed source by
86
+ relative filename and SHA-256. Both manifests and the installed list reported
87
+ `0.1.9`, enabled. A synthetic workspace outside the installations remained
88
+ byte-for-byte unchanged. The normal registration/configuration and baseline
89
+ plugin bytes were unchanged during these isolated trials.
90
+
91
+ The PM then explicitly authorized switching the normal installation to this
92
+ pinned candidate. Its original registration details were retained privately;
93
+ marketplace removal, pinned registration and plugin installation all exited 0.
94
+ The normal installed entry is enabled `0.1.9`, and all 14 files again match the
95
+ candidate. This is installed-byte evidence; desktop fresh-chat loading was pending at installation; the create trial below now verifies it.
96
+
97
+ SKILL.md SHA-256: `91abc353f4e0dea663a81decd5eaba6d72470c32b432b904e684c1a3b1092b3b`.
98
+ Complete file-map SHA-256: `de5d16d92f714f2f8ea900266078db8e113f6116d78ee4c98e68dcab8a696180`
99
+ (sorted relative-path → SHA-256 JSON, compact separators, UTF-8). The full map,
100
+ Git/CLI receipts, original registration, test logs and retained baseline evidence
101
+ are stored in the private task inventory, outside tracked files.
102
+
103
+ The prepared fixtures began as empty destinations or explicit synthetic
104
+ adoption/refusal inputs. No successful workspace was seeded for the creation
105
+ trial. The PM created the product chats; the implementation agent inspected their
106
+ receipts and independently read saved files. All planned outcomes have now been
107
+ exercised. The first reopen attempt omitted its target and is retained below;
108
+ explicit-target continuation passed, followed by an independent moved-folder chat.
109
+ Overall PM acceptance remains separate from these observations. Fixtures and a
110
+ final private evidence copy are deliberately retained; no cleanup, merge or release.
111
+
112
+ ## PM create trial — 8 November 2026
113
+
114
+ **Outcome: Pass for the observed create operation. Experience: Pass.** The PM
115
+ reported “Worked fine.” One fresh product chat completed in one turn (18.978
116
+ seconds) without questions or technical rescue. Its tool receipts show reads of
117
+ the installed `0.1.9` skill and workspace reference, then the installed helper's
118
+ `setup` invocation with the supplied destination and purpose; exit 0. The helper
119
+ path was in the installed plugin cache, not the developer checkout. All 14
120
+ installed file hashes still match the identified candidate.
121
+
122
+ The prepared destination was empty before the trial. Independent readback found
123
+ only `.n8r/workspace.json`, with exact format `n8r.workspace/1`, a valid generated
124
+ UUID v4, folder-derived nonempty name and supplied purpose. All pre-existing
125
+ fixture entries and file hashes were unchanged. The final response linked the
126
+ actual workspace, identified format/ID and purpose, accurately separated app
127
+ attachment, and offered a next research action without starting it. The visible
128
+ tool trace contains no source fetch, credential request or global-setting write.
129
+ A complete global-settings before/after snapshot was not collected for this trial.
130
+
131
+ | Experience criterion | Verdict and observed evidence |
132
+ | --- | --- |
133
+ | Orientation | Pass: final response links location and identifies completion and next action. |
134
+ | Necessary questions | Pass: no repeated authorization or unnecessary setup questions. |
135
+ | User effort | Pass: one prompt, no schema choice, manual setup or technical rescue. |
136
+ | Honest boundaries | Pass: completion matches independent files; attachment explicitly separate. |
137
+ | Scope | Pass: setup only; no research in the tool trace or saved output. |
138
+
139
+ This verifies loaded installed bytes and the create interaction, not the complete
140
+ issue. The chat's working directory was an existing user folder while the prompt
141
+ explicitly selected the separate empty destination; the requested boundary was
142
+ honored. A separate chat does not prove enforced history/filesystem isolation.
143
+ Host/model were not independently remeasured for this trial. Private chat receipts,
144
+ full metadata, hashes and PM feedback are retained in the task evidence inventory;
145
+ no raw transcript or machine path is published here.
146
+
147
+ After create readback, the coordinator added the documented synthetic user note
148
+ exclusively and captured a new before-inventory for repeat setup. That preparation
149
+ is distinct from product output. Repeat, fresh reopen, move, missing destination,
150
+ both adoption choices and refusal product trials remain pending. No repair,
151
+ cleanup, merge or release occurred.
152
+
153
+ ## PM repeat-setup trial — 8 November 2026
154
+
155
+ **Outcome: Pass. Experience: Pass.** The PM reported “Looks good.” In the same
156
+ product chat, the user selected the installed Researcher and asked to set up the
157
+ same workspace again. One turn completed in 10.978 seconds. The tool receipt
158
+ shows the installed `0.1.9` helper invoked against the original destination;
159
+ exit 0. No repeated confirmation or technical rescue was required.
160
+
161
+ The response recognized the same saved ID, format, name and purpose, linked the
162
+ workspace, and kept research and app attachment separate. Independent comparison
163
+ against the inventory captured after synthetic-note preparation found exact
164
+ agreement: no added/deleted entries and no changed file hashes, including both
165
+ identity metadata and the note. This verifies preservation, not merely an
166
+ assistant statement that files were unchanged.
167
+
168
+ All five experience criteria pass for this turn: clear orientation, no unnecessary
169
+ questions, no user repair burden, accurate completion/attachment statements and
170
+ setup-only scope. The private evidence inventory retains the full tool receipt,
171
+ before/after hashes and PM judgment. A read-only snapshot has been retained for
172
+ the next fresh-chat reopen trial. Reopen, move, missing destination, adoption and
173
+ refusal product trials remain pending; the issue and PR remain open/draft.
174
+
175
+ ## Additional same-chat readiness check — 8 November 2026
176
+
177
+ The user supplied a readiness response matching the saved identity and purpose.
178
+ Its actual tool receipt belongs to the original setup chat, so this does **not**
179
+ exercise fresh-chat reopen. Retain it as a successful read-only readiness check;
180
+ the fresh-session scenario remains pending, not a product failure.
181
+
182
+ One turn completed in 12.477 seconds. The installed `0.1.9` helper ran `inspect`
183
+ against the selected workspace and exited 0. Independent full inventory/hash
184
+ comparison found no changes to metadata or the synthetic note. The response
185
+ identified readiness, accurately separated attachment and offered a next action
186
+ without research. Visible experience criteria were met; no separate PM satisfaction
187
+ rating was supplied for this turn. The private receipt and verdict retain the
188
+ same-chat limitation explicitly. No repair or fixture reset was performed.
189
+
190
+ ## Fresh-chat attempt without the target location — 8 November 2026
191
+
192
+ A distinct product chat received the readiness question without the prepared
193
+ workspace path. Its current folder was the earlier user-selected baseline folder,
194
+ not the candidate workspace. The installed `0.1.9` skill/reference were loaded;
195
+ the helper inspected that current folder and returned exit 3 (nonempty,
196
+ unrecognized). The assistant reported that state and asked for a destination
197
+ choice. No mutation command appears in the receipt.
198
+
199
+ Fresh reopen is **Blocked for this attempt: the intended workspace was not made
200
+ available as the selected target**. This is not evidence that the saved identity
201
+ could not be recognized. Independent readback confirms the actual candidate
202
+ workspace and synthetic note remain byte-for-byte unchanged. The 21.996-second
203
+ trial and missing-location precondition are retained privately rather than
204
+ silently relabeled as a pass. No fixture repair or product change was made.
205
+ The new chat can receive the explicit target and perform read-only recognition;
206
+ creation in the unrelated current folder is not needed for this scenario.
207
+
208
+ ## Fresh-chat reopen after destination clarification — 8 November 2026
209
+
210
+ **Outcome: Pass for fresh-chat recognition with the explicit destination.** In the
211
+ separate readiness chat, the user supplied the saved workspace path and requested
212
+ inspection without initialization. No setup conversation or expected identity was
213
+ supplied. The installed `0.1.9` helper ran `inspect` on that exact destination;
214
+ exit 0. This turn took 12.697 seconds. The earlier missing-location attempt remains
215
+ part of the trial evidence; this was not a successful first-turn reopen.
216
+
217
+ The response recovered the original ID, format, name and purpose from the saved
218
+ workspace. It offered a useful next research action while distinguishing readiness
219
+ from source access, prior findings and app attachment. Independent complete
220
+ inventory/hash comparison confirms unchanged metadata and synthetic note, with
221
+ no added/deleted entries. No initialization, research or technical repair occurred.
222
+ The visible experience criteria were met after destination clarification; the PM
223
+ supplied the response but no separate satisfaction rating for this turn.
224
+
225
+ The create → repeat → fresh-chat recognition path now has installed-helper tool
226
+ evidence and independent state readback. A distinct chat is observed; enforced
227
+ denial of broader history/filesystem access remains unproved. Host/model limits
228
+ remain as recorded above. This does not complete issue #41: moved-folder identity,
229
+ missing destination, both adoption choices and malformed/conflicting/unsupported
230
+ product refusal trials are still pending, as is overall PM acceptance. Automated
231
+ coverage for those cases is supporting evidence, not a substitute. PR remains
232
+ draft; no merge, release or cleanup.
233
+
234
+ ## PM missing-destination creation — 8 November 2026
235
+
236
+ **Outcome: Pass. Experience: Pass.** The PM reported “looks good.” A separate
237
+ product chat loaded installed `0.1.9` and its workspace reference, then ran the
238
+ bundled helper's `setup` at the explicitly supplied missing destination; exit 0.
239
+ One turn took 20.101 seconds, without additional questions or technical rescue.
240
+
241
+ The preparation inventory recorded this destination as absent. Independent
242
+ readback now finds only `.n8r/workspace.json`: exact supported format, a valid
243
+ UUID v4 distinct from the first workspace, folder-derived name and supplied
244
+ purpose. The final response matches that readback, links the location and keeps
245
+ research and attachment separate. Existing first-workspace metadata and note
246
+ hashes remain unchanged. The five visible experience criteria are met. Private
247
+ receipts, inventories and PM feedback are retained. Adoption fixtures were also
248
+ rechecked: each still contains only its unchanged synthetic note. Their product
249
+ trials, refusal cases and moved-folder recognition remain pending.
250
+
251
+ ## PM in-place adoption — 8 November 2026
252
+
253
+ **Outcome: Pass. Visible experience criteria met; no separate PM rating supplied.**
254
+ The installed `0.1.9` helper first returned exit 3 for the nonempty unrecognized
255
+ fixture. The assistant asked for the destination choice. Independent inspection
256
+ before the PM answered found exactly the original note, with unchanged bytes and
257
+ no metadata. That first turn took 21.636 seconds.
258
+
259
+ After the PM said “Initialize here,” the installed helper ran `setup --adopt`
260
+ against the same destination; exit 0, 11.461-second turn. Independent readback
261
+ verified the reported UUID v4, supported format, folder-derived name and supplied
262
+ purpose. Only `.n8r/workspace.json` and its parent directory were added; the
263
+ original note is byte-for-byte unchanged. The response links the location and
264
+ separates research/attachment. No repeated permission or technical rescue occurred.
265
+ Both turn receipts and the before-choice/after-choice inventories are retained
266
+ privately. The alternative-choice fixtures remain untouched and inventoried for
267
+ the next trial. Alternative adoption, refusal and move trials remain pending.
268
+
269
+ ## PM alternative-folder adoption — 8 November 2026
270
+
271
+ **Outcome: Pass. Visible experience criteria met; no separate PM rating supplied.**
272
+ The installed helper returned exit 3 for the second nonempty unrecognized fixture;
273
+ the assistant asked for a destination choice (18.840-second turn). Before the PM
274
+ answered, independent comparison confirmed the original note/folder unchanged and
275
+ the alternative destination still empty.
276
+
277
+ The PM chose the alternative path. The installed `0.1.9` helper ran ordinary
278
+ `setup` there without `--adopt`, exited 0, and completed in 10.476 seconds.
279
+ Independent readback verified the reported UUID v4, supported format,
280
+ folder-derived name and retained purpose. Only identity metadata was created in
281
+ the alternative; the original folder and note remain exactly unchanged. The
282
+ response identifies the chosen destination and keeps research/attachment separate.
283
+ Both receipts, choice-boundary inventory and final readback are retained privately.
284
+ All three refusal fixtures were rechecked against their initial inventories and
285
+ remain unchanged for independent product trials. Refusals and moved-folder
286
+ recognition remain pending; no merge, release or cleanup.
287
+
288
+ ## PM refusal trials — 8 November 2026
289
+
290
+ **Outcome: Pass for each expected refusal. Visible experience criteria met;
291
+ no separate PM satisfaction ratings supplied.** Each independent product chat
292
+ loaded the installed `0.1.9` skill/reference and invoked its bundled helper with
293
+ an ordinary setup request at the selected fixture. All returned exit 2:
294
+
295
+ | Fixture | Observed explanation | Turn duration |
296
+ | --- | --- | --- |
297
+ | Malformed JSON | Invalid workspace JSON; another folder or separate repair assessment. | 19.458 seconds |
298
+ | Conflicting `.n8r` file | Metadata conflict; another folder or separate repair assessment. | 23.887 seconds |
299
+ | Unsupported format | Unsupported workspace format; another destination or repair assessment. | 17.353 seconds |
300
+
301
+ Independent before/after comparisons found exact agreement for every directory
302
+ entry and file hash in all three fixtures. No initialization, repair, migration,
303
+ downgrade or deletion occurred; the assistant made no success or research claim.
304
+ These are passing refusal scenarios, not blocked test runs. Receipts, inventories
305
+ and criterion-level verdicts are retained in the private evidence inventory.
306
+
307
+ For the final move trial, the coordinator renamed the inventoried disposable
308
+ first workspace to a new folder name, preserving all metadata and note bytes.
309
+ The old path is absent and the new path is recorded privately. This is fixture
310
+ preparation, not product behavior; installed-product recognition after the move
311
+ remains pending. No borrowed/user-owned baseline folder was moved or changed.
312
+
313
+ ## PM moved-folder recognition — 8 November 2026
314
+
315
+ **Outcome: Pass. Visible experience criteria met; no separate PM rating supplied.**
316
+ A new product chat received the moved destination, with no original ID or setup
317
+ conversation supplied. It loaded installed `0.1.9` and the workspace reference,
318
+ then ran the installed helper's `inspect` against that path; exit 0. One turn
319
+ took 20.379 seconds. The response recovered the original identity and saved name,
320
+ retained the purpose/format, linked the new location, and offered a concrete next
321
+ research prompt. It separated metadata readiness from prior research, configured
322
+ targets and app attachment.
323
+
324
+ Independent complete inventory/hash comparison with the pre-move snapshot
325
+ confirms unchanged metadata and note bytes; the old path remains absent. All 14
326
+ installed plugin files still match candidate `3cb08f5`. Private receipts,
327
+ criterion verdicts, snapshots and a final fixture copy are retained with explicit
328
+ ownership; the live disposable fixtures are deliberately retained too. No user
329
+ baseline folder or Labs work was moved or cleaned up.
330
+
331
+ ## Completion boundary and current checks
332
+
333
+ All planned product scenario outcomes passed within this host/environment scope.
334
+ The PM explicitly rated creation, repeat and missing-destination interaction
335
+ positively. Later responses meet the observable experience rubric, but supplying
336
+ those responses is not recorded as blanket acceptance. Overall PM acceptance and
337
+ review readiness are still pending; PR #42 remains draft and issue #41 open.
338
+
339
+ Known limits remain: fresh chats do not prove enforced denial of history or broad
340
+ filesystem access; host/model were not remeasured per candidate run; global-state
341
+ preservation is supported by tool traces rather than a complete system snapshot.
342
+ Interruption is covered by injected filesystem failures, not a machine crash.
343
+ Other hosts and CLI/Labs workspace integration remain unverified.
344
+
345
+ Local Markdown, pinned offline link/anchor and diff checks passed after evidence
346
+ updates. In CI run `42470396419`, all three Node jobs, fixtures/tooling and Markdown
347
+ passed; the local-links job failed downloading the pinned checker (curl exit 22)
348
+ before checking any links. Its release asset exists. This is not a passing CI
349
+ link check; the final branch run must be checked separately. No workflow or product
350
+ change was made to conceal the failed download.
@@ -0,0 +1,83 @@
1
+ # Surface workspace v1
2
+
3
+ The issue #41 candidate adds standalone workspace setup and read-only recognition
4
+ to the existing Researcher skill. A workspace is a user-owned folder with only
5
+ `.n8r/workspace.json` initially. It needs no vault, Git repository, source checkout,
6
+ Lab, credentials or app attachment. Research and content folders are lazy.
7
+
8
+ The [bundled workspace reference](../../plugins/n8r-surface/skills/research/references/workspace.md)
9
+ defines the record and interaction rules used by the installed skill. The
10
+ [shared module](../../plugins/n8r-surface/skills/research/scripts/workspace.mjs)
11
+ is the authoritative validator and filesystem implementation. Plugin removal or
12
+ upgrade does not own or remove user workspaces.
13
+
14
+ ## Public consumer boundary
15
+
16
+ Import the bundled ESM module using Node.js 22, 24 or 26. It uses built-ins only:
17
+
18
+ ```js
19
+ import { inspectWorkspace, setupWorkspace, validateWorkspace }
20
+ from './plugins/n8r-surface/skills/research/scripts/workspace.mjs';
21
+
22
+ const state = inspectWorkspace(selectedDirectory); // read-only
23
+ // Only after an explicit setup request; adopt only after an initialize-here choice.
24
+ const created = setupWorkspace(selectedDirectory, { purpose: 'Investigate LibreChat' });
25
+ const validation = validateWorkspace(JSON.parse(savedText));
26
+ ```
27
+
28
+ `selectedDirectory` and `savedText` are supplied by the host. The return value has
29
+ `status`, `message`, `directory` when available, and `record` only for supported
30
+ metadata. The helper's [result table and script interface](../../plugins/n8r-surface/skills/research/references/workspace.md#interpret-the-result)
31
+ apply equally to importers. Imports do not run the script interface. There is no
32
+ npm export alias or new `n8r-surface` CLI command for this module in this slice.
33
+
34
+ Host adapters must preserve the distinction between inspection and authorized
35
+ setup, and between an explicit setup request and consent to adopt a nonempty
36
+ folder. They must consume this module rather than reimplement filesystem rules.
37
+ The module cannot verify conversational authorization: that is the caller's duty.
38
+ CLI/Labs integration and compatibility are not verified.
39
+
40
+ ## Persistence and limitations
41
+
42
+ Identity uses `n8r.workspace/1`, a generated UUID v4, a nonempty display name and
43
+ optional purpose. The exact supported record is distinct from plugin and AI
44
+ Surface Model versions. Unknown fields confer no authority and are preserved by
45
+ read-only reuse. Rename/move preserves ID; copying a workspace copies its ID and
46
+ is not a new-identity operation. No rename, copy, repair or migration API is added.
47
+
48
+ Setup writes a complete temporary record, flushes it, publishes it with an atomic
49
+ no-overwrite hard link, removes that temporary link, and reads the result back.
50
+ If publication fails, setup reports failure and retains staging evidence; a
51
+ later request refuses incomplete `.n8r` contents. An interruption after publication
52
+ may leave a complete valid identity and staging file; recognition reads the
53
+ identity and never deletes the staging file. It cannot accept partial JSON.
54
+
55
+ This targets ordinary local macOS/Linux filesystems supporting hard links.
56
+ Unsupported filesystems report an I/O failure, without a weaker overwrite fallback.
57
+ Destination and metadata symlinks/nonregular files are refused. Ancestor aliases
58
+ may resolve normally; this is not an adversarial filesystem sandbox. Concurrent
59
+ writers, malicious path replacement and power-loss durability are outside scope.
60
+ No network, credentials or global settings are used. Read-only here means no
61
+ intentional writes; operating-system access times and host checkpoints are separate.
62
+
63
+ ## Intent and evidence
64
+
65
+ **State X:** an identified installed skill, a selected writable destination and a
66
+ fresh product chat. **Input Y:** “Help me set up an n8r workspace here for
67
+ investigating LibreChat. Set it up only; do not start researching yet.”
68
+ **Outcome Z:** one valid identity record, a useful next action, no research or
69
+ unrelated configuration; repeat and fresh-session inspection preserve identity
70
+ and all existing bytes.
71
+
72
+ [Canonical Gherkin](../../tests/acceptance/skill-workspace.feature),
73
+ [human walkthrough](workspace-human-check.md) and
74
+ [verification status](workspace-verification.md) distinguish deterministic checks,
75
+ installed-product rehearsal and PM acceptance. Gherkin is manually runnable; no
76
+ framework is installed.
77
+
78
+ Skill instructions, helper and references ship together in plugin `0.1.9`; both
79
+ manifests match. The repository marketplace points to that same subtree and has
80
+ no separate version field. The npm package version remains unchanged. The existing
81
+ CLI instruction-bundle revision guard is aligned so packaging does not break;
82
+ its restricted runner gains no workspace tools. Future consumer releases must
83
+ identify the bundled helper revision and rerun the same contract checks.
@@ -26,6 +26,14 @@ Open a research HTML file in a browser to read its findings and inspect its embe
26
26
  data. The data owns all facts; rendering is a derived view. These checked fixtures
27
27
  are inert, but arbitrary imported HTML must be validated before trusted rendering.
28
28
 
29
+ The separate [Capability and Bound examples](descriptions/README.md) exercise the
30
+ JSON-only `0.2` description contract. They do not convert these selected `0.1`
31
+ definitions into deployments.
32
+
33
+ For the revised #50 inspection, use the [shared relationship 0.3 examples](relationships/README.md).
34
+ They put purpose, integration mechanism, safe config references and evidence on
35
+ the edges in both Capability and Bound descriptions.
36
+
29
37
  ## Selected composition
30
38
 
31
39
  ```mermaid
@@ -0,0 +1,7 @@
1
+ # CycloneDX exchange
2
+
3
+ CycloneDX 1.7 · BOM version 1 · bound Surface.
4
+
5
+ Open surface.cdx.json in a compatible consumer. Keep surface-records.json and mapping.json with it: they preserve the native evidence and explain the projection/losses. Configured dependencies do not establish runtime use. Coverage remains unknown.
6
+
7
+ Use the standalone helper read operation to verify this directory before continuation. Prior files must stay unchanged.
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 1,
3
+ "predecessor": null,
4
+ "files": {
5
+ "surface.cdx.json": "sha256:fe84d5b0fa769d2c96710cdd627434b88cd1b6ce740b412ae492d51156f27a17",
6
+ "surface-records.json": "sha256:795a7b1fb33980888110f8ea0e67a67de5f98227b39f3104cfa7ed38fddba2a6",
7
+ "mapping.json": "sha256:65f69a776524ffc4d910b0199930e17b5b78ceb92e8dff45cd0fd8601578856d",
8
+ "README.md": "sha256:eb76d9f5cae1dce2d42d13239d011520c355695b1b3e23d15d78ae09704413e8"
9
+ }
10
+ }