@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,173 @@
1
+ # Capability and Bound Surface delivery
2
+
3
+ Agreed intent, 8 November 2026. The contract layer is implemented separately;
4
+ these installed-skill outcomes remain planned, not evidence of product acceptance.
5
+ Parent: [#17](https://github.com/injectionator/n8r-surface/issues/17).
6
+
7
+ ## Intent and names
8
+
9
+ The installed Researcher uses artifacts in a selected workspace, supplemented by
10
+ authorized research, to produce and revise useful evidence-backed descriptions.
11
+ It preserves sources, component identities, human decisions, gaps and history.
12
+ There is one AI Surface Model; the following are descriptions within it, not
13
+ separate models. Size and depth are independent of these distinctions.
14
+
15
+ | Description | Question answered | Evidence boundary |
16
+ | --- | --- | --- |
17
+ | Capability Surface | What connections and capabilities can this product support? | Docs/code establish possibilities, without asserting instance bindings. |
18
+ | Bound Surface | Which relationships are configured for this instance? | Explicit instance configuration is enough to mark a relationship bound. Runtime use need not be proved. |
19
+ | Observed Surface | What configuration and state were observed for an instance at a particular time? | Dated instance inspection; any runtime claim needs runtime evidence. Deferred from this delivery. |
20
+
21
+ For example, a Capability Surface may describe support for OIDC authentication
22
+ and MongoDB. A Bound Surface may identify OIDC and MongoDB Atlas as the configured
23
+ authentication and database relationships. These examples are illustrative, not
24
+ findings about an inspected deployment. Actual setting values are outside this
25
+ increment. Configured does not mean reachable, exercised or successfully deployed.
26
+
27
+ Missing evidence means unknown, not unbound. Supported alternatives remain
28
+ separate from selected bindings. Conflicting evidence remains visible rather than
29
+ being silently resolved. Definitions and instance bindings retain separate
30
+ identity/revision meaning; later evidence cannot rewrite prior descriptions or Runs.
31
+
32
+ ## Shared component and relationship structure
33
+
34
+ Capability and Bound descriptions both contain component nodes and identified,
35
+ typed relationship edges. Relationships carry purpose (why), integration mechanism
36
+ (how), configuration references (owner, setting names and safe documented locations),
37
+ and evidence for each detail. Unknown or conflicting details remain explicit.
38
+ The Bound description retains this useful context and adds configured-target
39
+ claims; it is not merely a list of targets detached from their integrations.
40
+
41
+ Configuration references describe where/how settings are defined, never their
42
+ actual values. Role endpoints and concrete bound targets have distinct identities;
43
+ a successor can change the target without changing the relationship's purpose or
44
+ rewriting its predecessor. The [bounded representation](surface-relationships.md)
45
+ keeps earlier contracts readable and describes compatibility limits.
46
+
47
+ ## Outputs and privacy
48
+
49
+ On an authorized save, provide a concise readable Surface brief, a research HTML
50
+ record and checked structured Surface output in JSON, with openable file links.
51
+ Working Markdown notes remain useful intermediate artifacts. The brief may be
52
+ included in the readable record; an additional file is not mandatory. Outputs
53
+ identify their description type, scope, evidence, gaps and recommended next step.
54
+
55
+ For a Bound Surface, retain the target's useful role/product identity and the
56
+ fact of its configured relationship. Omit or mask sensitive URLs, IPs, usernames,
57
+ passwords and keys. Do not put those values in generated notes, HTML, JSON,
58
+ filenames, validation errors or retained evidence. Use opaque identities that do
59
+ not encode sensitive values; do not copy a raw value merely to redact it later.
60
+ An inability to inspect a source safely is a coverage limit, not permission to
61
+ collect secrets. Existing workspace/source secrets are not copied into output.
62
+
63
+ No raw-secret store is required or introduced. Credentials remain in their
64
+ existing stores. Recoverable exact settings and secure storage would require a
65
+ separate future design. Observed Surface is deferred, including actual settings
66
+ capture and live/runtime inspection; no continuous synchronization is promised.
67
+
68
+ ## Contract boundary and implementation choices
69
+
70
+ The [current experimental contract](contracts.md) represents selected definitions
71
+ and leaves deployment bindings outside its profile. This document does not
72
+ silently extend that contract or relabel existing definitions as Bound Surfaces.
73
+ The [shared relationship contract 0.3](surface-relationships.md) defines the
74
+ representation and versioning for #50; installed artifact production remains #51.
75
+ Capability alternatives have an explicit representation; mutually exclusive possibilities must not be flattened
76
+ into a selected composition. Preserve shared identities and exact evidence links.
77
+
78
+ Reuse existing codecs, validators, HTML rendering and revision checks where
79
+ suitable. The builder selects file layout, helper/API integration and the bounded
80
+ representation, documenting compatibility limits and checking them against the
81
+ agreed meanings. JSON is the first structured representation. YAML expansion,
82
+ other hosts, Lab integration, deployment changes and release work are deferred.
83
+ The first supported acceptance environment is the installed skill in Codex.
84
+ The skill is standalone: it must not invoke or depend on the `n8r-surface` CLI.
85
+ Artifact production and checks must work through the host and bundled skill
86
+ resources independently of that executable.
87
+
88
+ ## Intent and verification
89
+
90
+ **State X:** an identified installed skill, a selected supported workspace and
91
+ accessible, permitted docs/code artifacts with recorded source identity. Begin
92
+ with no instance binding evidence. Reuse established workspace setup; record any
93
+ missing prerequisite as Blocked. Before implementation, attempt the current
94
+ installed path and retain actual behavior or its prerequisite blocker.
95
+
96
+ **Input Y:** ask for a Capability Surface and saved artifacts; then supply permitted
97
+ instance configuration, a human correction and a second source, and request a
98
+ Bound Surface. In a fresh chat, reopen the saved artifacts and revise one binding.
99
+
100
+ **Outcome Z:** useful readable and checked structured outputs, supported
101
+ capabilities separated from configured relationships, traceable claims and gaps,
102
+ privacy-preserving output, and a successor retaining identities and history.
103
+ Only authorized workspace artifacts change. Source files and prior outputs remain
104
+ unchanged; no configuration, services, credentials or runtime are modified.
105
+
106
+ ### Maintainer preparation and technical evidence
107
+
108
+ - Identify the installed candidate revision/digests, host/model, source revisions
109
+ and initial workspace inventory. Use the established installation procedure in
110
+ [the skill guide](researcher-skill.md).
111
+ - Prepare permitted source packs for two unrelated products, including incomplete
112
+ evidence, a second source and a known configuration change. Synthetic sensitive
113
+ sentinels allow exact leak detection without using real secrets.
114
+ - Exercise the actual installed skill; do not seed findings and claim the
115
+ Researcher produced them. Independently read saved bytes, sample consequential
116
+ claims against sources, run contract/reference/successor checks and compare
117
+ prior-file hashes. Scan all generated files and retained evidence for sentinels.
118
+ - Keep source transmission within authorized access. Retain private evidence
119
+ outside the public repository; publish only sanitized summaries and fixtures.
120
+ - Leave malformed data, reference failures, failed saves and preservation cases
121
+ to focused automation. Fixture checks do not prove research quality or host
122
+ acceptance. Record expected, observed, verified and unproved outcomes separately.
123
+
124
+ ### Human verification task list
125
+
126
+ These are the target interactions, to be exercised against the installed candidate
127
+ once implemented. They have not been rehearsed as passing product behavior by
128
+ this documentation increment. The maintainer supplies the selected workspace and
129
+ source pack; the tester does not need to choose a schema or run validators.
130
+
131
+ - [ ] Open the prepared workspace in Codex and select the installed Researcher.
132
+ Ask: “Use the supplied docs/code to create a Capability Surface. Save the brief,
133
+ research HTML and structured Surface in this workspace.” Open the returned
134
+ links. Expect supported possibilities and explicit gaps, without asserted
135
+ instance bindings; the files must exist and answer the question.
136
+ - [ ] Supply the prepared instance configuration and second source. Ask: “Create
137
+ a Bound Surface from this evidence. Configuration is sufficient to mark a
138
+ relationship bound. Omit sensitive setting values.” Expect the evidenced
139
+ targets, such as OIDC and MongoDB Atlas, with no runtime-use claim or leaked
140
+ synthetic sensitive values. Missing/conflicting evidence must stay visible.
141
+ - [ ] Give the prepared human correction. Expect a scoped decision/correction
142
+ without erasure of contrary source evidence. Authorize a saved successor.
143
+ - [ ] Start a fresh chat with the same workspace and the saved artifact selected.
144
+ Supply the prepared changed-binding evidence. Ask: “Reopen this Surface and
145
+ save a successor reflecting this binding change.” Expect retained component
146
+ identities, a clear change and predecessor reference, and unchanged old files.
147
+ - [ ] Repeat the bounded journey with the unrelated source pack. Expect the same
148
+ meaningful distinctions without product-specific implementation or user repair.
149
+ - [ ] Report **Pass / Fail / Blocked**, the output links, which step failed or was
150
+ blocked, and whether the outputs were useful and understandable. Wording,
151
+ timestamps and generated IDs may vary; unsupported bindings, secret leakage,
152
+ lost decisions/history, broken files or false success claims are failures.
153
+
154
+ Agent rehearsal and human acceptance are separate records. Fresh chats do not
155
+ prove enforced memory/tool isolation. Retain owned trial artifacts for review;
156
+ cleanup is a separate authorized action and must not touch borrowed source data.
157
+
158
+ ## Three delivery tasks
159
+
160
+ 1. [#50 — Descriptions and contract](https://github.com/injectionator/n8r-surface/issues/50):
161
+ capture this intent, then define bounded representations, versioning and
162
+ synthetic examples with meaningful checks. See the implemented
163
+ [contract and human check](surface-relationships.md).
164
+ 2. [#51 — Installed-skill artifact production and revision](https://github.com/injectionator/n8r-surface/issues/51):
165
+ implement generation, validation, privacy, saving and fresh-chat continuation
166
+ using workspace evidence. Depends on #50.
167
+ 3. [#52 — Installed-workflow acceptance](https://github.com/injectionator/n8r-surface/issues/52):
168
+ exercise both products, inspect outputs independently, fix observed failures
169
+ and record human acceptance. Depends on #51.
170
+
171
+ Creating these tasks authorizes neither their implementation nor review readiness,
172
+ merge or release. Broader #17 host/live/consumer scope remains separately visible;
173
+ finishing this bounded delivery does not automatically complete the parent issue.
@@ -0,0 +1,231 @@
1
+ # Shared Surface relationships contract 0.3
2
+
3
+ Capability and Bound Surfaces describe one graph vocabulary: **component nodes
4
+ and identified relationship edges with their own data and evidence**. A connection
5
+ must explain why it exists, how it integrates and where configuration is defined,
6
+ as far as the sources establish. Size/depth remains independent of description kind.
7
+
8
+ This is the revised bounded #50 contract, following human verification of the
9
+ [earlier 0.2 increment](surface-description-contract.md). It implements a reusable
10
+ structure, not a universal ontology or a real-product integration claim. The
11
+ [synthetic examples](../../examples/researcher/relationships/README.md) are fictional;
12
+ their setting names and data purposes are not findings about LibreChat.
13
+
14
+ ## Common graph and relationship data
15
+
16
+ Both kinds use `contract: "n8r.surface/0.3"`, the existing envelope, `records`,
17
+ `vocabularies`, `nodes`, `relationships`, `coverage` and `gaps`. Nodes remain
18
+ `{id, label, type: {vocabulary, term}}`. A shared component retains the same ID.
19
+ Relationships can share endpoints, form cycles or connect a node to itself.
20
+
21
+ Every relationship has these required fields:
22
+
23
+ | Field | Meaning |
24
+ | --- | --- |
25
+ | `id` | Stable identity of the integration relationship. |
26
+ | `from`, `to` | Local component IDs identifying source and target integration roles. |
27
+ | `type` | `{vocabulary, term}` giving the relationship's meaning, such as `persists-data` or `authenticates-via`. |
28
+ | `purpose` | Why the source uses the target; which task or data requires this integration. |
29
+ | `integration` | How it connects: driver, API, protocol or other evidenced mechanism. |
30
+ | `configuration` | Safe references identifying who owns the configuration, its mechanism, setting names and documented locations. |
31
+ | `basis` | Research finding references establishing support for this relationship. |
32
+ | `conditions`, `note` | Material conditions, applicability and remaining limits. |
33
+
34
+ `purpose`, `integration` and `configuration` each have the same detail shape:
35
+ `{state, claims, note}`. Each claim is `{value, basis}` with nonempty basis entries
36
+ `{record, revision, items}`. Purpose/integration values are nonempty text;
37
+ configuration values are arrays of configuration references. This keeps evidence
38
+ on the fact it establishes rather than implying that one citation proves every
39
+ property of an edge.
40
+
41
+ | Detail state | Claims |
42
+ | --- | --- |
43
+ | `known` | Exactly one agreed value, supported by known findings. |
44
+ | `conflicting` | At least two distinct sourced claims with differing values or known-versus-absent assertions; no selected answer. |
45
+ | `absent` | Exactly one sourced, scoped absence claim; the note explains what is absent. |
46
+ | `unknown`, `omitted`, `redacted`, `out-of-scope` | No values; the note explains the knowledge boundary. |
47
+
48
+ A detail finding's `subject` is the relationship ID, `property` is exactly
49
+ `purpose`, `integration` or `configuration`, and its claim value matches the
50
+ corresponding detail claim. All competing values in cited findings must remain
51
+ visible. Known/absent details must agree with the finding state. A conflicting
52
+ detail can cite conflicting findings, multiple known findings with differing
53
+ values, or known and absent findings. Opposed known/absent assertions can use the
54
+ same value; keep separate claims/basis links so the source states remain visible.
55
+ Two agreeing known sources do not establish conflict. Reference verification also checks uncited findings for the same
56
+ relationship/property in the description's referenced research, preventing a
57
+ contradiction from disappearing through selective basis links. Unknown details
58
+ can remain conservative without asserting absence.
59
+
60
+ A type vocabulary supplies the meaning of its terms; it does not substitute for
61
+ purpose, mechanism or configuration evidence. Unknown terms remain opaque, as in
62
+ prior profiles. A broader ontology and executable constraint language are not
63
+ required to represent these relationship facts.
64
+
65
+ ## Safe configuration references
66
+
67
+ A configuration reference is `{owner, mechanism, key, location}`:
68
+
69
+ - `owner` resolves to a local component node; configuration belongs to that
70
+ component, not implicitly to whichever endpoint a reader guesses.
71
+ - `mechanism` is `environment-variable`, `file-key`, `argument`, `admin-setting`
72
+ or `code` in this bounded vocabulary.
73
+ - `key` identifies the setting or entry, such as the fictional `CHAT_STORE_URI`.
74
+ - `location` is a safe relative documentation/source location, such as
75
+ `config/assistant.env.example`. For an environment variable or admin setting,
76
+ this can point to the source documenting where it is configured.
77
+
78
+ Locations cannot be absolute paths, URLs, traversal paths or contain query/fragment
79
+ syntax. Use the research source locator for a section/line/key within the document.
80
+ A location is descriptive metadata, not authority to access a file or proof that
81
+ it exists on a user's deployment. Its source finding links to the exact research
82
+ revision, source digest and locator; a host resolves the supplied source context.
83
+ If the owner/name/location cannot be described safely, retain an unknown/redacted
84
+ configuration detail and explain the limit.
85
+
86
+ There is **no actual setting value** field. A known configuration detail says where
87
+ and how configuration is defined; it does not mean the instance is configured.
88
+ Passwords, connection strings, IPs, private deployment paths and account names
89
+ must not appear in fields, prose, filenames or retained evidence. The checker
90
+ rejects unknown setting-value fields and unsafe location syntax, but is not a
91
+ secret detector. Producers remain responsible for safe collection and output
92
+ inspection. No raw-secret store is introduced.
93
+
94
+ ## Capability and Bound distinctions
95
+
96
+ A Capability relationship adds `state` using the existing possible/unknown/omitted/
97
+ redacted/absent/out-of-scope/conflicting support states. Support basis retains
98
+ [0.2's subject/property/target rules](surface-description-contract.md#capability-surface).
99
+ `exclusiveGroups` now names relationship IDs. Knowing why/how to integrate does
100
+ not assert that any instance selected that relationship.
101
+
102
+ A Bound Surface pins one Capability revision and identifies one opaque `instance`.
103
+ Every included relationship uses the same ID, `from`, `to` and `type` as its pinned
104
+ Capability edge. It repeats the useful relationship details with its own exact
105
+ research references, so the Bound file can answer why/how/where without forcing
106
+ a reader to reconstruct another document. Details may reflect instance-specific
107
+ facts or corrections when separately evidenced; the pinned Capability stays intact.
108
+
109
+ Instead of `state`, each Bound relationship has a `binding` annotation:
110
+ `{state, claims, decisions, note}`. These retain [0.2 binding semantics](surface-description-contract.md#bound-surface):
111
+ one configured target, multiple conflicting targets, or no claims for unknown/
112
+ omitted/redacted/out-of-scope. Claims are `{target, basis}`; targets resolve to local
113
+ nodes. Decisions refer separately to human decisions, never substitute for source
114
+ configuration evidence, and cannot erase contradictions. Missing evidence is not
115
+ unbound. Configuration evidence is sufficient; no runtime-use claim follows.
116
+
117
+ **Role endpoint versus configured target:** a database relationship's `to` may
118
+ identify the MongoDB component role, while `binding.claims[].target` identifies
119
+ MongoDB Atlas for this instance. Both are explicit local component nodes. The
120
+ relationship keeps its identity and purpose when a successor changes the binding
121
+ target to self-hosted MongoDB. A renderer must show the binding annotation/target;
122
+ drawing only `from`/`to` shows the role graph, not the full configured view. Unknown
123
+ or conflicting bindings must not be rendered as selected concrete edges.
124
+
125
+ A Bound file may include only the relevant subset of Capability relationships;
126
+ omission means unspecified, never absent. A configured binding requires a possible
127
+ Capability relationship. Exclusive groups still prevent selecting incompatible
128
+ options together. Same-ID nodes must retain their type across the linked graphs.
129
+
130
+ ## Versioning, checking and revision limits
131
+
132
+ This shape is explicitly `0.3`, not a silent alteration of `0.2`. Existing `0.1`
133
+ selected definitions and `0.2` descriptions remain readable with unchanged shapes
134
+ and retained fixtures. `0.3` readers reject top-level `capabilities`/`bindings` and
135
+ require the shared `relationships` representation. Older readers reject `0.3`.
136
+ There is no automatic conversion or downgrade: invented metadata, dropped
137
+ property-level evidence and flattened conflicts would be losses. Preserve the
138
+ original and review any projection separately. These remain descriptions within
139
+ one AI Surface Model, not separate models.
140
+
141
+ Use the existing APIs: `validateArtefact`, `encode`/`decode` (JSON only),
142
+ `verifyReferences` and `verifySuccessor`. Local validation checks fields, states,
143
+ node endpoints, config owners and declared research references. Reference checks
144
+ require the exact research/Capability revisions and digests, evidence roles and
145
+ matching values. No network access or filesystem writes occur. Passing checks
146
+ cannot establish that source prose is true or complete.
147
+
148
+ Successors retain node types and relationship endpoints/type for retained IDs.
149
+ Description kind, instance identity and Capability-artifact identity cannot change.
150
+ Metadata can gain evidence or corrections in a successor; earlier bytes must remain
151
+ unchanged. Changing a concrete binding target does not change role endpoints.
152
+ Two-snapshot checks do not enforce corpus-wide identity retention or persistence;
153
+ hosts must preserve history and prevent reusing retired IDs for different things.
154
+ The existing 2 MiB/depth-64 codec limits, empty extensions and privacy boundaries
155
+ remain in effect. Observed Surface and actual settings capture remain deferred.
156
+
157
+ ## Human verification task list
158
+
159
+ Open [the new relationship fixtures](../../examples/researcher/relationships/README.md).
160
+ No CLI, inference, credentials or live instance is required for this contract check.
161
+
162
+ - [ ] Open `capability.json`, then find `urn:cap:database` in `relationships`.
163
+ Expect Assistant → MongoDB, type `persists-data`, purpose “Persist conversation
164
+ history and user profiles”, and a MongoDB driver/wire-protocol mechanism.
165
+ - [ ] Inspect that edge's `configuration`. Expect owner `urn:node:app`, mechanism
166
+ `environment-variable`, key `CHAT_STORE_URI`, and location
167
+ `config/assistant.env.example`. Open that supplied file: it documents the name
168
+ and owner without a connection string. Follow the configuration claim's basis
169
+ to `research-r1.json`, then its source/locator. Expect the config source, while
170
+ purpose and integration cite the separate explanatory source pack.
171
+ - [ ] Open `bound-r1.json` and find the same relationship ID. Expect the same
172
+ endpoints and useful integration details plus a **configured** Atlas binding.
173
+ Authentication still has **conflicting** targets and a separate human preference;
174
+ inference purpose/mechanism/configuration and binding remain **unknown**.
175
+ - [ ] Compare `bound-r2.json` and `research-r2.json`. Expect the same relationship,
176
+ role endpoints and purpose, new self-hosted MongoDB target and exact predecessor
177
+ references. The old files retain Atlas. No settings values should appear.
178
+ - [ ] Report **Pass / Fail / Blocked**, filenames and any missing explanation,
179
+ incorrect configuration reference, lost conflict or exposed value. These are
180
+ developer-authored fixtures, not installed Researcher or human acceptance evidence.
181
+
182
+ ### Maintainer preparation and runnable readback
183
+
184
+ From the repository root, use Node.js 22, 24 or 26 and npm. `npm ci` and
185
+ `npm run build` must exit 0; installation uses the registry. Then run:
186
+
187
+ ```sh
188
+ node --input-type=module <<'JS'
189
+ import {readFileSync} from 'node:fs';
190
+ import {decode, verifyReferences, verifySuccessor} from './dist/index.js';
191
+ const read = name => decode(readFileSync(
192
+ `examples/researcher/relationships/${name}.json`, 'utf8'), 'json');
193
+ const context = ['research-r1', 'research-r2', 'capability'].map(read);
194
+ const before = read('bound-r1'), after = read('bound-r2');
195
+ verifyReferences(context[2], context);
196
+ verifyReferences(before, context);
197
+ verifyReferences(after, context);
198
+ verifySuccessor(before, after);
199
+ const edge = before.relationships[0];
200
+ console.log(edge.purpose.claims[0].value);
201
+ const config = edge.configuration.claims[0].value[0];
202
+ console.log(`${config.owner}: ${config.key} at ${config.location}`);
203
+ console.log(`${edge.binding.claims[0].target} -> ${after.relationships[0].binding.claims[0].target}`);
204
+ JS
205
+ ```
206
+
207
+ Expect exit 0 and exactly:
208
+
209
+ ```text
210
+ Persist conversation history and user profiles.
211
+ urn:node:app: CHAT_STORE_URI at config/assistant.env.example
212
+ urn:target:atlas -> urn:target:mongodb
213
+ ```
214
+
215
+ Readback changes no files and needs no cleanup. Different output or a nonzero exit
216
+ fails. `npm test` additionally covers missing/mismatched metadata evidence,
217
+ contradictions, local endpoints/config owners, unsupported fields, privacy,
218
+ revision integrity and the preserved earlier contracts.
219
+
220
+ ## Baseline and acceptance boundary
221
+
222
+ Human inspection of #50 at `18478d7` found the generic `uses` edge insufficient.
223
+ Library readback of its retained `0.2` fixtures confirmed no structured purpose or
224
+ configuration and no Bound `relationships` array. The `0.3` fixtures exercise that
225
+ same task: identify a relationship and read its purpose, mechanism, configuration
226
+ reference and evidence in both descriptions, then read back a revised binding.
227
+
228
+ The installed skill 0.1.9's previously recorded artifact-generation blocker remains
229
+ unchanged. #51 must implement production/checking through the standalone skill,
230
+ without invoking or depending on the `n8r-surface` CLI. #52 owns installed-workflow
231
+ and human acceptance. Library/package checks are not evidence of those outcomes.
@@ -0,0 +1,158 @@
1
+ # Try Researcher candidate 0.1.13
2
+
3
+ **Takeaway: understand what your supplied sources reveal about an AI system,
4
+ and choose the next useful investigation.** Save that understanding, its evidence
5
+ and unanswered questions so you can return to it later.
6
+
7
+ This is an interim test candidate, not a release or security certification.
8
+ It describes and investigates; it does not configure or deploy your system.
9
+ A source checkout shows supported possibilities. Nonsecret configuration can
10
+ establish selected connections; dated runtime evidence is needed to claim use.
11
+
12
+ ## Choose a host
13
+
14
+ | Host | Candidate evidence | Installation effort |
15
+ | --- | --- | --- |
16
+ | Codex CLI | Installed research/save/continuation rehearsed; human acceptance pending. | Existing CLI and sign-in, Node 22/24/26, then three commands below. |
17
+ | Codex desktop / ChatGPT Work | CLI registration is checked; fresh desktop loading and acceptance remain pending. | Maintainer-assisted installation, restart and fresh-chat selection check. |
18
+ | Claude Code | Skill file installation checked; research/save/continuation untested. | Existing Claude Code, Node and Git; one installer command below. |
19
+ | Claude web / desktop Chat | Host supports custom skill ZIP upload; this candidate is untested there. | Upload a skill-shaped ZIP in Customize > Skills and enable it; source access, helper runtime and persistence still need checking. |
20
+
21
+ The instructions use the host's tools and model rather than an OpenAI API client.
22
+ Portability of instructions does not establish equivalent host behavior.
23
+ Claude Code's local filesystem access is distinct from web/desktop Chat's
24
+ execution environment. A local path mentioned in chat does not grant access.
25
+ Cowork is another environment requiring its own rehearsal.
26
+
27
+ For a nontechnical tester today, use an existing Codex installation with
28
+ maintainer help for setup, then follow the short task below. There is no verified
29
+ one-click cross-host installation. Claude's upload route is potentially simpler,
30
+ but is not yet a recommended route for testing this candidate's saved Surfaces.
31
+
32
+ ## Install the pinned Codex candidate
33
+
34
+ Prerequisites: Codex CLI 0.166.0, Git/network access and Node.js 22, 24 or 26.
35
+ Research also needs the host's sign-in and access to the supplied sources.
36
+ From any directory, for a **new** n8r-surface marketplace registration:
37
+
38
+ ```sh
39
+ codex plugin marketplace add injectionator/n8r-surface --ref d0ec3ece555fbcffb9788aed6593f380900e2d25 --json
40
+ codex plugin add n8r-surface@n8r-surface --json
41
+ codex plugin list --marketplace n8r-surface --json
42
+ ```
43
+
44
+ Expect exit 0 for each command and exactly one installed/enabled entry at
45
+ `0.1.13`. These commands fetch GitHub content and write the selected Codex home's
46
+ plugin configuration/cache. They do not install the npm product CLI or research
47
+ the source. Existing registrations may be pinned elsewhere: have the maintainer
48
+ inspect the source before following the [replacement procedure](workspace-installation.md).
49
+ Do not silently replace a tester's existing registration.
50
+
51
+ Restart the desktop host when applicable, open a fresh chat and select
52
+ **n8r-surface Researcher**. Missing selection or an unexpected version is Blocked;
53
+ CLI installation alone does not pass this desktop check.
54
+
55
+ ## Can I use npx?
56
+
57
+ Yes, for a standalone skill installation through the third-party
58
+ [Vercel Labs skills installer](https://github.com/vercel-labs/skills).
59
+ This is different from running `npx @n8r/surface`, which starts the separate npm
60
+ command and does not install the Researcher skill.
61
+
62
+ The following exact command was exercised with `skills` 1.8.1 and Node 26.13.0.
63
+ Run it in a new trial project folder, with Git/network access, for **Claude Code**:
64
+
65
+ ```sh
66
+ env DISABLE_TELEMETRY=1 npx --yes skills@1.8.1 add https://github.com/injectionator/n8r-surface/tree/d0ec3ece555fbcffb9788aed6593f380900e2d25/plugins/n8r-surface/skills/research --skill research --agent claude-code --copy --yes
67
+ ```
68
+
69
+ Expect exit 0, `.claude/skills/research/` and `skills-lock.json` in that folder.
70
+ All 18 copied skill files matched the pinned source in the installation check.
71
+ It downloads/runs the installer through npm's cache and fetches the source from
72
+ GitHub; telemetry is disabled by the process-scoped variable. It copies the skill,
73
+ not plugin manifests, icons or root licence files. Do not redistribute that bare
74
+ copy as the complete licensed plugin package. Do not run over an existing
75
+ same-named `research` skill. This project-scoped command does not register a
76
+ Codex plugin or install into Claude web/desktop Chat.
77
+
78
+ In Claude Code opened in that folder, `/research` is the host-documented invocation
79
+ for a standalone skill named `research`. Actual candidate invocation, source
80
+ research, helper execution and fresh-session continuation remain **untested**.
81
+ Do not treat the install success as a support claim. Other agent targets offered
82
+ by the installer were not rehearsed here.
83
+
84
+ ## Tester task: one useful explanation
85
+
86
+ Maintainer preparation: verify installation and provide a readable source pack
87
+ and a writable output folder. Reuse the [working manual](skill-manual.md) and
88
+ [recorded rehearsal](skill-bom-verification.md); no services need starting.
89
+ For a synthetic trial, provide [Lumen's guide](../../examples/researcher/sources/lumen-guide.md)
90
+ and [settings](../../examples/researcher/sources/lumen-settings.md).
91
+
92
+ - [ ] Open a fresh chat with the installed Researcher selected and supply the
93
+ source files. Ask:
94
+
95
+ > Explain what these sources reveal about the AI system. Keep the first answer
96
+ > short: Sources provided (distinguish inspected from merely supplied), Summary
97
+ > (link the evidence), and Now what? (one useful next action). Save the Surface
98
+ > in the output folder I supplied. Keep deployment choices unknown unless the
99
+ > supplied evidence establishes them. Do not execute the source or start services.
100
+
101
+ Expect an evidence-linked explanation, explicit coverage limits and links to
102
+ the saved brief, map and journal. For Lumen, retain conflicting batch maxima
103
+ 10 and 25 and the unknown model version; do not silently choose one value.
104
+ - [ ] Open the linked files. Follow one evidence reference back to the supplied
105
+ source. Expect the cited claim to be supported and unsupported selections to
106
+ remain unknown. The current generated brief is longer than the requested chat
107
+ summary; report whether that obstructs understanding.
108
+ - [ ] Answer the Researcher's question or redirect it, then ask it to save.
109
+ Expect a new numbered revision retaining your decision and the earlier files.
110
+ - [ ] Open a fresh chat with the same skill. Supply the latest
111
+ `surface.cdx.json` and source access. Ask: “Continue this Surface. What did I
112
+ choose, what remains uncertain, and what should we investigate next?” Expect
113
+ the choice and gaps to survive; unavailable evidence must be acknowledged.
114
+
115
+ Return **Pass / Fail / Blocked**, the host/version, what you asked, one useful
116
+ finding, and any missing or confusing result. Include nonsecret output references.
117
+ Pass means useful explanation, inspectable evidence and preserved continuation;
118
+ fabrication, lost choices or overwritten predecessors are failures. Missing host,
119
+ source or runtime access is Blocked. Wording, filenames and findings may vary.
120
+ Human acceptance is separate from the earlier agent rehearsals.
121
+
122
+ Optional cleanup: use `codex plugin remove n8r-surface@n8r-surface --json` for
123
+ this Codex installation, or remove only the newly created Claude trial folder.
124
+ Keep your research outputs. Do not delete pre-existing skills or project files.
125
+
126
+ ## Package identity and remaining work
127
+
128
+ The retained complete plugin ZIP is `n8r-surface-skill-0.1.13.zip`, containing
129
+ 24 files under `n8r-surface/`, including licences and notices. SHA-256:
130
+
131
+ ```text
132
+ bdab66880bc1763c73ee30d98d3b188a4c8ae2af410f03b364785fbcc58640dd
133
+ ```
134
+
135
+ It matches commit `d0ec3ece555fbcffb9788aed6593f380900e2d25` byte for byte.
136
+ This plugin-shaped ZIP is **not** a verified Claude custom-skill upload ZIP;
137
+ Claude expects a skill folder with SKILL.md. No upload or publication was done.
138
+
139
+ On 13 November 2026, an isolated Codex home fetched that commit and installed
140
+ 0.1.13 with all 24 files matching; a separate trial folder exercised the npx
141
+ command with all 18 skill files matching. Both commands exited 0. The prior
142
+ installed research evidence is linked above; no new research acceptance is claimed.
143
+
144
+ The proposed primary presentation is **Sources provided / Summary / Now what?**,
145
+ with expandable inspected-source detail and links to deeper evidence. This was
146
+ reviewed as an editorial preview, not implemented in the generator. Candidate
147
+ 0.1.13 still generates inventory, connections and gaps. Preserving an authored,
148
+ evidence-linked summary in the authoritative Surface and regenerating it remains
149
+ follow-up work; this package does not promise that presentation is already saved.
150
+
151
+ ## Official host references
152
+
153
+ Reviewed 13 November 2026; host support does not establish candidate acceptance:
154
+
155
+ - [OpenAI plugin packaging and marketplaces](https://developers.openai.com/plugins/build/plugins)
156
+ - [Claude Code skills, invocation and local locations](https://code.claude.com/docs/en/skills)
157
+ - [Claude custom skill upload and prerequisites](https://support.claude.com/en/articles/12512180-use-skills-in-claude)
158
+ - [Vercel Labs installer commands and scope](https://github.com/vercel-labs/skills/blob/main/docs/commands.md)