@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
@@ -1,11 +1,16 @@
1
1
  # Package version and release identity
2
2
 
3
- The [approved decision in issue #27](https://github.com/injectionator/n8r-surface/issues/27#issuecomment-6661015093)
4
- applies to both `@n8r/surface` and `n8r-surface`. Their authoritative version is
5
- `package.json`; the lockfile must agree. Both packages come from one build of one
6
- commit. The installed command reads its own manifest for `--version`, regardless
7
- of the working directory. Package versions do not version the AI Surface Model,
8
- Researcher skill, or individual saved Surface revisions.
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.
9
14
 
10
15
  ## Compatibility and version changes
11
16
 
@@ -31,15 +36,15 @@ Use `npm version VERSION --no-git-tag-version` for an approved version change,
31
36
  then review both manifests in the issue's PR. `npm run check:version` rejects
32
37
  invalid versions and drift in either lockfile version. `npm test` and candidate
33
38
  packing run that check. A version bump needs no source-code edit for CLI output.
34
- The maintainer confirmed `0.1.0-experimental.2` and authorized publication on
35
- 5 November 2026. Review/merge and required account actions remain separate. See
36
- the [first-release procedure](npm-release.md).
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).
37
42
 
38
43
  npm distribution tags are movable pointers, unlike permanent Git release tags:
39
44
 
40
- - Experimental prereleases use explicit `experimental` on both packages.
45
+ - Experimental prereleases use explicit `experimental` on the scoped package.
41
46
  - Release candidates use explicit `next`; they must not update `latest`.
42
- - Stable releases may use `latest` only after both exact-version routes pass
47
+ - Stable releases may use `latest` only after the scoped exact-version route passes
43
48
  verification and promotion is authorized. Publish initially under `next` to
44
49
  permit independent readback before promotion.
45
50
 
@@ -58,19 +63,14 @@ that do not report `immutable: true`. No repository settings are changed by
58
63
  these local tools. Review/approval of the selected commit is a maintainer
59
64
  prerequisite; the verifier checks identity, not the adequacy of code review.
60
65
 
61
- Retain `candidates.json` and both exact tarballs from the approved build. Each
62
- report entry has a `releaseAsset` name, respectively
63
- `n8r-surface-VERSION-scoped.tgz` and `n8r-surface-VERSION-unscoped.tgz`. Copy the
64
- bytes under those distinct names when uploading release assets, since npm gives
65
- both original tarballs the same basename. Upload the report too, and retain the
66
- build environment, test evidence, release notes and per-package registry results.
67
- SHA-256 identifies bytes; it does not authenticate the builder.
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.
68
69
 
69
- The source packer requires `private: true`. The explicit `--publishable` option
70
- creates fresh publishable archives at the approved first version; ordinary
71
- candidates stay private. Use a fresh reviewed commit and build. Do not strip the guard from an old tarball
72
- and keep its old hash or claim it was built from an unchanged commit. The current
73
- verifier accepts private artifacts only for draft metadata rehearsals.
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
74
 
75
75
  ## Read-only verification commands
76
76
 
@@ -84,7 +84,7 @@ npm run check:release -- /path/to/candidates
84
84
 
85
85
  The second command reads GitHub's release API and resolves the remote tag. It
86
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, both archive
87
+ local and remote tag targets, release target SHA and prerelease flag, required archive
88
88
  manifests and hashes, and matching uploaded asset names/digests. It fails closed
89
89
  on missing data or API errors. A passing JSON result includes the version,
90
90
  revision, tag, draft status, `evidence: "GitHub API readback"`, and explicit
@@ -107,42 +107,31 @@ performs explicitly selected publication; registry permissions remain external.
107
107
 
108
108
  ## Authentication, provenance and incomplete releases
109
109
 
110
- Before any first publication, establish the npm account, package ownership and
111
- `n8r` organization/team rights for both names. The official
112
- [scoped publication guide](https://docs.npmjs.com/creating-and-publishing-scoped-public-packages/)
113
- documents public access and direct-publication authentication requirements.
114
- Its staged first-publication path creates a public placeholder; staging is not
115
- a read-only readiness check. The maintainer approved this staged route for the
116
- first release after npm offered stage-only tokens; submit the actual retained
117
- artifacts, not an empty reservation package. The [procedure](npm-release.md)
118
- requires maintainer 2FA approval of both real versions.
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.
119
115
 
120
116
  Prefer [trusted publishing](https://docs.npmjs.com/trusted-publishers/) from the
121
- public repository using GitHub-hosted runners. Configure each package separately
122
- for the exact workflow and environment. npm documents Node 22.14+ and npm 11.5.1+
123
- for trusted publishing; its dist-tag permission is separate and requires newer
124
- npm (11.21.0+ in the 11 series or 12.2.0+ in the 12 series). A newly configured
125
- publisher must complete a successful publish within two days or be recreated.
126
- These are prerequisites to verify during release preparation, not settings this
127
- increment changes. References checked 5 November 2026.
128
-
129
- For each exact installed registry version, run `npm audit signatures` and inspect
130
- its [provenance](https://docs.npmjs.com/generating-provenance-statements/). Require
131
- evidence for the package itself, not merely an attested dependency. Compare the
132
- attestation's source commit/repository and artifact digest with the approved
133
- release. Also compare registry tarball bytes with the retained SHA-256 and record
134
- registry `dist.integrity`. A repository URL or locally generated hash is not
135
- registry provenance. Repeat the [isolated consumer checks](npm-distribution.md#human-verification)
136
- and documented npm-exec routes for both names.
137
-
138
- If one package publishes and the other fails, the release is **incomplete**.
139
- Retain the exact build and draft GitHub Release. Inspect the existing published
140
- bytes and evidence, then retry only the missing package using the retained
141
- artifact after resolving the failure. Never rebuild or overwrite the published
142
- version. A mismatch requires a new approved version for both names. Promote both
143
- npm dist-tags and finalize the immutable GitHub Release only after both routes
144
- pass. If tag promotion partially fails, record that too and repair only the
145
- missing pointer update; it does not require republishing package bytes.
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.
146
135
 
147
136
  ## Human check for this increment
148
137
 
@@ -152,26 +141,26 @@ No npm credentials, real Git tag, GitHub Release or global-install change is nee
152
141
  Keep the current terminal with `candidate_run` set by that guide.
153
142
 
154
143
  - [ ] From the checkout root run `npm run check:version`. Expect
155
- `Version consistent: 0.1.0-experimental.2`, exit 0. Inspect `package.json` and
144
+ `Version consistent: 0.1.0-experimental.5`, exit 0. Inspect `package.json` and
156
145
  both root version fields in `package-lock.json`; they must match.
157
146
  - [ ] Follow the [candidate install steps](npm-distribution.md#human-verification)
158
- for both names. In each consumer directory run:
147
+ for the scoped package. In its consumer directory run:
159
148
 
160
149
  ```sh
161
150
  node -p 'require("./node_modules/@n8r/surface/package.json").version'
162
151
  ./node_modules/.bin/n8r-surface --version
163
152
  ```
164
153
 
165
- For the alternative use `./node_modules/n8r-surface/package.json`. Expect
166
- `0.1.0-experimental.2` and `n8r-surface 0.1.0-experimental.2`, both exit 0.
167
- - [ ] Inspect `candidates.json`: both entries have distinct `releaseAsset` names,
168
- the same report version/revision, and hashes matching the retained tarballs.
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.
169
158
  A clean-commit rehearsal must say `dirty: false`.
170
159
  - [ ] Read the compatibility table and release/recovery procedure above. Expect
171
- one permanent Git tag and exact commit for both package names; `experimental`
160
+ one permanent Git tag and exact commit for the scoped package; `experimental`
172
161
  and `next` do not silently promote `latest`.
173
162
  - [ ] Report **Pass / Fail / Blocked**, Node/npm versions, report revision and
174
- both CLI outputs. Version drift or missing artifacts is Fail. Missing real
163
+ the scoped CLI output. Version drift or missing artifacts is Fail. Missing real
175
164
  release/authentication is Blocked for live release verification, not a reason
176
165
  to create a tag or publish. Clean up only the temporary consumer directory
177
166
  created by the distribution procedure after retaining needed evidence.
@@ -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.