@n8r/surface 0.0.0-stage → 0.1.0-experimental.2

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 (96) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE-DOCS +395 -0
  3. package/LICENSING.md +36 -0
  4. package/README.md +181 -2
  5. package/dist/activity.d.ts +16 -0
  6. package/dist/activity.js +44 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +260 -0
  9. package/dist/codec.d.ts +4 -0
  10. package/dist/codec.js +41 -0
  11. package/dist/codex.d.ts +72 -0
  12. package/dist/codex.js +510 -0
  13. package/dist/contracts.d.ts +129 -0
  14. package/dist/contracts.js +1 -0
  15. package/dist/html.d.ts +5 -0
  16. package/dist/html.js +50 -0
  17. package/dist/index.d.ts +7 -0
  18. package/dist/index.js +5 -0
  19. package/dist/notes.d.ts +52 -0
  20. package/dist/notes.js +184 -0
  21. package/dist/portable.d.ts +10 -0
  22. package/dist/portable.js +71 -0
  23. package/dist/revisions.d.ts +2 -0
  24. package/dist/revisions.js +18 -0
  25. package/dist/settings.d.ts +23 -0
  26. package/dist/settings.js +100 -0
  27. package/dist/setup.d.ts +9 -0
  28. package/dist/setup.js +161 -0
  29. package/dist/source-tools.d.ts +102 -0
  30. package/dist/source-tools.js +201 -0
  31. package/dist/startup.d.ts +7 -0
  32. package/dist/startup.js +74 -0
  33. package/dist/surface-draft.d.ts +19 -0
  34. package/dist/surface-draft.js +95 -0
  35. package/dist/surface-instructions.d.ts +2 -0
  36. package/dist/surface-instructions.js +23 -0
  37. package/dist/surface-store.d.ts +36 -0
  38. package/dist/surface-store.js +181 -0
  39. package/dist/validate.d.ts +4 -0
  40. package/dist/validate.js +184 -0
  41. package/docs/n8r-surface/README.md +133 -0
  42. package/docs/n8r-surface/codex-research-transcript.md +51 -0
  43. package/docs/n8r-surface/codex-research-verification.md +176 -0
  44. package/docs/n8r-surface/command-outcomes.md +564 -0
  45. package/docs/n8r-surface/contracts.md +210 -0
  46. package/docs/n8r-surface/critical-path.md +163 -0
  47. package/docs/n8r-surface/design.md +289 -0
  48. package/docs/n8r-surface/getting-started.md +107 -0
  49. package/docs/n8r-surface/host-contract.md +176 -0
  50. package/docs/n8r-surface/implementation-decisions.md +96 -0
  51. package/docs/n8r-surface/npm-distribution.md +137 -0
  52. package/docs/n8r-surface/npm-release.md +188 -0
  53. package/docs/n8r-surface/recreation-handoff.md +117 -0
  54. package/docs/n8r-surface/researcher-discovery.md +157 -0
  55. package/docs/n8r-surface/researcher-prepared-check.md +117 -0
  56. package/docs/n8r-surface/researcher-reconciliation-trial.md +149 -0
  57. package/docs/n8r-surface/researcher-repository-check.md +95 -0
  58. package/docs/n8r-surface/researcher-skeleton-check.md +84 -0
  59. package/docs/n8r-surface/researcher-skill-verification.md +725 -0
  60. package/docs/n8r-surface/researcher-skill.md +255 -0
  61. package/docs/n8r-surface/researcher-vault.md +134 -0
  62. package/docs/n8r-surface/save-reopen-transcript.md +211 -0
  63. package/docs/n8r-surface/save-reopen-verification.md +152 -0
  64. package/docs/n8r-surface/startup-human-check.md +172 -0
  65. package/docs/n8r-surface/startup-verification.md +161 -0
  66. package/docs/n8r-surface/startup.md +151 -0
  67. package/docs/n8r-surface/surface-revisions-transcript.md +552 -0
  68. package/docs/n8r-surface/surface-revisions-verification.md +161 -0
  69. package/docs/n8r-surface/vault-setup-verification.md +210 -0
  70. package/docs/n8r-surface/verification.md +117 -0
  71. package/docs/n8r-surface/versioning.md +183 -0
  72. package/examples/researcher/README.md +92 -0
  73. package/examples/researcher/composed.surface.json +430 -0
  74. package/examples/researcher/composed.surface.yaml +283 -0
  75. package/examples/researcher/harbor-r1.research.html +193 -0
  76. package/examples/researcher/harbor-r2.research.html +226 -0
  77. package/examples/researcher/lumen-manual-edit.pending.html +271 -0
  78. package/examples/researcher/lumen-r1.research.html +271 -0
  79. package/examples/researcher/lumen-r2.research.html +280 -0
  80. package/examples/researcher/sources/harbor-api.md +16 -0
  81. package/examples/researcher/sources/harbor-auth.md +8 -0
  82. package/examples/researcher/sources/lumen-guide.md +28 -0
  83. package/examples/researcher/sources/lumen-settings.md +9 -0
  84. package/package.json +45 -4
  85. package/plugins/n8r-surface/.codex-plugin/plugin.json +31 -0
  86. package/plugins/n8r-surface/LICENSE +202 -0
  87. package/plugins/n8r-surface/LICENSE-DOCS +395 -0
  88. package/plugins/n8r-surface/LICENSING.md +36 -0
  89. package/plugins/n8r-surface/assets/icon.svg +5 -0
  90. package/plugins/n8r-surface/plugin.json +27 -0
  91. package/plugins/n8r-surface/skills/research/SKILL.md +122 -0
  92. package/plugins/n8r-surface/skills/research/agents/openai.yaml +4 -0
  93. package/plugins/n8r-surface/skills/research/references/discovery-map.md +160 -0
  94. package/plugins/n8r-surface/skills/research/references/model-meanings.md +55 -0
  95. package/plugins/n8r-surface/skills/research/references/skeleton-surface.md +105 -0
  96. package/plugins/n8r-surface/skills/research/references/working-notes.md +116 -0
@@ -0,0 +1,283 @@
1
+ "contract": n8r.surface/0.1
2
+ "id": urn:surface:lumen-with-harbor
3
+ "title": Selected Lumen and Harbor composition
4
+ "revision":
5
+ "id": r1
6
+ "parent": null
7
+ "createdAt": 2026-11-04T09:00:00Z
8
+ "author": Synthetic researcher
9
+ "reason": Synthetic user selects a partial composition; no integration has been run
10
+ "scope": Desired composition from supplied fictional documents. Authentication, schemas and effective setup are incomplete.
11
+ "extensions":
12
+ "https://example.test/selection/v1":
13
+ "synthetic": true
14
+ "opaque":
15
+ "reviewed": true
16
+ "kind": definition
17
+ "records":
18
+ - "id": urn:research:lumen
19
+ "revision": r2
20
+ "digest": sha256:d7384fe64f1140815ddda3c7bbb2fe826a83140b445e70d839b07145c5840aca
21
+ - "id": urn:research:harbor
22
+ "revision": r2
23
+ "digest": sha256:8e5e492f7154b42b250ad3badea95cc73b571c6e22b4120cd957fcd9e57a0f2b
24
+ "vocabularies":
25
+ - "id": urn:n8r:vocabulary:researcher-example
26
+ "version": "0.1"
27
+ "nodes":
28
+ - "id": urn:component:lumen
29
+ "type":
30
+ "vocabulary": urn:n8r:vocabulary:researcher-example
31
+ "term": application
32
+ "label": Lumen Desk
33
+ "attributes":
34
+ "product":
35
+ "state": known
36
+ "note": Synthetic product
37
+ "value": Lumen Desk
38
+ "version":
39
+ "state": unknown
40
+ "note": No deployable revision supplied
41
+ "retries":
42
+ "state": omitted
43
+ "note": Relevant retry policy deliberately left for later research
44
+ "tenantLabel":
45
+ "state": redacted
46
+ "note": Withheld in this synthetic sharing case
47
+ "embeddedArchive":
48
+ "state": absent
49
+ "note": Settings note describes no embedded archive
50
+ "theme":
51
+ "state": out-of-scope
52
+ "note": UI design is outside this investigation
53
+ "basis":
54
+ - "record": urn:research:lumen
55
+ "revision": r2
56
+ "items":
57
+ - urn:finding:lumen:delivery
58
+ - urn:decision:lumen:archive
59
+ "requirements": []
60
+ - "id": urn:component:harbor
61
+ "type":
62
+ "vocabulary": urn:n8r:vocabulary:researcher-example
63
+ "term": service
64
+ "label": Harbor Archive
65
+ "attributes":
66
+ "product":
67
+ "state": known
68
+ "note": Synthetic product
69
+ "value": Harbor Archive
70
+ "version":
71
+ "state": unknown
72
+ "note": No implementation revision supplied
73
+ "basis":
74
+ - "record": urn:research:harbor
75
+ "revision": r2
76
+ "items":
77
+ - urn:finding:harbor:intake
78
+ - urn:decision:harbor:archive
79
+ "requirements": []
80
+ - "id": urn:component:identity
81
+ "type":
82
+ "vocabulary": urn:n8r:vocabulary:researcher-example
83
+ "term": service
84
+ "label": Shared identity service
85
+ "attributes":
86
+ "product":
87
+ "state": unknown
88
+ "note": Human selected a shared role; product unspecified
89
+ "basis":
90
+ - "record": urn:research:lumen
91
+ "revision": r2
92
+ "items":
93
+ - urn:finding:lumen:authentication
94
+ - urn:decision:lumen:identity
95
+ - "record": urn:research:harbor
96
+ "revision": r2
97
+ "items":
98
+ - urn:finding:harbor:authentication
99
+ - urn:decision:harbor:identity
100
+ "requirements":
101
+ - urn:requirement:identity
102
+ - "id": urn:component:inference
103
+ "type":
104
+ "vocabulary": urn:n8r:vocabulary:researcher-example
105
+ "term": inference-service
106
+ "label": Inference service
107
+ "attributes":
108
+ "modelVersion":
109
+ "state": unknown
110
+ "note": Not established by supplied sources
111
+ "basis":
112
+ - "record": urn:research:lumen
113
+ "revision": r2
114
+ "items":
115
+ - urn:finding:lumen:modelVersion
116
+ "requirements":
117
+ - urn:requirement:inference
118
+ "relationships":
119
+ - "id": urn:relationship:documents
120
+ "from": urn:component:lumen
121
+ "to": urn:component:harbor
122
+ "type":
123
+ "vocabulary": urn:n8r:vocabulary:researcher-example
124
+ "term": sends-documents
125
+ "claim": declared
126
+ "attributes":
127
+ "batchLimit":
128
+ "state": unknown
129
+ "note": Guide says 10; settings note says 25. Conflict remains unresolved.
130
+ "protocol":
131
+ "state": known
132
+ "note": Selected declared protocol
133
+ "value": HTTP
134
+ "basis":
135
+ - "record": urn:research:lumen
136
+ "revision": r2
137
+ "items":
138
+ - urn:finding:lumen:delivery
139
+ - urn:decision:lumen:archive
140
+ - "record": urn:research:harbor
141
+ "revision": r2
142
+ "items":
143
+ - urn:finding:harbor:intake
144
+ - urn:decision:harbor:archive
145
+ - "record": urn:research:lumen
146
+ "revision": r2
147
+ "items":
148
+ - urn:finding:lumen:batchLimit
149
+ "requirements":
150
+ - urn:requirement:archive-token
151
+ - urn:requirement:payload
152
+ - "id": urn:relationship:audit
153
+ "from": urn:component:lumen
154
+ "to": urn:component:harbor
155
+ "type":
156
+ "vocabulary": urn:n8r:vocabulary:researcher-example
157
+ "term": sends-audit
158
+ "claim": declared
159
+ "attributes":
160
+ "protocol":
161
+ "state": known
162
+ "note": Independent parallel route
163
+ "value": HTTP
164
+ "basis":
165
+ - "record": urn:research:lumen
166
+ "revision": r2
167
+ "items":
168
+ - urn:finding:lumen:delivery
169
+ - urn:decision:lumen:archive
170
+ - "record": urn:research:harbor
171
+ "revision": r2
172
+ "items":
173
+ - urn:finding:harbor:intake
174
+ - urn:decision:harbor:archive
175
+ "requirements":
176
+ - urn:requirement:archive-token
177
+ - urn:requirement:payload
178
+ - "id": urn:relationship:callback
179
+ "from": urn:component:harbor
180
+ "to": urn:component:lumen
181
+ "type":
182
+ "vocabulary": urn:n8r:vocabulary:researcher-example
183
+ "term": notifies
184
+ "claim": declared
185
+ "attributes":
186
+ "schema":
187
+ "state": unknown
188
+ "note": Both support callback possibilities; exact compatibility not established
189
+ "basis":
190
+ - "record": urn:research:lumen
191
+ "revision": r2
192
+ "items":
193
+ - urn:finding:lumen:callback
194
+ - urn:decision:lumen:callback
195
+ - "record": urn:research:harbor
196
+ "revision": r2
197
+ "items":
198
+ - urn:finding:harbor:callback
199
+ - urn:decision:harbor:callback
200
+ "requirements":
201
+ - urn:requirement:payload
202
+ - "id": urn:relationship:lumen-auth
203
+ "from": urn:component:lumen
204
+ "to": urn:component:identity
205
+ "type":
206
+ "vocabulary": urn:n8r:vocabulary:researcher-example
207
+ "term": uses-identity
208
+ "claim": declared
209
+ "attributes":
210
+ "protocol":
211
+ "state": known
212
+ "note": Selected option
213
+ "value": OIDC
214
+ "basis":
215
+ - "record": urn:research:lumen
216
+ "revision": r2
217
+ "items":
218
+ - urn:finding:lumen:authentication
219
+ - urn:decision:lumen:identity
220
+ "requirements":
221
+ - urn:requirement:identity
222
+ - "id": urn:relationship:harbor-auth
223
+ "from": urn:component:harbor
224
+ "to": urn:component:identity
225
+ "type":
226
+ "vocabulary": urn:n8r:vocabulary:researcher-example
227
+ "term": uses-identity
228
+ "claim": declared
229
+ "attributes":
230
+ "protocol":
231
+ "state": known
232
+ "note": Selected option
233
+ "value": OIDC bearer token
234
+ "basis":
235
+ - "record": urn:research:harbor
236
+ "revision": r2
237
+ "items":
238
+ - urn:finding:harbor:authentication
239
+ - urn:decision:harbor:identity
240
+ "requirements":
241
+ - urn:requirement:identity
242
+ - "id": urn:relationship:inference
243
+ "from": urn:component:lumen
244
+ "to": urn:component:inference
245
+ "type":
246
+ "vocabulary": urn:n8r:vocabulary:researcher-example
247
+ "term": uses-inference
248
+ "claim": declared
249
+ "attributes":
250
+ "model":
251
+ "state": unknown
252
+ "note": Source does not identify model
253
+ "basis":
254
+ - "record": urn:research:lumen
255
+ "revision": r2
256
+ "items":
257
+ - urn:finding:lumen:modelVersion
258
+ "requirements":
259
+ - urn:requirement:inference
260
+ "requirements":
261
+ - "id": urn:requirement:archive-token
262
+ "kind": secret
263
+ "description": Recipient supplies an appropriate local token binding; no secret value included.
264
+ "state": unknown
265
+ - "id": urn:requirement:identity
266
+ "kind": configuration
267
+ "description": Choose shared issuer, audiences and claim checks; selection does not configure a service.
268
+ "state": unknown
269
+ - "id": urn:requirement:payload
270
+ "kind": configuration
271
+ "description": Agree document/audit/callback schemas and limits.
272
+ "state": unknown
273
+ - "id": urn:requirement:inference
274
+ "kind": resource
275
+ "description": Select inference implementation, model and local bindings.
276
+ "state": unknown
277
+ "coverage":
278
+ - Two fictional products researched from supplied documents.
279
+ - Shared identity and inference roles remain partial.
280
+ "gaps":
281
+ - Integration not tested; no reachable or exercised connection evidence.
282
+ - Batch-limit conflict remains unresolved.
283
+ - No deployment bindings, effective setup or Experiment Runs supplied.
@@ -0,0 +1,193 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'">
7
+ <title>Harbor Archive research</title>
8
+ <style>body{font:17px/1.55 system-ui,sans-serif;max-width:72rem;margin:3rem auto;padding:0 1.5rem;color:#18252d;background:#faf9f5}h1{line-height:1.2}h2{font-size:1.2rem;border-bottom:1px solid #b8c8c9;padding-bottom:.3rem}section{margin:2rem 0}dt{font-weight:650;color:#234c54}dd{margin:0 0 .6rem 1.3rem}li{margin:.75rem 0}span{white-space:pre-wrap;overflow-wrap:anywhere}.empty{color:#56656c;font-style:italic}header p{max-width:55rem}</style>
9
+ </head>
10
+ <body>
11
+ <header><p>Research record · experimental 0.1</p><h1>Harbor Archive research</h1><p>Source research describes possibilities. It does not establish a running integration. The embedded data owns the facts; visible edits require review before continuation.</p></header>
12
+ <section><h2>contract</h2><span>n8r.research/0.1</span></section>
13
+ <section><h2>id</h2><span>urn:research:harbor</span></section>
14
+ <section><h2>revision</h2><dl><dt>id</dt><dd><span>r1</span></dd><dt>parent</dt><dd><span>null</span></dd><dt>createdAt</dt><dd><span>2026-11-04T09:00:00Z</span></dd><dt>author</dt><dd><span>Synthetic researcher</span></dd><dt>reason</dt><dd><span>Inspect supplied fictional documents</span></dd></dl></section>
15
+ <section><h2>scope</h2><span>Only the named synthetic documents; source research provides no runtime evidence.</span></section>
16
+ <section><h2>extensions</h2><dl><dt>https://example.test/research-context/v1</dt><dd><dl><dt>synthetic</dt><dd><span>true</span></dd><dt>preserve</dt><dd><ol><li><span>unrecognized metadata</span></li><li><span>null</span></li><li><span>1</span></li></ol></dd></dl></dd></dl></section>
17
+ <section><h2>sources</h2><ol><li><dl><dt>id</dt><dd><span>urn:source:harbor-api</span></dd><dt>location</dt><dd><span>sources/harbor-api.md</span></dd><dt>version</dt><dd><span>fixture-1</span></dd><dt>digest</dt><dd><span>sha256:b2b87be7df05374c4cc574a1f308bd3b3444f63cd95e894121b9ea1e7be3d681</span></dd><dt>inspectedAt</dt><dd><span>2026-11-04T09:00:00Z</span></dd><dt>coverage</dt><dd><ol><li><dl><dt>path</dt><dd><span>harbor-api.md</span></dd><dt>status</dt><dd><span>inspected</span></dd><dt>note</dt><dd><span>Whole supplied synthetic document; no repository or runtime inspected.</span></dd></dl></li></ol></dd></dl></li></ol></section>
18
+ <section><h2>findings</h2><ol><li><dl><dt>id</dt><dd><span>urn:finding:harbor:intake</span></dd><dt>subject</dt><dd><span>urn:component:harbor</span></dd><dt>property</dt><dd><span>intake</span></dd><dt>state</dt><dd><span>known</span></dd><dt>claims</dt><dd><ol><li><dl><dt>value</dt><dd><ol><li><span>document HTTP route</span></li><li><span>audit HTTP route</span></li></ol></dd><dt>evidence</dt><dd><ol><li><dl><dt>source</dt><dd><span>urn:source:harbor-api</span></dd><dt>locator</dt><dd><span>Intake</span></dd></dl></li></ol></dd></dl></li></ol></dd><dt>note</dt><dd><span>Possible JSON routes; request schema unknown.</span></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:finding:harbor:callback</span></dd><dt>subject</dt><dd><span>urn:component:harbor</span></dd><dt>property</dt><dd><span>callback</span></dd><dt>state</dt><dd><span>known</span></dd><dt>claims</dt><dd><ol><li><dl><dt>value</dt><dd><span>optional outbound HTTP callback</span></dd><dt>evidence</dt><dd><ol><li><dl><dt>source</dt><dd><span>urn:source:harbor-api</span></dd><dt>locator</dt><dd><span>Notifications</span></dd></dl></li></ol></dd></dl></li></ol></dd><dt>note</dt><dd><span>No compatibility claim.</span></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:finding:harbor:authentication</span></dd><dt>subject</dt><dd><span>urn:component:harbor</span></dd><dt>property</dt><dd><span>authentication</span></dd><dt>state</dt><dd><span>unknown</span></dd><dt>claims</dt><dd><p class="empty">No entries recorded.</p></dd><dt>note</dt><dd><span>Initial interface note does not establish authentication.</span></dd></dl></li></ol></section>
19
+ <section><h2>alternatives</h2><ol><li><dl><dt>id</dt><dd><span>urn:option:harbor:archive</span></dd><dt>title</dt><dd><span>Receive document and audit requests</span></dd><dt>findings</dt><dd><ol><li><span>urn:finding:harbor:intake</span></li></ol></dd><dt>requirements</dt><dd><ol><li><span>Agree payloads, limits and authentication</span></li></ol></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:option:harbor:callback</span></dd><dt>title</dt><dd><span>Notify an HTTP receiver</span></dd><dt>findings</dt><dd><ol><li><span>urn:finding:harbor:callback</span></li></ol></dd><dt>requirements</dt><dd><ol><li><span>Configure receiver and callback validation</span></li></ol></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:option:harbor:identity</span></dd><dt>title</dt><dd><span>Investigate shared identity</span></dd><dt>findings</dt><dd><ol><li><span>urn:finding:harbor:authentication</span></li></ol></dd><dt>requirements</dt><dd><ol><li><span>Obtain an authentication source</span></li></ol></dd></dl></li></ol></section>
20
+ <section><h2>decisions</h2><ol><li><dl><dt>id</dt><dd><span>urn:decision:harbor:archive</span></dd><dt>alternative</dt><dd><span>urn:option:harbor:archive</span></dd><dt>choice</dt><dd><span>selected</span></dd><dt>reason</dt><dd><span>Synthetic user selects the archive role, pending interface checks.</span></dd><dt>by</dt><dd><span>Synthetic user</span></dd><dt>at</dt><dd><span>2026-11-04T09:00:00Z</span></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:decision:harbor:callback</span></dd><dt>alternative</dt><dd><span>urn:option:harbor:callback</span></dd><dt>choice</dt><dd><span>selected</span></dd><dt>reason</dt><dd><span>Synthetic user requests archival notifications.</span></dd><dt>by</dt><dd><span>Synthetic user</span></dd><dt>at</dt><dd><span>2026-11-04T09:00:00Z</span></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:decision:harbor:identity</span></dd><dt>alternative</dt><dd><span>urn:option:harbor:identity</span></dd><dt>choice</dt><dd><span>deferred</span></dd><dt>reason</dt><dd><span>Source evidence is incomplete.</span></dd><dt>by</dt><dd><span>Synthetic user</span></dd><dt>at</dt><dd><span>2026-11-04T09:00:00Z</span></dd></dl></li></ol></section>
21
+ <section><h2>questions</h2><ol><li><dl><dt>id</dt><dd><span>urn:question:harbor:auth</span></dd><dt>text</dt><dd><span>What authentication does intake support?</span></dd><dt>findings</dt><dd><ol><li><span>urn:finding:harbor:authentication</span></li></ol></dd></dl></li><li><dl><dt>id</dt><dd><span>urn:question:harbor:schema</span></dd><dt>text</dt><dd><span>Can these routes accept Lumen output after explicit mapping?</span></dd><dt>findings</dt><dd><ol><li><span>urn:finding:harbor:intake</span></li></ol></dd></dl></li></ol></section>
22
+ <section><h2>notes</h2><ol><li><dl><dt>by</dt><dd><span>Synthetic researcher</span></dd><dt>at</dt><dd><span>2026-11-04T09:00:00Z</span></dd><dt>text</dt><dd><span>Keep the two products independent until a human selects a composition.</span></dd></dl></li></ol></section>
23
+ <script type="application/json" id="n8r-record">{
24
+ "contract": "n8r.research/0.1",
25
+ "id": "urn:research:harbor",
26
+ "title": "Harbor Archive research",
27
+ "revision": {
28
+ "id": "r1",
29
+ "parent": null,
30
+ "createdAt": "2026-11-04T09:00:00Z",
31
+ "author": "Synthetic researcher",
32
+ "reason": "Inspect supplied fictional documents"
33
+ },
34
+ "scope": "Only the named synthetic documents; source research provides no runtime evidence.",
35
+ "extensions": {
36
+ "https://example.test/research-context/v1": {
37
+ "synthetic": true,
38
+ "preserve": [
39
+ "unrecognized metadata",
40
+ null,
41
+ 1
42
+ ]
43
+ }
44
+ },
45
+ "sources": [
46
+ {
47
+ "id": "urn:source:harbor-api",
48
+ "location": "sources/harbor-api.md",
49
+ "version": "fixture-1",
50
+ "digest": "sha256:b2b87be7df05374c4cc574a1f308bd3b3444f63cd95e894121b9ea1e7be3d681",
51
+ "inspectedAt": "2026-11-04T09:00:00Z",
52
+ "coverage": [
53
+ {
54
+ "path": "harbor-api.md",
55
+ "status": "inspected",
56
+ "note": "Whole supplied synthetic document; no repository or runtime inspected."
57
+ }
58
+ ]
59
+ }
60
+ ],
61
+ "findings": [
62
+ {
63
+ "id": "urn:finding:harbor:intake",
64
+ "subject": "urn:component:harbor",
65
+ "property": "intake",
66
+ "state": "known",
67
+ "claims": [
68
+ {
69
+ "value": [
70
+ "document HTTP route",
71
+ "audit HTTP route"
72
+ ],
73
+ "evidence": [
74
+ {
75
+ "source": "urn:source:harbor-api",
76
+ "locator": "Intake"
77
+ }
78
+ ]
79
+ }
80
+ ],
81
+ "note": "Possible JSON routes; request schema unknown."
82
+ },
83
+ {
84
+ "id": "urn:finding:harbor:callback",
85
+ "subject": "urn:component:harbor",
86
+ "property": "callback",
87
+ "state": "known",
88
+ "claims": [
89
+ {
90
+ "value": "optional outbound HTTP callback",
91
+ "evidence": [
92
+ {
93
+ "source": "urn:source:harbor-api",
94
+ "locator": "Notifications"
95
+ }
96
+ ]
97
+ }
98
+ ],
99
+ "note": "No compatibility claim."
100
+ },
101
+ {
102
+ "id": "urn:finding:harbor:authentication",
103
+ "subject": "urn:component:harbor",
104
+ "property": "authentication",
105
+ "state": "unknown",
106
+ "claims": [],
107
+ "note": "Initial interface note does not establish authentication."
108
+ }
109
+ ],
110
+ "alternatives": [
111
+ {
112
+ "id": "urn:option:harbor:archive",
113
+ "title": "Receive document and audit requests",
114
+ "findings": [
115
+ "urn:finding:harbor:intake"
116
+ ],
117
+ "requirements": [
118
+ "Agree payloads, limits and authentication"
119
+ ]
120
+ },
121
+ {
122
+ "id": "urn:option:harbor:callback",
123
+ "title": "Notify an HTTP receiver",
124
+ "findings": [
125
+ "urn:finding:harbor:callback"
126
+ ],
127
+ "requirements": [
128
+ "Configure receiver and callback validation"
129
+ ]
130
+ },
131
+ {
132
+ "id": "urn:option:harbor:identity",
133
+ "title": "Investigate shared identity",
134
+ "findings": [
135
+ "urn:finding:harbor:authentication"
136
+ ],
137
+ "requirements": [
138
+ "Obtain an authentication source"
139
+ ]
140
+ }
141
+ ],
142
+ "decisions": [
143
+ {
144
+ "id": "urn:decision:harbor:archive",
145
+ "alternative": "urn:option:harbor:archive",
146
+ "choice": "selected",
147
+ "reason": "Synthetic user selects the archive role, pending interface checks.",
148
+ "by": "Synthetic user",
149
+ "at": "2026-11-04T09:00:00Z"
150
+ },
151
+ {
152
+ "id": "urn:decision:harbor:callback",
153
+ "alternative": "urn:option:harbor:callback",
154
+ "choice": "selected",
155
+ "reason": "Synthetic user requests archival notifications.",
156
+ "by": "Synthetic user",
157
+ "at": "2026-11-04T09:00:00Z"
158
+ },
159
+ {
160
+ "id": "urn:decision:harbor:identity",
161
+ "alternative": "urn:option:harbor:identity",
162
+ "choice": "deferred",
163
+ "reason": "Source evidence is incomplete.",
164
+ "by": "Synthetic user",
165
+ "at": "2026-11-04T09:00:00Z"
166
+ }
167
+ ],
168
+ "questions": [
169
+ {
170
+ "id": "urn:question:harbor:auth",
171
+ "text": "What authentication does intake support?",
172
+ "findings": [
173
+ "urn:finding:harbor:authentication"
174
+ ]
175
+ },
176
+ {
177
+ "id": "urn:question:harbor:schema",
178
+ "text": "Can these routes accept Lumen output after explicit mapping?",
179
+ "findings": [
180
+ "urn:finding:harbor:intake"
181
+ ]
182
+ }
183
+ ],
184
+ "notes": [
185
+ {
186
+ "by": "Synthetic researcher",
187
+ "at": "2026-11-04T09:00:00Z",
188
+ "text": "Keep the two products independent until a human selects a composition."
189
+ }
190
+ ]
191
+ }</script>
192
+ </body>
193
+ </html>