@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,300 @@
1
+ {
2
+ "id": "urn:demo:relationship-research",
3
+ "title": "Synthetic relationship evidence",
4
+ "scope": "Synthetic role/product identities only; runtime unverified.",
5
+ "revision": {
6
+ "id": "r1",
7
+ "parent": null,
8
+ "createdAt": "2026-11-08T00:00:00Z",
9
+ "author": "Synthetic author",
10
+ "reason": "Initial shared-relationship fixture"
11
+ },
12
+ "extensions": {},
13
+ "contract": "n8r.research/0.1",
14
+ "sources": [
15
+ {
16
+ "id": "urn:source:summary",
17
+ "location": "sources.md",
18
+ "version": "synthetic-relationships-1",
19
+ "digest": "sha256:cb9498a53d65fb16c16b7ac297b84b2d14a825297012bec9ac07df083e3c5647",
20
+ "inspectedAt": "2026-11-08T00:00:00Z",
21
+ "coverage": [
22
+ {
23
+ "path": "sources.md",
24
+ "status": "inspected",
25
+ "note": "Sanitized synthetic source pack, not raw configuration."
26
+ }
27
+ ]
28
+ },
29
+ {
30
+ "id": "urn:source:config",
31
+ "location": "config/assistant.env.example",
32
+ "version": "synthetic-1",
33
+ "digest": "sha256:d575d918e3e60fa1bf4490f7d6ceddafdcf0dba56b41b0e566a3adc8d88fe256",
34
+ "inspectedAt": "2026-11-08T00:00:00Z",
35
+ "coverage": [
36
+ {
37
+ "path": "config/assistant.env.example",
38
+ "status": "inspected",
39
+ "note": "Synthetic setting-name documentation only."
40
+ }
41
+ ]
42
+ }
43
+ ],
44
+ "findings": [
45
+ {
46
+ "id": "urn:f:database",
47
+ "subject": "urn:node:app",
48
+ "property": "supports",
49
+ "state": "known",
50
+ "note": "Synthetic source assertion; not runtime evidence.",
51
+ "claims": [
52
+ {
53
+ "value": "urn:node:mongodb",
54
+ "evidence": [
55
+ {
56
+ "source": "urn:source:summary",
57
+ "locator": "Product guide"
58
+ }
59
+ ]
60
+ }
61
+ ]
62
+ },
63
+ {
64
+ "id": "urn:f:oidc",
65
+ "subject": "urn:node:app",
66
+ "property": "supports",
67
+ "state": "known",
68
+ "note": "Synthetic source assertion; not runtime evidence.",
69
+ "claims": [
70
+ {
71
+ "value": "urn:node:oidc",
72
+ "evidence": [
73
+ {
74
+ "source": "urn:source:summary",
75
+ "locator": "Product guide"
76
+ }
77
+ ]
78
+ }
79
+ ]
80
+ },
81
+ {
82
+ "id": "urn:f:saml",
83
+ "subject": "urn:node:app",
84
+ "property": "supports",
85
+ "state": "known",
86
+ "note": "Synthetic source assertion; not runtime evidence.",
87
+ "claims": [
88
+ {
89
+ "value": "urn:node:saml",
90
+ "evidence": [
91
+ {
92
+ "source": "urn:source:summary",
93
+ "locator": "Product guide"
94
+ }
95
+ ]
96
+ }
97
+ ]
98
+ },
99
+ {
100
+ "id": "urn:f:database-bound",
101
+ "subject": "urn:instance:demo",
102
+ "property": "urn:cap:database",
103
+ "state": "known",
104
+ "note": "Synthetic source assertion; not runtime evidence.",
105
+ "claims": [
106
+ {
107
+ "value": "urn:target:atlas",
108
+ "evidence": [
109
+ {
110
+ "source": "urn:source:summary",
111
+ "locator": "Sanitized instance configuration summary, revision 1"
112
+ }
113
+ ]
114
+ }
115
+ ]
116
+ },
117
+ {
118
+ "id": "urn:f:identity",
119
+ "subject": "urn:instance:demo",
120
+ "property": "urn:cap:oidc",
121
+ "state": "conflicting",
122
+ "note": "Synthetic source assertion; not runtime evidence.",
123
+ "claims": [
124
+ {
125
+ "value": "urn:target:oidc",
126
+ "evidence": [
127
+ {
128
+ "source": "urn:source:summary",
129
+ "locator": "Sanitized instance configuration summary, revision 1"
130
+ }
131
+ ]
132
+ },
133
+ {
134
+ "value": "urn:target:saml",
135
+ "evidence": [
136
+ {
137
+ "source": "urn:source:summary",
138
+ "locator": "Sanitized instance configuration summary, revision 1"
139
+ }
140
+ ]
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "id": "urn:f:database-purpose",
146
+ "subject": "urn:cap:database",
147
+ "property": "purpose",
148
+ "state": "known",
149
+ "note": "Synthetic source statement; no actual settings.",
150
+ "claims": [
151
+ {
152
+ "value": "Persist conversation history and user profiles.",
153
+ "evidence": [
154
+ {
155
+ "source": "urn:source:summary",
156
+ "locator": "Database integration"
157
+ }
158
+ ]
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "id": "urn:f:database-integration",
164
+ "subject": "urn:cap:database",
165
+ "property": "integration",
166
+ "state": "known",
167
+ "note": "Synthetic source statement; no actual settings.",
168
+ "claims": [
169
+ {
170
+ "value": "MongoDB client driver using the MongoDB wire protocol.",
171
+ "evidence": [
172
+ {
173
+ "source": "urn:source:summary",
174
+ "locator": "Database integration"
175
+ }
176
+ ]
177
+ }
178
+ ]
179
+ },
180
+ {
181
+ "id": "urn:f:database-configuration",
182
+ "subject": "urn:cap:database",
183
+ "property": "configuration",
184
+ "state": "known",
185
+ "note": "Synthetic source statement; no actual settings.",
186
+ "claims": [
187
+ {
188
+ "value": [
189
+ {
190
+ "owner": "urn:node:app",
191
+ "mechanism": "environment-variable",
192
+ "key": "CHAT_STORE_URI",
193
+ "location": "config/assistant.env.example"
194
+ }
195
+ ],
196
+ "evidence": [
197
+ {
198
+ "source": "urn:source:config",
199
+ "locator": "CHAT_STORE_URI comment"
200
+ }
201
+ ]
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "id": "urn:f:oidc-purpose",
207
+ "subject": "urn:cap:oidc",
208
+ "property": "purpose",
209
+ "state": "known",
210
+ "note": "Synthetic source statement; no actual settings.",
211
+ "claims": [
212
+ {
213
+ "value": "Authenticate users through an identity service.",
214
+ "evidence": [
215
+ {
216
+ "source": "urn:source:summary",
217
+ "locator": "Authentication integration"
218
+ }
219
+ ]
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "id": "urn:f:oidc-integration",
225
+ "subject": "urn:cap:oidc",
226
+ "property": "integration",
227
+ "state": "known",
228
+ "note": "Synthetic source statement; no actual settings.",
229
+ "claims": [
230
+ {
231
+ "value": "OpenID Connect",
232
+ "evidence": [
233
+ {
234
+ "source": "urn:source:summary",
235
+ "locator": "Authentication integration"
236
+ }
237
+ ]
238
+ }
239
+ ]
240
+ },
241
+ {
242
+ "id": "urn:f:saml-purpose",
243
+ "subject": "urn:cap:saml",
244
+ "property": "purpose",
245
+ "state": "known",
246
+ "note": "Synthetic source statement; no actual settings.",
247
+ "claims": [
248
+ {
249
+ "value": "Authenticate users through an identity service.",
250
+ "evidence": [
251
+ {
252
+ "source": "urn:source:summary",
253
+ "locator": "Authentication integration"
254
+ }
255
+ ]
256
+ }
257
+ ]
258
+ },
259
+ {
260
+ "id": "urn:f:saml-integration",
261
+ "subject": "urn:cap:saml",
262
+ "property": "integration",
263
+ "state": "known",
264
+ "note": "Synthetic source statement; no actual settings.",
265
+ "claims": [
266
+ {
267
+ "value": "SAML 2.0",
268
+ "evidence": [
269
+ {
270
+ "source": "urn:source:summary",
271
+ "locator": "Authentication integration"
272
+ }
273
+ ]
274
+ }
275
+ ]
276
+ }
277
+ ],
278
+ "alternatives": [
279
+ {
280
+ "id": "urn:option:oidc",
281
+ "title": "Prefer OIDC",
282
+ "findings": [
283
+ "urn:f:identity"
284
+ ],
285
+ "requirements": []
286
+ }
287
+ ],
288
+ "decisions": [
289
+ {
290
+ "id": "urn:decision:oidc",
291
+ "alternative": "urn:option:oidc",
292
+ "choice": "selected",
293
+ "reason": "Synthetic human preference; conflict unresolved.",
294
+ "by": "Synthetic reviewer",
295
+ "at": "2026-11-08T00:00:00Z"
296
+ }
297
+ ],
298
+ "questions": [],
299
+ "notes": []
300
+ }
@@ -0,0 +1,188 @@
1
+ {
2
+ "bomFormat": "CycloneDX",
3
+ "specVersion": "1.7",
4
+ "serialNumber": "urn:uuid:94141625-a8d3-4cec-984a-c46be305058d",
5
+ "version": 1,
6
+ "metadata": {
7
+ "timestamp": "2026-11-13T12:00:00Z"
8
+ },
9
+ "components": [
10
+ {
11
+ "bom-ref": "app",
12
+ "type": "application",
13
+ "name": "Synthetic Assistant"
14
+ },
15
+ {
16
+ "bom-ref": "model",
17
+ "type": "machine-learning-model",
18
+ "name": "Synthetic Model"
19
+ }
20
+ ],
21
+ "services": [
22
+ {
23
+ "bom-ref": "db-a",
24
+ "name": "Database A"
25
+ },
26
+ {
27
+ "bom-ref": "db-b",
28
+ "name": "Database B"
29
+ },
30
+ {
31
+ "bom-ref": "db-c",
32
+ "name": "Database C"
33
+ },
34
+ {
35
+ "bom-ref": "db-d",
36
+ "name": "Database D"
37
+ }
38
+ ],
39
+ "dependencies": [
40
+ {
41
+ "ref": "app",
42
+ "dependsOn": [
43
+ "db-b"
44
+ ]
45
+ }
46
+ ],
47
+ "compositions": [
48
+ {
49
+ "aggregate": "unknown"
50
+ }
51
+ ],
52
+ "annotations": [
53
+ {
54
+ "bom-ref": "evidence-support",
55
+ "subjects": [
56
+ "app",
57
+ "db-a",
58
+ "db-b",
59
+ "db-c",
60
+ "db-d"
61
+ ],
62
+ "annotator": {
63
+ "individual": {
64
+ "name": "Researcher"
65
+ }
66
+ },
67
+ "timestamp": "2026-11-13T12:00:00Z",
68
+ "text": "The synthetic source describes four supported database alternatives. This does not establish a selected deployment."
69
+ },
70
+ {
71
+ "bom-ref": "evidence-selection",
72
+ "subjects": [
73
+ "app",
74
+ "db-b"
75
+ ],
76
+ "annotator": {
77
+ "individual": {
78
+ "name": "Researcher"
79
+ }
80
+ },
81
+ "timestamp": "2026-11-13T12:00:00Z",
82
+ "text": "A synthetic safe configuration projection identifies database B; connection values were not retained."
83
+ },
84
+ {
85
+ "bom-ref": "decision-1",
86
+ "subjects": [
87
+ "app"
88
+ ],
89
+ "annotator": {
90
+ "individual": {
91
+ "name": "User"
92
+ }
93
+ },
94
+ "timestamp": "2026-11-13T12:00:00Z",
95
+ "text": "Investigate storage before model hosting."
96
+ }
97
+ ],
98
+ "externalReferences": [
99
+ {
100
+ "type": "evidence",
101
+ "url": "synthetic-source-pack",
102
+ "comment": "Synthetic source pack; version 1; inspected support and safe projection only.",
103
+ "hashes": [
104
+ {
105
+ "alg": "SHA-256",
106
+ "content": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
107
+ }
108
+ ]
109
+ }
110
+ ],
111
+ "citations": [
112
+ {
113
+ "bom-ref": "citation-1",
114
+ "pointers": [
115
+ "/annotations/0/text"
116
+ ],
117
+ "timestamp": "2026-11-13T12:00:00Z",
118
+ "attributedTo": "app",
119
+ "note": "Synthetic fixture attribution, not real product evidence."
120
+ }
121
+ ],
122
+ "properties": [
123
+ {
124
+ "name": "n8r:surface:profile",
125
+ "value": "1"
126
+ },
127
+ {
128
+ "name": "n8r:surface:objective",
129
+ "value": "Understand storage choices and the selected connection."
130
+ },
131
+ {
132
+ "name": "n8r:surface:scope",
133
+ "value": "Synthetic assistant; no live runtime access."
134
+ },
135
+ {
136
+ "name": "n8r:surface:relationship",
137
+ "value": "{\"id\":\"storage-a\",\"from\":\"app\",\"to\":\"db-a\",\"kind\":\"dependency\",\"optionality\":\"alternative\",\"group\":\"storage\",\"support\":\"supported\",\"selection\":\"unknown\",\"observations\":[],\"evidence\":[\"evidence-support\"],\"selectionEvidence\":[],\"purpose\":\"Persist conversation state\",\"mechanism\":\"Database driver\",\"configuration\":[],\"conditions\":[],\"note\":\"Supported alternative; selection of other targets is unestablished.\"}"
138
+ },
139
+ {
140
+ "name": "n8r:surface:relationship",
141
+ "value": "{\"id\":\"storage-b\",\"from\":\"app\",\"to\":\"db-b\",\"kind\":\"dependency\",\"optionality\":\"alternative\",\"group\":\"storage\",\"support\":\"supported\",\"selection\":\"selected\",\"observations\":[],\"evidence\":[\"evidence-support\"],\"selectionEvidence\":[\"evidence-selection\"],\"purpose\":\"Persist conversation state\",\"mechanism\":\"Database driver\",\"configuration\":[\"safe-projection.json: database-kind\"],\"conditions\":[],\"note\":\"Supported alternative; selection of other targets is unestablished.\"}"
142
+ },
143
+ {
144
+ "name": "n8r:surface:relationship",
145
+ "value": "{\"id\":\"storage-c\",\"from\":\"app\",\"to\":\"db-c\",\"kind\":\"dependency\",\"optionality\":\"alternative\",\"group\":\"storage\",\"support\":\"supported\",\"selection\":\"unknown\",\"observations\":[],\"evidence\":[\"evidence-support\"],\"selectionEvidence\":[],\"purpose\":\"Persist conversation state\",\"mechanism\":\"Database driver\",\"configuration\":[],\"conditions\":[],\"note\":\"Supported alternative; selection of other targets is unestablished.\"}"
146
+ },
147
+ {
148
+ "name": "n8r:surface:relationship",
149
+ "value": "{\"id\":\"storage-d\",\"from\":\"app\",\"to\":\"db-d\",\"kind\":\"dependency\",\"optionality\":\"alternative\",\"group\":\"storage\",\"support\":\"supported\",\"selection\":\"unknown\",\"observations\":[],\"evidence\":[\"evidence-support\"],\"selectionEvidence\":[],\"purpose\":\"Persist conversation state\",\"mechanism\":\"Database driver\",\"configuration\":[],\"conditions\":[],\"note\":\"Supported alternative; selection of other targets is unestablished.\"}"
150
+ },
151
+ {
152
+ "name": "n8r:surface:relationship",
153
+ "value": "{\"id\":\"inference\",\"from\":\"app\",\"to\":\"model\",\"kind\":\"integration\",\"optionality\":\"unknown\",\"group\":\"\",\"support\":\"unknown\",\"selection\":\"unknown\",\"observations\":[],\"evidence\":[],\"selectionEvidence\":[],\"purpose\":\"Generate a response\",\"mechanism\":\"Unknown\",\"configuration\":[],\"conditions\":[],\"note\":\"Model serving connection remains uninvestigated.\"}"
154
+ },
155
+ {
156
+ "name": "n8r:surface:entry",
157
+ "value": "{\"id\":\"plan-1\",\"kind\":\"next\",\"title\":\"Inspect storage selection\",\"text\":\"Establish the selected database from a safe configuration projection.\",\"status\":\"done\",\"reason\":\"Projection supplied in this synthetic example.\",\"access\":\"Safe configuration projection\",\"evidence\":[\"evidence-selection\"],\"at\":\"2026-11-13T12:00:00Z\"}"
158
+ },
159
+ {
160
+ "name": "n8r:surface:entry",
161
+ "value": "{\"id\":\"choice-1\",\"kind\":\"decision\",\"title\":\"Storage first\",\"text\":\"Investigate storage before model hosting.\",\"status\":\"active\",\"reason\":\"User priority\",\"access\":\"None\",\"evidence\":[\"decision-1\"],\"at\":\"2026-11-13T12:00:00Z\"}"
162
+ },
163
+ {
164
+ "name": "n8r:surface:entry",
165
+ "value": "{\"id\":\"question-1\",\"kind\":\"question\",\"title\":\"Which service hosts inference?\",\"text\":\"Inspect the serving configuration to identify the model endpoint role.\",\"status\":\"open\",\"reason\":\"Source does not establish this connection.\",\"access\":\"Safe inference configuration\",\"evidence\":[],\"at\":\"2026-11-13T12:00:00Z\"}"
166
+ },
167
+ {
168
+ "name": "n8r:surface:coverage",
169
+ "value": "Only synthetic support and selection sources inspected."
170
+ },
171
+ {
172
+ "name": "n8r:surface:gap",
173
+ "value": "Runtime use has not been observed."
174
+ },
175
+ {
176
+ "name": "n8r:surface:evidence",
177
+ "value": "{\"id\": \"evidence-support\", \"basis\": \"source\", \"sources\": [{\"index\": 0, \"locator\": \"support.md:1-20\"}], \"applicability\": \"Synthetic fixture only.\"}"
178
+ },
179
+ {
180
+ "name": "n8r:surface:evidence",
181
+ "value": "{\"id\": \"evidence-selection\", \"basis\": \"configuration\", \"sources\": [{\"index\": 0, \"locator\": \"safe-projection.json: database-kind\"}], \"applicability\": \"Synthetic fixture only.\"}"
182
+ },
183
+ {
184
+ "name": "n8r:surface:evidence",
185
+ "value": "{\"id\": \"decision-1\", \"basis\": \"user\", \"sources\": [], \"applicability\": \"Synthetic fixture only.\"}"
186
+ }
187
+ ]
188
+ }
@@ -0,0 +1,97 @@
1
+ # Start with what the user has
2
+
3
+ Use this guide when a newcomer asks how to begin, provide sources or establish
4
+ access, or mentions sources this session cannot yet read. It applies across hosts;
5
+ no Lab, prepared workspace, repository attachment or live access is required.
6
+
7
+ ## First useful response
8
+
9
+ Read accessible material before asking for more. A short description is enough
10
+ for a provisional map: identify the reported components and connections, their
11
+ basis and the consequential unknowns. A document's claim remains a document claim.
12
+ If no source is supplied, ask for the easiest starting point: a short description,
13
+ an architecture/deployment excerpt or a repository/document link.
14
+
15
+ Then recommend one useful next source, explain the question it would answer and
16
+ help make it accessible. For example, a deployment note's custom gateway points
17
+ to its endpoint configuration or entrypoint; those can reveal the next component.
18
+ Ask one focused question, not a checklist of every repository, account and host.
19
+ Use facts already supplied rather than making the user repeat them. If the user
20
+ cannot provide that source, offer an easier alternative and retain the partial map.
21
+
22
+ Keep a lightweight source/access record in working notes or the journal:
23
+ source identity, mentioned/available/read/blocked/deferred, actual access route,
24
+ inspected scope and next step. Available means a tool/attachment is present; read
25
+ means a successful scoped read occurred. A blocked source needs its reason and
26
+ consequence, not repeated retries. These are working-note labels, not new BOM
27
+ properties or evidence classifications. Do not turn this record into an intake form.
28
+
29
+ ## Help establish the next access route
30
+
31
+ Discover the current host's relevant tools and supported connection/upload flows.
32
+ Use tools already available within the authorized scope. If a connection is needed,
33
+ explain the smallest supported user action; verify access by reading the selected
34
+ source afterward. Consult current host help or visible UI rather than inventing
35
+ menu names. Installing this skill supplies no repository, SSH or account access.
36
+
37
+ | User's starting point | Useful next action | What to keep explicit |
38
+ | --- | --- | --- |
39
+ | Description or document | Read the supplied text/attachment; follow relevant links or ask for one missing section. | Reported architecture, document date/version and unverified deployment claims. |
40
+ | GitHub or another remote repository | Read selected files through an authorized connector/API or permitted public web access. For private sources, guide the supported host sign-in/connection flow. | A link or sign-in is not a successful repository read; check repository, revision and permitted scope. |
41
+ | Laptop folder | If approved local tools can read it, use the selected folder. Otherwise help the user upload selected files or use a supported connected-computer route. | A web Project's uploaded files are snapshots, not a live folder mount or automatic synchronization. A local path alone is inaccessible remotely. |
42
+ | VPS/SSH clue | Establish target, inspection scope and an available authorized execution route. Host/user/port and an existing connection alias may identify it; ask only for missing details needed next. | An IP or SSH command supplies no credentials, network reachability or shell tool. Existing laptop access is not inherited by a cloud chat. |
43
+ | Existing admin UI/API | Use an approved scoped read interface and the user's supported sign-in handoff. | Public views may reveal only a small part of the setup; diagnostic operations can have side effects. |
44
+
45
+ For laptop uploads, suggest the smallest useful selection: a README section,
46
+ source tree excerpt, deployment manifest with sensitive values removed, or the
47
+ entrypoint named by existing evidence. Explain why each requested file matters.
48
+ Offer an archive only if the host supports inspecting it and the user prefers it;
49
+ do not require the whole repository. Preserve relative paths and ask for revision
50
+ or capture identity when available. Uploads and connected folders are alternatives,
51
+ not mandatory steps or permission to publish code.
52
+
53
+ For a VPS, first determine where commands could run: an authorized tool/service,
54
+ an explicitly connected computer with permitted SSH, or the user's own terminal.
55
+ Only claim SSH capability after checking the actual tools and approved connection.
56
+ Keep authentication in the host's supported flow or existing credential store;
57
+ never request passwords, tokens or private keys in chat or uploads. A key offered
58
+ in chat should be declined with a concrete alternative. Do not disable host-key
59
+ checks, expose SSH publicly or add credentials/agents to make onboarding work.
60
+ If the host cannot provide a supported secure access route, say so and continue
61
+ with available documents/source or the human-assisted route below.
62
+
63
+ ## Human-assisted evidence
64
+
65
+ When direct access is unavailable and the user wants to continue, offer a small
66
+ read-only collection step they can perform in their own environment. Establish
67
+ the target/runtime first. Explain what it reads, the expected safe fields and
68
+ what finding they could support. Filter before output; avoid raw environment,
69
+ connection strings, logs and complete inspection/config dumps. Ask them to review
70
+ for sensitive content before sharing. Do not hide a state change in a diagnostic
71
+ command. An access denial remains a blocker, not a reason to bypass permissions.
72
+
73
+ Treat returned material as user-supplied evidence, with reported target, time,
74
+ command/scope and redactions where available. Do not claim the agent accessed the
75
+ host or independently observed the command. Missing metadata limits the claim;
76
+ keep useful partial findings rather than inventing timestamps or source hashes.
77
+
78
+ ## Saving and returning
79
+
80
+ Research readiness is separate from local workspace creation. Before promising a
81
+ save, check the installed helper, supported Node runtime, writable destination and
82
+ host file-delivery tools. For explicit local workspace setup, use
83
+ [workspace operations](workspace.md); do not run its local-folder procedure merely
84
+ because a user starts research in a web Project.
85
+
86
+ If helper execution and file delivery are available in the cloud, use
87
+ [Surface persistence](cyclonedx.md), read back the outputs and provide the actual
88
+ supported download/attachment links. Distinguish cloud files/downloads from a
89
+ local vault and from a Project source. Do not promise persistence across chats or
90
+ claim an attachment action that has not occurred. Deliver retained evidence with
91
+ the Surface when its relative references need it, or disclose the missing sources.
92
+
93
+ If execution or delivery is unavailable, provide a useful copyable map and notes;
94
+ name the specific blocked save step. Do not call prose a validated saved Surface.
95
+ Explain what the user should retain and supply on return. Reopening starts from
96
+ supplied artifacts and rechecks access; it does not assume local keys, connections
97
+ or research were carried into a fresh session.