@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,172 @@
1
+ # Package version and release identity
2
+
3
+ The distribution plan is **`@n8r/surface` only**. Its authoritative version is
4
+ `package.json`; the lockfile must agree, and the installed command reads its own
5
+ manifest for `--version`. Package versions do not version the AI Surface Model,
6
+ Researcher skill or individual saved Surface revisions.
7
+
8
+ The maintainer removed unscoped publication and name reservation from the plan
9
+ on 5 November 2026. The first verified release is
10
+ [`@n8r/surface@0.1.0-experimental.2`](npm-release.md#verified-scoped-release).
11
+ Historical dual archives remain evidence, not a second supported package or a
12
+ future publication commitment. Current tooling prepares only the scoped package; preparation does not authorize
13
+ a release.
14
+
15
+ ## Compatibility and version changes
16
+
17
+ Follow [SemVer 2.0.0](https://semver.org/spec/v2.0.0.html) for package releases.
18
+ The compatibility boundary covers documented library exports, supported Node
19
+ majors, command inputs/exit behavior, settings and persisted formats. Provisional
20
+ model semantics remain provisional; a package number does not establish universal
21
+ model conformance. Document migration requirements for breaking changes.
22
+
23
+ | Stage | Breaking change | Compatible feature | Compatible fix |
24
+ | --- | --- | --- | --- |
25
+ | Before 1.0 | Increment minor, reset patch | Increment minor, reset patch | Increment patch |
26
+ | From 1.0 | Increment major, reset minor/patch | Increment minor, reset patch | Increment patch |
27
+
28
+ Before 1.0, this is a project compatibility convention stronger than SemVer's
29
+ allowance for initial development. A major release of 1.0 requires an explicit
30
+ compatibility decision, not simply a successful build. Prereleases use a suffix
31
+ such as `-experimental.1` or `-rc.1`; increment it for changed prerelease bytes.
32
+ Never reuse a released number. Release versions exclude `+build` metadata to
33
+ avoid distinct Git tags representing the same npm version identity.
34
+
35
+ Use `npm version VERSION --no-git-tag-version` for an approved version change,
36
+ then review both manifests in the issue's PR. `npm run check:version` rejects
37
+ invalid versions and drift in either lockfile version. `npm test` and candidate
38
+ packing run that check. A version bump needs no source-code edit for CLI output.
39
+ The maintainer authorized the next release on 14 November 2026. The current
40
+ release is `0.1.0-experimental.5`; required account actions remain separate. See
41
+ the [release procedure](npm-release.md#experimental5-release).
42
+
43
+ npm distribution tags are movable pointers, unlike permanent Git release tags:
44
+
45
+ - Experimental prereleases use explicit `experimental` on the scoped package.
46
+ - Release candidates use explicit `next`; they must not update `latest`.
47
+ - Stable releases may use `latest` only after the scoped exact-version route passes
48
+ verification and promotion is authorized. Publish initially under `next` to
49
+ permit independent readback before promotion.
50
+
51
+ ## One version, one commit, one release
52
+
53
+ After release authorization, use a clean, reviewed commit with the approved
54
+ version. Create one annotated `vVERSION` Git tag pointing to its full commit SHA;
55
+ never move, overwrite or delete a release tag. Create the corresponding GitHub
56
+ Release as a draft with `target_commitish` explicitly set to that SHA and the
57
+ prerelease flag matching the version. Do not use a moving branch as the target.
58
+
59
+ Enable [GitHub release immutability](https://docs.github.com/en/code-security/how-tos/secure-your-supply-chain/establish-provenance-and-integrity/prevent-release-changes)
60
+ before publishing a release. Attach all evidence before finalizing the draft:
61
+ GitHub then locks its tag and assets. The verifier rejects published releases
62
+ that do not report `immutable: true`. No repository settings are changed by
63
+ these local tools. Review/approval of the selected commit is a maintainer
64
+ prerequisite; the verifier checks identity, not the adequacy of code review.
65
+
66
+ Retain the approved scoped archive, its digest report, build environment, test
67
+ evidence, release notes and registry readback. SHA-256 identifies bytes; it does
68
+ not authenticate the builder. Do not rebuild or alter a published version.
69
+
70
+ The packer produces one scoped archive. Preserve the historical reports and both
71
+ archives for verification of `.1` and `.2`; their version-specific verification
72
+ still checks both. Source and default candidates remain private. Never strip a
73
+ guard from an old tarball and retain its old digest or source claim.
74
+
75
+ ## Read-only verification commands
76
+
77
+ From the clean source checkout corresponding to the retained candidates, with
78
+ Node 22/24/26, Git, POSIX `tar`, and GitHub CLI authenticated for read access:
79
+
80
+ ```sh
81
+ npm run check:version
82
+ npm run check:release -- /path/to/candidates
83
+ ```
84
+
85
+ The second command reads GitHub's release API and resolves the remote tag. It
86
+ checks the source and lockfile versions, clean HEAD, report revision/dirty flag,
87
+ local and remote tag targets, release target SHA and prerelease flag, required archive
88
+ manifests and hashes, and matching uploaded asset names/digests. It fails closed
89
+ on missing data or API errors. A passing JSON result includes the version,
90
+ revision, tag, draft status, `evidence: "GitHub API readback"`, and explicit
91
+ `npmPublication`/`provenance` values of `"not checked"`. No files or remote state
92
+ are changed. Published releases also require immutability and non-private archives.
93
+
94
+ For offline checking of a previously saved raw GitHub REST release response:
95
+
96
+ ```sh
97
+ npm run check:release -- /path/to/candidates /path/to/release.json
98
+ ```
99
+
100
+ This deliberately reports `evidence: "offline metadata rehearsal"`. It does not
101
+ contact GitHub or verify a remote tag. Handwritten or stale JSON is not live
102
+ release evidence. The report is also not a reproducible-build proof: validating
103
+ its claimed revision cannot prove arbitrary supplied artifacts were built from
104
+ that revision. Authenticated build provenance and registry readback remain
105
+ required. This checker remains read-only. The separate [release workflow](npm-release.md)
106
+ performs explicitly selected publication; registry permissions remain external.
107
+
108
+ ## Authentication, provenance and incomplete releases
109
+
110
+ Future publication requires an authorized npm identity with write access to
111
+ `@n8r/surface`. Unscoped ownership, reservation and defensive publication are
112
+ out of scope. The first release used a stage-only token, followed by maintainer
113
+ 2FA approval; [the release record](npm-release.md#verified-scoped-release)
114
+ contains the observed results.
115
+
116
+ Prefer [trusted publishing](https://docs.npmjs.com/trusted-publishers/) from the
117
+ public repository on GitHub-hosted runners for future scoped releases. Configure
118
+ only `@n8r/surface` for the reviewed workflow/environment. This has not yet been
119
+ exercised. Recheck npm's current requirements before setup; a newly configured
120
+ publisher must complete a successful publication within two days or be recreated.
121
+ Keep credentials outside tracked files.
122
+
123
+ For the exact scoped registry version, verify registry signatures and the
124
+ package's own provenance, source repository/commit, workflow identity and subject
125
+ digest. Compare downloaded bytes with the retained SHA-256 and registry integrity.
126
+ Exercise the documented isolated installation and npm-exec route. An attested
127
+ dependency or matching repository text alone is insufficient.
128
+
129
+ If submission or verification fails, keep the release incomplete and retain its
130
+ exact archives. Check whether the version already exists before retrying; verify
131
+ existing bytes instead of overwriting or silently rebuilding them. A mismatch
132
+ requires a new approved version. Finalize the immutable GitHub Release only after
133
+ the scoped package passes acceptance. Promote `latest` only after a separate
134
+ promotion decision; no unscoped publication is required.
135
+
136
+ ## Human check for this increment
137
+
138
+ Maintainer preparation: provide this branch, installed dependencies and the
139
+ candidate setup from [the distribution guide](npm-distribution.md#build-and-inspect-candidates).
140
+ No npm credentials, real Git tag, GitHub Release or global-install change is needed.
141
+ Keep the current terminal with `candidate_run` set by that guide.
142
+
143
+ - [ ] From the checkout root run `npm run check:version`. Expect
144
+ `Version consistent: 0.1.0-experimental.5`, exit 0. Inspect `package.json` and
145
+ both root version fields in `package-lock.json`; they must match.
146
+ - [ ] Follow the [candidate install steps](npm-distribution.md#human-verification)
147
+ for the scoped package. In its consumer directory run:
148
+
149
+ ```sh
150
+ node -p 'require("./node_modules/@n8r/surface/package.json").version'
151
+ ./node_modules/.bin/n8r-surface --version
152
+ ```
153
+
154
+ Expect
155
+ `0.1.0-experimental.5` and `n8r-surface 0.1.0-experimental.5`, both exit 0.
156
+ - [ ] Inspect `candidates.json`: one scoped entry has its `releaseAsset` name,
157
+ the report version/revision, and a hash matching the retained tarball.
158
+ A clean-commit rehearsal must say `dirty: false`.
159
+ - [ ] Read the compatibility table and release/recovery procedure above. Expect
160
+ one permanent Git tag and exact commit for the scoped package; `experimental`
161
+ and `next` do not silently promote `latest`.
162
+ - [ ] Report **Pass / Fail / Blocked**, Node/npm versions, report revision and
163
+ the scoped CLI output. Version drift or missing artifacts is Fail. Missing real
164
+ release/authentication is Blocked for live release verification, not a reason
165
+ to create a tag or publish. Clean up only the temporary consumer directory
166
+ created by the distribution procedure after retaining needed evidence.
167
+
168
+ Automated technical evidence: `tests/version.test.mjs` changes a copied installed
169
+ manifest to `0.7.3-rc.2` and asserts CLI readback; `tests/release.test.mjs` uses
170
+ throwaway Git repositories, tags, archives and metadata to exercise success and
171
+ rejection paths. These tests are synthetic, not a real GitHub Release or registry
172
+ publication. Agent rehearsal and human acceptance remain separate.
@@ -0,0 +1,101 @@
1
+ # Check workspace setup and continuation
2
+
3
+ Use [the canonical scenarios](../../tests/acceptance/skill-workspace.feature).
4
+ This is a PM walkthrough through the installed skill, not a developer executing
5
+ the helper and calling it product acceptance. Keep this guide and expected answers
6
+ out of the product chat. Current results are in [verification](workspace-verification.md).
7
+
8
+ ## Maintainer preparation
9
+
10
+ - Identify the candidate commit, plugin version and every installed file digest.
11
+ Follow [candidate installation](workspace-installation.md). Verify the actual
12
+ loaded skill path from tool receipts; a version announcement alone is insufficient.
13
+ - Use a local Codex desktop chat with ordinary inference sign-in, persistent
14
+ filesystem access and Node.js 22, 24 or 26. Record actual app/build, selected
15
+ model and CLI version. Unsupported/cloud-only hosts are blocked, not passed.
16
+ - Prepare disposable folders outside source repositories. Keep evidence outside
17
+ product inputs. Create one empty folder each for create and alternative choice;
18
+ leave a missing destination absent. For each adoption case create a folder with
19
+ `user-note.md` containing `Synthetic user note: preserve this text.`
20
+ - Prepare independent refusal folders: malformed `.n8r/workspace.json` containing
21
+ `{`; conflicting `.n8r` as a plain text file; unsupported identity JSON with
22
+ `format: n8r.workspace/2`. These are inputs, not seeded successful workspaces.
23
+ - Record the owned fixture inventory, all initial file bytes/hashes and directory
24
+ entries. Record global/project instructions, enabled tools, memory/history and
25
+ filesystem access. Verify the selected folder is actually available. Do not
26
+ attribute host-created `.git` to the skill. Do not call a nonempty folder empty.
27
+ - Start a separate fresh product chat. Supply only the installed skill, selected
28
+ folder and ordinary user prompt. Never include this implementation chat,
29
+ expected outputs or hidden repair hints. Record isolation limits; a fresh chat
30
+ alone is not proof that history/filesystem access is excluded.
31
+
32
+ ## PM tasks
33
+
34
+ - [ ] Open the prepared empty folder in a fresh local chat. Select the installed
35
+ **n8r-surface Researcher** and send:
36
+
37
+ > Help me set up an n8r workspace here for investigating LibreChat.
38
+ > Set it up only; do not start researching yet.
39
+
40
+ Expect a clear saved location and useful next step, without beginning research.
41
+ It should distinguish creation from app attachment and require no source or
42
+ credentials. Open the folder with hidden files visible: only
43
+ `.n8r/workspace.json` should be new. Open it and record its ID and format.
44
+ - [ ] Add `user-note.md` containing `Synthetic user note: preserve this text.`
45
+ Ask: “Set up this n8r workspace here again.” Expect recognition without a new
46
+ identity, rewrite or repeated permission question. The note remains unchanged.
47
+ - [ ] In a new chat, select the same folder and installed skill, then send:
48
+
49
+ > Is this n8r workspace ready, and what can I do next?
50
+
51
+ Expect the same saved identity/format, useful continuation from saved purpose,
52
+ no claim of completed LibreChat research and no writes or research.
53
+ - [ ] Move the disposable folder using the file manager. Open it in another fresh
54
+ chat and repeat the readiness question. Expect the same identity at the new
55
+ location. Do not move a borrowed/user-owned workspace for this test.
56
+ - [ ] Repeat setup with the absent destination, stating its location in the prompt.
57
+ Expect the same minimal creation without a redundant permission question.
58
+ - [ ] Use each adoption fixture separately. Ask setup; expect a choice before any
59
+ write. Answer “Initialize here” in one run; choose the prepared alternative
60
+ empty folder in the other. Expect the chosen destination initialized and every
61
+ original user file preserved.
62
+ - [ ] Ask setup in each refusal fixture. Expect a specific explanation and next
63
+ action, no success claim, repair, migration or file changes.
64
+
65
+ Answer only genuine questions using the scenario facts. Stop at technical rescue,
66
+ 10 exchanges or 15 minutes; retain the failed/incomplete trial. Do not silently
67
+ fix files, change the expectation or retry until a pass.
68
+
69
+ ## Independent evidence and report
70
+
71
+ The maintainer compares complete before/after file inventories and hashes, then
72
+ reads saved JSON independently of the helper. Verify UUID v4, exact format,
73
+ nonempty name, optional purpose, stable ID and unchanged note bytes. Record tool
74
+ exit statuses (helper success 0, choice/uninitialized 3, refusal/error 2), actual
75
+ messages/tool receipts, timestamps and unrelated/global-state checks. Helper
76
+ calls in automated tests are supporting evidence, not this chat journey.
77
+
78
+ Report each scenario's **Outcome: Pass / Fail / Blocked**, with file/tool evidence.
79
+ Separately score **Experience: Pass / Fail / Blocked** for each:
80
+
81
+ | Criterion | Evidence to return |
82
+ | --- | --- |
83
+ | Orientation | Turn showing location, completion state and useful next action. |
84
+ | Necessary questions | Each question and why its information was missing. |
85
+ | User effort | Any request to choose a schema/structure or perform technical rescue. |
86
+ | Honest boundaries | Attachment, access and failure statements versus actual tools/state. |
87
+ | Scope | Whether setup/readiness ended without research. |
88
+
89
+ False completion, unauthorized effects or lost data fail regardless of conversation
90
+ quality. An expected refusal can pass; an unavailable host is blocked. Record
91
+ invalid environment separately. Wording, paths, names, UUIDs and timings may vary;
92
+ identity changes, unexpected writes or invented research are failures. Retain
93
+ sanitized PM judgments and private evidence references, including failed trials.
94
+
95
+ ## Cleanup
96
+
97
+ Retain transcripts, hashes and verdicts before cleanup. Remove only the exact
98
+ inventoried task-owned fixture and isolated-installation roots when authorized;
99
+ verify removal. Never delete the normal installation, borrowed folders or research.
100
+ Record deliberate retention and leftovers. Installation, rehearsal, acceptance,
101
+ merge and release are separate states.
@@ -0,0 +1,68 @@
1
+ # Install an identified workspace candidate
2
+
3
+ Plugin `0.1.9` belongs to issue #41 on `feat/41-skill-workspace`. Pin the reviewed
4
+ commit from the draft PR; a moving branch alone is not repeatable provenance.
5
+ This procedure exercises installation without replacing the normal installation.
6
+ It does not establish desktop invocation or PM acceptance.
7
+
8
+ ## Isolated maintainer installation
9
+
10
+ Prerequisites: Git, Codex CLI 0.166.0, Python 3 and network access for a Git
11
+ marketplace. From the n8r-surface checkout at the reviewed commit:
12
+
13
+ ```sh
14
+ n8r_candidate_revision=$(git rev-parse HEAD)
15
+ n8r_candidate_root=$(mktemp -d)
16
+ mkdir "$n8r_candidate_root/codex"
17
+ env CODEX_HOME="$n8r_candidate_root/codex" codex plugin marketplace add injectionator/n8r-surface --ref "$n8r_candidate_revision" --json
18
+ env CODEX_HOME="$n8r_candidate_root/codex" codex plugin add n8r-surface@n8r-surface --json
19
+ env CODEX_HOME="$n8r_candidate_root/codex" codex plugin list --marketplace n8r-surface --json
20
+ ```
21
+
22
+ Expected: exit 0; exactly one installed/enabled `n8r-surface@n8r-surface` at
23
+ `0.1.9` in the isolated home. Keep the root and revision in a private run inventory.
24
+ The environment override is scoped to each process, not exported into the normal
25
+ shell. No inference credentials are copied. These install operations need no model
26
+ sign-in. Do not claim that this changes the desktop app's active installation.
27
+
28
+ Use `git archive` of the exact commit to compare every plugin-relative file and
29
+ SHA-256 digest to the listed installed path. Verify both manifests, SKILL.md,
30
+ references and `scripts/workspace.mjs`; preserve a complete digest inventory.
31
+ Run the installed helper only in a separate technical fixture to check packaging.
32
+ Do not use that helper-created fixture as the PM's new-user input.
33
+
34
+ For an offline/local marketplace rehearsal, archive the exact commit's
35
+ `.agents/plugins/marketplace.json` and `plugins/n8r-surface` into a task-owned
36
+ source directory and register that directory instead. This uses the repository
37
+ marketplace layout without editing its name or installing a second skill.
38
+ Record that local delivery route distinctly from Git fetch verification.
39
+
40
+ ## Upgrade rehearsal
41
+
42
+ Use another isolated home and install baseline commit
43
+ `3effc41bf7e8466651722b7b4c64035f862b1901` (plugin `0.1.8`) first. Independently
44
+ snapshot a synthetic user workspace outside the installation. Remove only that
45
+ isolated marketplace registration, register the exact candidate revision, and
46
+ run `plugin add` again. A pinned marketplace does not float to a new commit.
47
+ Expect `0.1.9`, byte equality with the candidate, and an unchanged user workspace.
48
+ This tests replacement of the installed snapshot; fresh-chat skill use remains
49
+ [a separate PM task](workspace-human-check.md).
50
+
51
+ ## Desktop product rehearsal
52
+
53
+ The PM must choose an explicit installation route for the actual desktop session.
54
+ An isolated CLI installation is not automatically visible there. Record the normal
55
+ registration first. If the PM authorizes replacing it for the trial, use the pinned
56
+ candidate registration/add sequence, verify installed bytes, refresh the app if
57
+ needed and start fresh product chats. Keep the original source/ref available for
58
+ restoration. Never remove/repoint the normal registration silently.
59
+
60
+ Alternatively use a separately verified host configuration that loads the isolated
61
+ installation. Verify this from actual tool receipts before testing. Do not assume
62
+ an environment override affects an already-running desktop process.
63
+
64
+ [Official plugin packaging guidance](https://developers.openai.com/plugins/build/plugins)
65
+ describes the repository marketplace and bundled resources. The commands above
66
+ must also be checked against the installed CLI's help and actual results.
67
+ Neither repository marketplace installation nor a ZIP is a public Plugins
68
+ Directory listing, npm release or authorization to merge.