@lapxo/bound 0.2.0 → 0.2.1

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 (225) hide show
  1. package/README.md +40 -121
  2. package/TARGET.bound +51 -23
  3. package/dist/cli/standing-result.js +4 -3
  4. package/dist/cli/verb.js +36 -3
  5. package/dist/engine/encoding.js +2 -0
  6. package/dist/engine/index.d.ts +2 -0
  7. package/dist/engine/index.js +2 -0
  8. package/dist/engine/ports.d.ts +32 -0
  9. package/dist/engine/ports.js +103 -0
  10. package/dist/host/admitted-place.js +6 -0
  11. package/dist/host/contextual-place.js +2 -2
  12. package/dist/host/io.js +2 -2
  13. package/dist/host/reference-authenticated.d.ts +12 -0
  14. package/dist/host/reference-authenticated.js +47 -31
  15. package/dist/host/reference-contracts.js +6 -0
  16. package/dist/host/reference-export.d.ts +33 -0
  17. package/dist/host/reference-export.js +81 -0
  18. package/dist/host/reference-native-api.d.ts +3 -0
  19. package/dist/host/reference-native-api.js +3 -0
  20. package/dist/host/reference-native.d.ts +21 -1
  21. package/dist/host/reference-native.js +34 -10
  22. package/dist/host/reference-profile.js +2 -1
  23. package/dist/host/reference-standing.js +18 -0
  24. package/dist/host/refusals.d.ts +14 -0
  25. package/dist/host/refusals.js +43 -0
  26. package/dist/host/signing.js +7 -1
  27. package/dist/observe/files.js +11 -1
  28. package/dist/wasm/object.js +2 -2
  29. package/docs/contracts/authenticated-reference.publication.json +2 -2
  30. package/docs/contracts/host-ports.md +23 -0
  31. package/docs/contracts/host-ports.publication.json +25 -0
  32. package/docs/contracts/native-publication.inventory.json +7 -1
  33. package/docs/contracts/optional-wasm-adapter.publication.json +1 -1
  34. package/docs/contracts/readme.publication.json +25 -0
  35. package/docs/contracts/reference-backend.md +24 -0
  36. package/docs/contracts/reference-backend.publication.json +25 -0
  37. package/docs/contracts/reference-export.md +31 -0
  38. package/docs/contracts/reference-export.publication.json +25 -0
  39. package/docs/contracts/reference-port.md +8 -1
  40. package/docs/contracts/reference-port.publication.json +1 -1
  41. package/docs/contracts/refusals.bound +94 -0
  42. package/docs/contracts/refusals.md +47 -0
  43. package/docs/contracts/refusals.publication.json +25 -0
  44. package/docs/contracts/standing.bound +9 -0
  45. package/docs/contracts/standing.md +24 -0
  46. package/docs/contracts/standing.publication.json +25 -0
  47. package/package.json +49 -4
  48. package/receipts.bound +9550 -7668
  49. package/samples/authenticated-reference/compatibility.json +306 -0
  50. package/samples/authenticated-reference/yes.json +2 -2
  51. package/samples/host-ports/no.json +16 -0
  52. package/samples/host-ports/yes.json +9 -0
  53. package/samples/readme/no.json +1 -0
  54. package/samples/readme/yes.json +1 -0
  55. package/samples/reference-backend/no.json +1 -0
  56. package/samples/reference-backend/world-fixture.json +8 -0
  57. package/samples/reference-backend/yes.json +1 -0
  58. package/samples/reference-export/no.json +5 -0
  59. package/samples/reference-export/yes.json +15 -0
  60. package/samples/reference-port/no/catalog/TARGET.bound +33 -0
  61. package/samples/reference-port/no/route-notes/TARGET.bound +33 -0
  62. package/samples/refusals/no.json +4 -0
  63. package/samples/refusals/yes.json +9 -0
  64. package/samples/standing/no.json +4 -0
  65. package/samples/standing/yes.json +21 -0
  66. package/vectors/native/authenticated-reference-formation.vector.json +55 -1
  67. package/vectors/native/authenticated-reference.vector.json +32 -396
  68. package/vectors/native/host-ports.vector.json +107 -0
  69. package/vectors/native/readme.vector.json +76 -0
  70. package/vectors/native/reference-backend.vector.json +84 -0
  71. package/vectors/native/reference-export.vector.json +78 -0
  72. package/vectors/native/refusals.vector.json +95 -0
  73. package/vectors/native/standing.vector.json +116 -0
  74. package/vectors/wasm-object.cli.json +16 -61
  75. package/dist/cli/accept.d.ts +0 -28
  76. package/dist/cli/act-result.d.ts +0 -12
  77. package/dist/cli/args.d.ts +0 -11
  78. package/dist/cli/custodian.d.ts +0 -1
  79. package/dist/cli/host.d.ts +0 -1
  80. package/dist/cli/names.d.ts +0 -25
  81. package/dist/cli/native-descendant.d.ts +0 -1
  82. package/dist/cli/native.d.ts +0 -1
  83. package/dist/cli/observe.d.ts +0 -1
  84. package/dist/cli/owner.d.ts +0 -37
  85. package/dist/cli/pass.d.ts +0 -6
  86. package/dist/cli/place.d.ts +0 -76
  87. package/dist/cli/release-result.d.ts +0 -5
  88. package/dist/cli/standing-result.d.ts +0 -5
  89. package/dist/cli/takes.d.ts +0 -30
  90. package/dist/fold/admission-history.d.ts +0 -6
  91. package/dist/fold/ceilings.d.ts +0 -24
  92. package/dist/fold/claims.d.ts +0 -29
  93. package/dist/fold/closed.d.ts +0 -15
  94. package/dist/fold/configures.d.ts +0 -4
  95. package/dist/fold/digests.d.ts +0 -29
  96. package/dist/fold/evidence.d.ts +0 -32
  97. package/dist/fold/fold-worker.d.ts +0 -1
  98. package/dist/fold/kept.d.ts +0 -29
  99. package/dist/fold/keys.d.ts +0 -17
  100. package/dist/fold/laid.d.ts +0 -17
  101. package/dist/fold/nos.d.ts +0 -8
  102. package/dist/fold/object.d.ts +0 -3
  103. package/dist/fold/observed.d.ts +0 -35
  104. package/dist/fold/opened.d.ts +0 -5
  105. package/dist/fold/own.d.ts +0 -24
  106. package/dist/fold/paid.d.ts +0 -11
  107. package/dist/fold/place-inputs.d.ts +0 -17
  108. package/dist/fold/places.d.ts +0 -24
  109. package/dist/fold/rank.d.ts +0 -3
  110. package/dist/fold/reach.d.ts +0 -18
  111. package/dist/fold/readers.d.ts +0 -47
  112. package/dist/fold/receipts.d.ts +0 -8
  113. package/dist/fold/region-declarations.d.ts +0 -2
  114. package/dist/fold/region.d.ts +0 -72
  115. package/dist/fold/release-policy.d.ts +0 -67
  116. package/dist/fold/resolved.d.ts +0 -18
  117. package/dist/fold/roles.d.ts +0 -17
  118. package/dist/fold/second.d.ts +0 -18
  119. package/dist/fold/shards.d.ts +0 -29
  120. package/dist/fold/signed.d.ts +0 -23
  121. package/dist/fold/signers.d.ts +0 -24
  122. package/dist/fold/stranger.d.ts +0 -3
  123. package/dist/fold/views.d.ts +0 -27
  124. package/dist/fold/wire.d.ts +0 -19
  125. package/dist/fold/zoom.d.ts +0 -16
  126. package/dist/host/act-cost.d.ts +0 -13
  127. package/dist/host/adapters/keys/ed25519.d.ts +0 -7
  128. package/dist/host/adapters/modules/javascript.d.ts +0 -3
  129. package/dist/host/adapters/transport/http.d.ts +0 -5
  130. package/dist/host/admitted-place.d.ts +0 -5
  131. package/dist/host/archive.d.ts +0 -11
  132. package/dist/host/capsule-process.d.ts +0 -21
  133. package/dist/host/capsule.d.ts +0 -19
  134. package/dist/host/cell-receipts.d.ts +0 -2
  135. package/dist/host/content-needed.d.ts +0 -5
  136. package/dist/host/content-store.d.ts +0 -8
  137. package/dist/host/contextual-place.d.ts +0 -59
  138. package/dist/host/digest.d.ts +0 -3
  139. package/dist/host/hash.d.ts +0 -9
  140. package/dist/host/io.d.ts +0 -11
  141. package/dist/host/lifetime.d.ts +0 -1
  142. package/dist/host/located.d.ts +0 -4
  143. package/dist/host/native/bounded-file.d.ts +0 -8
  144. package/dist/host/native/command.d.ts +0 -36
  145. package/dist/host/native/control-bridge-worker.d.ts +0 -1
  146. package/dist/host/native/control-bridge.d.ts +0 -30
  147. package/dist/host/native/control-selection.d.ts +0 -29
  148. package/dist/host/native/custody.d.ts +0 -5
  149. package/dist/host/native/deadline.d.ts +0 -12
  150. package/dist/host/native/descendants.d.ts +0 -1
  151. package/dist/host/native/generated-custodian.d.ts +0 -122
  152. package/dist/host/native/generated.d.ts +0 -217
  153. package/dist/host/native/image.d.ts +0 -36
  154. package/dist/host/native/jobs.d.ts +0 -75
  155. package/dist/host/native/loader.d.ts +0 -80
  156. package/dist/host/native/materialize.d.ts +0 -22
  157. package/dist/host/native/module-closure.d.ts +0 -27
  158. package/dist/host/native/module-syntax.d.ts +0 -8
  159. package/dist/host/native/native-binary.d.ts +0 -54
  160. package/dist/host/native/native-program.d.ts +0 -56
  161. package/dist/host/native/node-jobs.d.ts +0 -84
  162. package/dist/host/native/node-launch.d.ts +0 -72
  163. package/dist/host/native/preload.d.ts +0 -1
  164. package/dist/host/native/reading.d.ts +0 -91
  165. package/dist/host/native/receipt-environment.d.ts +0 -3
  166. package/dist/host/native/references.d.ts +0 -5
  167. package/dist/host/native/root.d.ts +0 -17
  168. package/dist/host/native/route.d.ts +0 -66
  169. package/dist/host/native/runtime.d.ts +0 -4
  170. package/dist/host/native-reader-context.d.ts +0 -3
  171. package/dist/host/objects.d.ts +0 -6
  172. package/dist/host/place-clock-selection.d.ts +0 -55
  173. package/dist/host/ports/ingress.d.ts +0 -24
  174. package/dist/host/ports/local-act.d.ts +0 -44
  175. package/dist/host/ports/place-act.d.ts +0 -46
  176. package/dist/host/ports/publication.d.ts +0 -10
  177. package/dist/host/ports/signing.d.ts +0 -31
  178. package/dist/host/ports/store.d.ts +0 -2
  179. package/dist/host/ports/transport.d.ts +0 -1
  180. package/dist/host/process-lifetime.d.ts +0 -11
  181. package/dist/host/provide.d.ts +0 -48
  182. package/dist/host/read-only.d.ts +0 -3
  183. package/dist/host/reading-closures.d.ts +0 -47
  184. package/dist/host/reading-context.d.ts +0 -29
  185. package/dist/host/reference.d.ts +0 -6
  186. package/dist/host/release.d.ts +0 -14
  187. package/dist/host/root-clock-source.d.ts +0 -85
  188. package/dist/host/selected-capsules.d.ts +0 -8
  189. package/dist/host/selected-topos.d.ts +0 -24
  190. package/dist/host/signing.d.ts +0 -3
  191. package/dist/host/source-content.d.ts +0 -12
  192. package/dist/host/timing.d.ts +0 -2
  193. package/dist/host/walk.d.ts +0 -6
  194. package/dist/judge/late.d.ts +0 -7
  195. package/dist/judge/take.d.ts +0 -59
  196. package/dist/judge/widening.d.ts +0 -1
  197. package/dist/land/act.d.ts +0 -30
  198. package/dist/land/alias.d.ts +0 -10
  199. package/dist/land/held.d.ts +0 -7
  200. package/dist/land/inert.d.ts +0 -26
  201. package/dist/land/leaving.d.ts +0 -14
  202. package/dist/land/ledger.d.ts +0 -33
  203. package/dist/land/owned.d.ts +0 -23
  204. package/dist/land/sign.d.ts +0 -15
  205. package/dist/land/standing-pin.d.ts +0 -3
  206. package/dist/land/vouched.d.ts +0 -21
  207. package/dist/land/withdraw.d.ts +0 -14
  208. package/dist/observe/files.d.ts +0 -14
  209. package/dist/observe/identity.d.ts +0 -21
  210. package/dist/observe/match.d.ts +0 -1
  211. package/dist/observe/regions.d.ts +0 -33
  212. package/dist/observe/run.d.ts +0 -31
  213. package/dist/observe/runner.d.ts +0 -20
  214. package/dist/render/capsule.d.ts +0 -24
  215. package/dist/render/field.d.ts +0 -3
  216. package/dist/render/names.d.ts +0 -3
  217. package/dist/render/open.d.ts +0 -27
  218. package/dist/render/page.d.ts +0 -3
  219. package/dist/render/receipts.d.ts +0 -3
  220. package/dist/render/shape.d.ts +0 -16
  221. package/dist/render/target.d.ts +0 -18
  222. package/dist/render/view.d.ts +0 -22
  223. package/dist/wasm/node-worker.d.ts +0 -1
  224. package/dist/wasm/object.d.ts +0 -8
  225. package/dist/wasm/worker.d.ts +0 -1
@@ -0,0 +1,14 @@
1
+ export interface RefusalEntry {
2
+ readonly code: string;
3
+ readonly category: string;
4
+ readonly meaning: string;
5
+ readonly next: string;
6
+ }
7
+ /** Stable code assigned at the cause. Details are diagnostic, never parsed as policy. */
8
+ export declare class BoundRefusal extends Error {
9
+ readonly code: string;
10
+ constructor(code: string, diagnostic: string);
11
+ }
12
+ /** Pure machine contract reader. A catalog is data, never an authority grant. */
13
+ export declare function readRefusalCatalog(text: string): readonly RefusalEntry[];
14
+ export declare function describeRefusal(error: BoundRefusal, catalog: readonly RefusalEntry[]): RefusalEntry;
@@ -0,0 +1,43 @@
1
+ import { parse, canonical } from '@lapxo/topos/wire';
2
+ /** Stable code assigned at the cause. Details are diagnostic, never parsed as policy. */
3
+ export class BoundRefusal extends Error {
4
+ constructor(code, diagnostic) { super(diagnostic); this.name = 'BoundRefusal'; this.code = code; }
5
+ }
6
+ /** Pure machine contract reader. A catalog is data, never an authority grant. */
7
+ export function readRefusalCatalog(text) {
8
+ const groups = new Map();
9
+ let profile = false;
10
+ for (const line of text.trimEnd().split('\n')) {
11
+ const parsed = parse(line);
12
+ if (parsed.kind !== 'fact' || canonical(parsed.value.fields) !== line)
13
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·invalid refusal catalog line');
14
+ const f = parsed.value.fields;
15
+ if (f.scope === 'refusal/catalog' && f.measure === 'id' && f.value === 'bound-refusals@1' && f.role === 'writes' && f.form === 'alphabet' && !profile) {
16
+ profile = true;
17
+ continue;
18
+ }
19
+ if (f.role !== 'writes' || f.form !== 'alphabet' || !f.scope?.startsWith('refusal/') || !['code', 'class', 'next'].includes(f.measure ?? ''))
20
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·invalid refusal catalog record');
21
+ const group = groups.get(f.scope) ?? new Map();
22
+ if (group.has(f.measure))
23
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·duplicate refusal catalog field');
24
+ group.set(f.measure, f);
25
+ groups.set(f.scope, group);
26
+ }
27
+ const entries = [];
28
+ for (const [scope, group] of groups) {
29
+ const code = group.get('code')?.value, category = group.get('class')?.value, meaning = group.get('class')?.about, next = group.get('next')?.value;
30
+ if (group.size !== 3 || !code || scope !== 'refusal/' + code || !category || !meaning || !next)
31
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·incomplete refusal catalog entry');
32
+ entries.push(Object.freeze({ code, category, meaning, next }));
33
+ }
34
+ if (!profile || !entries.length)
35
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·missing refusal catalog profile');
36
+ return Object.freeze(entries);
37
+ }
38
+ export function describeRefusal(error, catalog) {
39
+ const entry = catalog.find(row => row.code === error.code);
40
+ if (!entry)
41
+ throw new BoundRefusal('catalog/invalid', 'REFUSE·undeclared refusal code');
42
+ return entry;
43
+ }
@@ -1,3 +1,4 @@
1
+ import { invokeSigningPort } from "../engine/ports.js";
1
2
  import { readFileSync } from 'node:fs';
2
3
  import { parse, signerSelection, signerRequestBytes, signerResponseBytes, signerResponseOf } from '@lapxo/topos/wire';
3
4
  import { invokeSigner, SigningFailure } from "./ports/signing.js";
@@ -31,11 +32,16 @@ function binding(name, keyFile) {
31
32
  }
32
33
  }
33
34
  /** Resolve data before acquisition; all mechanisms use one wire protocol and verification path. */
34
- export function signerFor(lines, keyId, selected, keyFile) {
35
+ export function signerFor(lines, keyId, selected, keyFile, injected) {
35
36
  const fields = lines.flatMap(line => { const got = parse(line); return got.kind === 'fact' ? [got.value.fields] : []; });
36
37
  const declaration = signerSelection(fields, keyId);
37
38
  if (selected !== undefined && selected !== declaration.name)
38
39
  throw new SigningFailure(`REFUSE·signer ${keyId} CLI selection conflicts with declaration`);
40
+ if (injected) {
41
+ if (injected.name !== declaration.name || keyFile)
42
+ throw new SigningFailure('REFUSE·signer injected host binding conflicts with declaration or key file');
43
+ return (lot) => invokeSigningPort(lot, injected.sign, { timeoutMs: declaration.timeoutMs, maxBytes: declaration.responseBytes });
44
+ }
39
45
  const mechanism = binding(declaration.name, keyFile);
40
46
  const protocol = { request: signerRequestBytes, response: signerResponseBytes, reply: signerResponseOf };
41
47
  return (lot) => invokeSigner(lot, mechanism, protocol, declaration);
@@ -24,7 +24,17 @@ function bytesAt(at) {
24
24
  const held = seen.get(at);
25
25
  if (held?.stamp === stamp)
26
26
  return held.bytes;
27
- const bytes = readFileSync(at);
27
+ let bytes;
28
+ try {
29
+ bytes = readFileSync(at);
30
+ }
31
+ catch (error) {
32
+ // A concurrent act can retire a coordinate after its stamp was read.
33
+ if (error.code !== 'ENOENT')
34
+ throw error;
35
+ seen.delete(at);
36
+ return undefined;
37
+ }
28
38
  seen.set(at, { stamp, bytes });
29
39
  return bytes;
30
40
  }
@@ -10,9 +10,9 @@ export function usesWasmObject(configuration) {
10
10
  const rows = configuration.filter(f => f.scope === 'engine/object' && f.value !== 'withdraw');
11
11
  if (!rows.length)
12
12
  return false;
13
- if (rows.length !== 1 || rows[0].role !== 'writes' || rows[0].measure !== 'id' || rows[0].form !== 'alphabet' || rows[0].value !== 'wasm@1')
13
+ if (rows.length !== 1 || rows[0].role !== 'writes' || rows[0].measure !== 'id' || rows[0].form !== 'alphabet' || !['esm@1', 'wasm@1'].includes(rows[0].value ?? ''))
14
14
  refuse('unique declared backend required');
15
- return true;
15
+ return rows[0].value === 'wasm@1';
16
16
  }
17
17
  function limit(configuration, name, measure) {
18
18
  const rows = configuration.filter(f => f.scope === 'engine/wasm/' + name && f.value !== 'withdraw');
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "role": "contract",
6
6
  "path": "docs/contracts/reference-port.md",
7
- "digest": "sha256:ae500aaec7e94dc9bc7c4d45e3294b212b0ad5ade7647e3ce24807ca7a0ea7cc"
7
+ "digest": "sha256:d6198b9ab177086cb334e9e9cd7adb5c67b0af7165a79d23812aa2496d17674c"
8
8
  },
9
9
  {
10
10
  "role": "yes",
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "role": "vector",
16
16
  "path": "vectors/native/authenticated-reference.vector.json",
17
- "digest": "sha256:297c4942a847c42eb9d2cf000ab38d8a5f38b64e2e4a469919f0dfc88c9d8bd1"
17
+ "digest": "sha256:9aba7121fbbb98e63259dea78e52377cd71c628e0d17be20c9a51da27f2b31de"
18
18
  },
19
19
  {
20
20
  "role": "no",
@@ -0,0 +1,23 @@
1
+ # Public host ports
2
+
3
+ `/engine` and `/reference` export `readContent`, `retainContent` and `invokeSigningPort`, with `ContentReadPort`, `PersistencePort`, `SigningPort`, `DigestPort` and `PortLimits`. There is no default network, store, account or signer. `objectFold` remains pure and never calls a port.
4
+
5
+ Every operation takes an explicit positive safe-integer `timeoutMs` and `maxBytes`, and an optional AbortSignal. Invalid limits and pre-cancellation refuse before the callback. Acquisition, digest calculation and retention share the operation lifetime. A timeout aborts the supplied signal and returns no successful result. This is a cooperative host boundary, not preemption of synchronous JavaScript or sandbox confinement.
6
+
7
+ `readContent(source, digest, ports, limits, signal)` invokes the supplied read callback and SHA-256 callback, checks byte bounds before copying/hashing, rejects shared buffers, and verifies an owned snapshot against the requested digest. Location carries no authority.
8
+
9
+ `retainContent(digest, bytes, ports, limits, signal)` checks identity before calling the host's atomic byte-retention callback. Its acknowledgement contains only digest and byte count. It is not a signed receipt, admission or permission to reuse a response. The host must implement atomic retention and cooperate with cancellation. A callback that ignores cancellation may finish retaining bytes after the caller has refused; no success, act or authority follows from those bytes. Opening and projection never retain automatically.
10
+
11
+ `invokeSigningPort(lot, sign, limits, signal)` uses the existing Topos signing request/response framing. It acquires protocol-shaped signatures; it does not decide authority or certify them cryptographically. Native export can receive `hostSigner: {name, sign}` through `/reference/native`. The name must match the admitted signer selection, and cannot be combined with a key-file override. The existing consent path verifies every returned signature against the admitted key, era, scope and epoch before returning a carrier. No key material enters the engine.
12
+
13
+ Native opening accepts `content: {name, read}`. Its name must match the admitted transport selection, with that selection's existing byte and lifetime bounds. The host callback cannot be chosen by a carrier, reference or repository. The existing inspector verifies the returned carrier again and the selected backend projects only verified records. There is no backend fallback.
14
+
15
+ Public port failures use the machine refusal catalog: `host-port/budget`, `cancelled`, `timeout`, `failed`, `integrity`, `response`. Native acquisition failures retain their enclosing reference refusal. Host diagnostics are not returned as authority or parsed as codes.
16
+
17
+ Native vector output, in two real admitted places:
18
+
19
+ ```text
20
+ PORTS owned content · verified retention · signer content persistence failures · budget integrity cancellation timeout refused
21
+ HOST host-sensor · declared signer and content injected · real signature verified · wrong binding refused · no commit
22
+ HOST host-editorial · declared signer and content injected · real signature verified · wrong binding refused · no commit
23
+ ```
@@ -0,0 +1,25 @@
1
+ {
2
+ "scope": "contract/published/host-ports",
3
+ "members": [
4
+ {
5
+ "role": "contract",
6
+ "path": "docs/contracts/host-ports.md",
7
+ "digest": "sha256:f3d646da2399c719469a37293b329d53b72b0478ca97f961b90c1f4e6adc2ae6"
8
+ },
9
+ {
10
+ "role": "yes",
11
+ "path": "samples/host-ports/yes.json",
12
+ "digest": "sha256:f8dc3c6939bd8f4bb91cb57e3e9b52a865645cc80ee0f5ce5a11570ef3f31ce3"
13
+ },
14
+ {
15
+ "role": "vector",
16
+ "path": "vectors/native/host-ports.vector.json",
17
+ "digest": "sha256:58425f81fb4f1ef6e392d8fa3a5ee3a287ef6fbcbfb11e512fd2e30f24f465e6"
18
+ },
19
+ {
20
+ "role": "no",
21
+ "path": "samples/host-ports/no.json",
22
+ "digest": "sha256:ffc9dbb29743d4faa16c5c29eb73a7e0f24cf4da3255a979f628f5c3d8f4b7c1"
23
+ }
24
+ ]
25
+ }
@@ -3,6 +3,12 @@
3
3
  "scope": "contract/published/native",
4
4
  "surface": [
5
5
  "contract/published/optional-wasm-adapter",
6
- "contract/published/authenticated-reference"
6
+ "contract/published/authenticated-reference",
7
+ "contract/published/reference-export",
8
+ "contract/published/reference-backend",
9
+ "contract/published/standing",
10
+ "contract/published/refusals",
11
+ "contract/published/host-ports",
12
+ "contract/published/readme"
7
13
  ]
8
14
  }
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "role": "vector",
16
16
  "path": "vectors/wasm-object.cli.json",
17
- "digest": "sha256:5f761fabd0592d7f8e9b95a9fc80583424a8e83fb7cb3c4b4905b62eca43db9e"
17
+ "digest": "sha256:f0b970ede31b99e00e94f249970aa8c714880dccb03ed7952a3cf01bf24a7c17"
18
18
  },
19
19
  {
20
20
  "role": "no",
@@ -0,0 +1,25 @@
1
+ {
2
+ "scope": "contract/published/readme",
3
+ "members": [
4
+ {
5
+ "role": "contract",
6
+ "path": "README.md",
7
+ "digest": "sha256:183fe27e7a8bfdb04f4aefaa785f2b1845da1c5a93562a06a300175a960c72da"
8
+ },
9
+ {
10
+ "role": "yes",
11
+ "path": "samples/readme/yes.json",
12
+ "digest": "sha256:37449e6ec4867f034463ca20218d370fe40c1d5dec759871c398fd73109f9f6e"
13
+ },
14
+ {
15
+ "role": "vector",
16
+ "path": "vectors/native/readme.vector.json",
17
+ "digest": "sha256:b97b50e102fb6c34851d2769d6029663fb4838e2eb70a9bdb4c168141b8964f3"
18
+ },
19
+ {
20
+ "role": "no",
21
+ "path": "samples/readme/no.json",
22
+ "digest": "sha256:6bb243445b009fd94ba021342fca34ea00cf4c5257378d9d7c05840c13166f73"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,24 @@
1
+ # Authenticated native reference opening
2
+
3
+ `@lapxo/bound/reference/native` exports `exportAuthenticatedReference` and `openAuthenticatedReference`. This is the Node host boundary. The platform-free inspector stays in `/reference`; the pure projector stays in `/engine`.
4
+
5
+ The receiver admits one `engine/object` declaration: `esm@1` or `wasm@1`. Missing, ambiguous and unknown selections refuse. WASM never falls back to ESM. The native route shares one context preparation, authenticates the received original records, then calls the existing selected projector. It introduces no algebra or alternate interpreter.
6
+
7
+ The host admits `reference/snapshot`, `reference/epoch`, `reference/proof-scope`, `reference/policy`, `reference/form-implementation`, `reference/records`, and the standing/refusal contract digests. The policy is the independently accepted export policy, not a policy invented from the received carrier. The prepared form implementation must match the admitted expectation, and both interpretation contracts must match the installed bytes. A carrier's accompanying context is public data, not an authority anchor.
8
+
9
+ Content goes through the declared transport and its existing byte/time limits. The snapshot binds the declared public context, including resource budgets. The native opener accepts an AbortSignal and checks interruption before download and projection; the WASM worker uses its existing cancellation and lifetime contract. This does not claim cancellation of an in-flight native download, browser persistence or arbitrary browser capsules.
10
+
11
+ WASM uses the installed asset manifest, runtime, guest and exact supported form standings. The caller cannot replace that manifest with a convenient fixture. Its memory, stack, execution, worker-lifetime and response budgets remain explicit admitted interval lines. A form outside that installed closure refuses by name.
12
+
13
+ The positive fixture uses the previously published native reader archive named in `samples/reference-backend/world-fixture.json`, or the same supported standing and closed modules already laid by digest. Preparation verifies every byte before timed opening. The fixture archive is fetched or retained outside opening measurements; no private store or checkout path identifies it. No provider code executes during archive preparation.
14
+
15
+ The native quartet opens one signed reference in two unrelated places, once through each explicitly selected backend. It compares authenticated standing, records and canonical projection bytes. Authority-context identity describes authentication, not an execution receipt: equal outputs never authorize reuse of a receipt across implementations. Neither opening signs or commits an act.
16
+
17
+ Captured semantic markers:
18
+
19
+ ```text
20
+ WASM water-level-reference · authenticated download · same standing · same records · byte-equal ESM projection · altered carrier refused · no commit
21
+ WASM editorial-reference · authenticated download · same standing · same records · byte-equal ESM projection · altered carrier refused · no commit
22
+ ```
23
+
24
+ The no sample changes the carrier while retaining its reference. Integrity refuses before projection. Existing vectors also retain unknown-backend, unsupported-form, byte-budget, authority and cancellation boundaries. The quartet descriptor is `reference-backend.publication.json`; installed-archive release acceptance and L6 remain separate obligations.
@@ -0,0 +1,25 @@
1
+ {
2
+ "scope": "contract/published/reference-backend",
3
+ "members": [
4
+ {
5
+ "role": "contract",
6
+ "path": "docs/contracts/reference-backend.md",
7
+ "digest": "sha256:c69fbaac11276efcd8a436f242e07d4fda18137c9987f8bba183fe6d6ea801c6"
8
+ },
9
+ {
10
+ "role": "yes",
11
+ "path": "samples/reference-backend/yes.json",
12
+ "digest": "sha256:67657bf32a0b85053bf3778f8e1dc13478aaf7386e39200d6967cc9ff2ef5e6f"
13
+ },
14
+ {
15
+ "role": "vector",
16
+ "path": "vectors/native/reference-backend.vector.json",
17
+ "digest": "sha256:05257cf22466c859eb01e1abf660927afb5a9a160d3865053ebdf8649f0f5392"
18
+ },
19
+ {
20
+ "role": "no",
21
+ "path": "samples/reference-backend/no.json",
22
+ "digest": "sha256:a4e3dd23533925d117954666eb68c4f54165af3263317c330beed6d13a216626"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,31 @@
1
+ # Native authenticated reference export
2
+
3
+ `bound sign --as reference <source-url> --key <key-id>` exports a public snapshot from an admitted local place. The selected host signer is the place's existing signer port. File signing additionally requires its explicitly supplied `--key-file`; command signing uses the host registry. There is no implicit signer, network fetch or private export runner.
4
+
5
+ The command prints one JSON value with profile `reference-export@1`, a `reference`, the exact `carrier` text and a public `context`. It neither lands the proof nor advances the place's epoch. It does not publish, write an output directory or alter TARGET, ledgers or receipts. The caller chooses where to deliver these bytes.
6
+
7
+ The place declares `reference/authentication=authenticated-standing@1`, `reference/proof-scope`, `reference/records`, and an interval `reference/export-bytes` measured in bytes. It also pins `reference/contracts/refusals` and `reference/contracts/standing` to the exact installed contract files. Missing, conflicting or unauthenticated declarations refuse. These are place declarations, not increased general ceilings.
8
+
9
+ The exporter uses Bound's authenticated Root standing and existing context preparation. It preserves typed effective history and applies the existing configuration projection; it does not implement another fold. If the current carrier profile cannot represent historical authority, it refuses as `reference-export/history` instead of dropping originals or forging a new admission. The separate B3 quartet covers complete public standing across declared classes and committed acts; this carrier still refuses historical authority it cannot represent.
10
+
11
+ The carrier retains `authenticated-standing@1` framing. Its proof commits to the original canonical signed lines. The proof's witness snapshot also commits, through `reference-export-context@1`, to semantic standing identity, epoch, proof scope, policy, form implementation, public signers, signature algorithms, the refusal-catalog digest, the standing-contract digest, and the declared byte and record budgets. Blob identity remains separate from semantic standing identity and source location.
12
+
13
+ The exported context is public data, not an authority anchor. A consumer independently accepts its keys, policy and interpretation contracts, then supplies these expectations to `inspectAuthenticatedReference`. When `contracts` is supplied, that existing API verifies the context snapshot before requesting bytes. Altering either contract digest or a resource budget invalidates that snapshot. Existing callers without the new context retain their 0.2.0 inspection contract; that compatibility does not assert verification of the added interpretation contracts.
14
+
15
+ `/engine` remains pure. Exporting a reference does not select WASM, and B1 does not claim B2's backend composition. Signature, authority and context checks precede projection. `next` recommendations from `refusals.bound` grant no permission to execute, repair or sign.
16
+
17
+ ## Conformance quartet
18
+
19
+ - Positive data: `samples/reference-export/yes.json`. The native test bootstraps a real Root with a disposable key and admits its cell and claim through `bound land`. It then executes this public signing command and verifies the result through the public reference API and unchanged engine.
20
+ - Negative data: `samples/reference-export/no.json`. Changing a carrier byte refuses on blob integrity before projection.
21
+ - Vector: `vectors/native/reference-export.vector.json`. It runs the tracked conformance test, which invokes the actual CLI for bootstrap, admission and export. No private runner or pre-signed fixture stands in for those operations.
22
+ - Additional boundaries: changed contract identities, changed byte budget, invalid source, unauthorized key and invalid signer response. Export and refusal leave the real Root's TARGET and complete ledger inventory unchanged.
23
+
24
+ Captured semantic markers from the native run:
25
+
26
+ ```text
27
+ EXPORT real-admission · contracts-bound · signatures-verified · REQUIRED · no commit
28
+ REFUSE altered-carrier · blob integrity
29
+ ```
30
+
31
+ Keys are generated outside the repository and discarded by the test. Captures contain no private key, local path or successful receipt for a failed export. Fixture preparation and each CLI invocation have their own existing bounds; the enclosing conformance runner's lifetime is not a cost claim for any individual reading. Release admission, portable release receipts and exact-artifact acceptance remain separate from this quartet.
@@ -0,0 +1,25 @@
1
+ {
2
+ "scope": "contract/published/reference-export",
3
+ "members": [
4
+ {
5
+ "role": "contract",
6
+ "path": "docs/contracts/reference-export.md",
7
+ "digest": "sha256:08e12bbed83729f42f905e03f090126181df952b678a92fe06a0e24eefc106f4"
8
+ },
9
+ {
10
+ "role": "yes",
11
+ "path": "samples/reference-export/yes.json",
12
+ "digest": "sha256:550baaffd4a431c550a613bdfa146eea1ef7630e80a6db9bec39bffb5d51cce6"
13
+ },
14
+ {
15
+ "role": "vector",
16
+ "path": "vectors/native/reference-export.vector.json",
17
+ "digest": "sha256:54546281a22234178664cb77996df8e059fd4080e1381a64d51b87513f620bc9"
18
+ },
19
+ {
20
+ "role": "no",
21
+ "path": "samples/reference-export/no.json",
22
+ "digest": "sha256:b4351ab6dd579c6c37bd34323228cb6bd992a478b9ccbce2b1ad60abafa78760"
23
+ }
24
+ ]
25
+ }
@@ -24,10 +24,17 @@ Without the authenticated profile, the existing CLI reference branch remains exp
24
24
 
25
25
  ### Native authenticated opening
26
26
 
27
- The same reference command consumes `reference/authentication form=alphabet measure=id value=authenticated-standing@1` from the selected local place. Without that declaration the existing inspection remains explicitly unauthenticated. With it the host requires unique authenticated declarations for `reference/snapshot`, `reference/epoch`, `reference/proof-scope` and `reference/records` (all `measure=id`); the snapshot is a typed SHA-256 digest, epoch and record budget are safe integers, and the record budget is positive. The declared transport supplies its own existing byte and lifetime bounds.
27
+ The same reference command consumes `reference/authentication form=alphabet measure=id value=authenticated-standing@1` from the selected local place. Without that declaration the existing inspection remains explicitly unauthenticated. With it the host requires unique authenticated declarations for `engine/object` (`esm@1` or `wasm@1`), `reference/snapshot`, `reference/epoch`, `reference/proof-scope`, `reference/records`, `reference/policy`, `reference/form-implementation`, `reference/contracts/refusals` and `reference/contracts/standing` (all `measure=id`); the snapshot is a typed SHA-256 digest, epoch and record budget are safe integers, and the record budget is positive. The declared transport supplies its own existing byte and lifetime bounds.
28
28
 
29
29
  Trust comes from the local place's admitted keys, signature eras, snapshot and selected object interpretation, including origin and witness grants. No key, grant or verifier supplied by the carrier becomes host authority. The public path delegates signatures, historical authority, wire interpretation, effective order and context admission to the existing SDK and projects admitted records through the existing engine. Signature, coverage, era, effective-order, blob-integrity and semantic-identity failures refuse before any authenticated result or cell output.
30
30
 
31
31
  Opening prints the source, authenticated semantic standing, object results and authority-context identity. It does not land an act or emit a successful partial result. Existing private content-cache stamps and store accounting may be updated; those are distinct from the public place, its signed authority and its committed history. Inspection does not grant permission to reuse an old response as a current one.
32
32
 
33
33
  For the opt-in `authenticated-standing@1` profile, the host checks the selected context offer’s SHA-256 `restsOn` members and uses the existing `moduleClosure` before importing that context. A missing, altered, undeclared or unresolved import refuses before context code executes. The same preparation applies when the explicit object view selects `wasm@1`; absent these opt-in profiles, the existing path is unchanged. Import closure proves neither correctness nor sandbox confinement, creates no authority, and does not authorize current-answer reuse.
34
+
35
+
36
+ ### Compatibility of published 0.2.0 carriers
37
+
38
+ The original weather and editorial carriers, their signatures and effective-order counterexamples remain byte-identical. `inspectAuthenticatedReference` accepts their independently supplied legacy trust tuple without inventing the newer contract commitments. Its native vector verifies both positive carriers and their arrival-equivalent projection, and rejects signature, coverage, era, effective-order, blob and semantic-standing failures. Authority and context preparation use the existing host and SDK; no replacement verifier or form algebra is supplied by the carrier.
39
+
40
+ This preserves the carrier/API contract, not an implicit native backend. The historical receiver TARGETs omit the explicit backend and interpretation-contract lines required by native opening in 0.2.1. They therefore refuse with `reference/backend` before transport; the vector asserts that refusal instead of re-signing or weakening the fixtures. No automatic ESM fallback is added. Native positive opening with the complete admitted context is demonstrated separately by the reference-export and reference-backend quartets, including ESM/WASM equality and altered-byte refusal. `compatibility.json` records every inherited condition and expected result; the no sample still contains the original bad signature.
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "role": "contract",
6
6
  "path": "docs/contracts/reference-port.md",
7
- "digest": "sha256:ae500aaec7e94dc9bc7c4d45e3294b212b0ad5ade7647e3ce24807ca7a0ea7cc"
7
+ "digest": "sha256:d6198b9ab177086cb334e9e9cd7adb5c67b0af7165a79d23812aa2496d17674c"
8
8
  },
9
9
  {
10
10
  "role": "yes",
@@ -0,0 +1,94 @@
1
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=refusal/catalog value=bound-refusals@1
2
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/source value=reference-export/source
3
+ bound-lock/1 about="The source URL is not a canonical standing-reference location." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/source value=input
4
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/source value=check-source
5
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/context value=reference-export/context
6
+ bound-lock/1 about="Required admitted export policy or exact contract bytes are missing or conflicting." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/context value=interpretation
7
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/context value=inspect-standing
8
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/budget value=reference-export/budget
9
+ bound-lock/1 about="The export exceeds or lacks its explicitly declared record or byte budget." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/budget value=resource
10
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/budget value=inspect-resource-lines
11
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/authority value=reference-export/authority
12
+ bound-lock/1 about="The selected key is not authorized for the snapshot proof at this epoch." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/authority value=authority
13
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/authority value=inspect-authority
14
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/signer value=reference-export/signer
15
+ bound-lock/1 about="The selected signer failed or returned a signature that does not verify." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/signer value=host
16
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/signer value=inspect-signer
17
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/history value=reference-export/history
18
+ bound-lock/1 about="The current carrier profile cannot represent this historical authority; no original is silently removed." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/history value=authority
19
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/history value=inspect-standing-contract
20
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/catalog/invalid value=catalog/invalid
21
+ bound-lock/1 about="The refusal catalog is malformed, duplicated or incomplete." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/catalog/invalid value=interpretation
22
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/catalog/invalid value=resolve-catalog
23
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference/format value=reference/format
24
+ bound-lock/1 about="The reference has an unsupported or noncanonical shape." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference/format value=input
25
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference/format value=check-reference
26
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/standing/view value=standing/view
27
+ bound-lock/1 about="The place has not declared the public standing view." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/standing/view value=interpretation
28
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/standing/view value=declare-standing-view
29
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/standing/query value=standing/query
30
+ bound-lock/1 about="Standing accepts only the local committed projection." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/standing/query value=input
31
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/standing/query value=query-local-standing
32
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference-export/usage value=reference-export/usage
33
+ bound-lock/1 about="Reference export requires exactly one source and explicit signing options." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference-export/usage value=input
34
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference-export/usage value=check-export-arguments
35
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/context value=authenticated-reference/context
36
+ bound-lock/1 about="The supplied interpretation context or snapshot binding is inconsistent." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/context value=interpretation
37
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/context value=resolve-public-context
38
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/budget value=authenticated-reference/budget
39
+ bound-lock/1 about="The declared record or byte budget is invalid or exceeded." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/budget value=resource
40
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/budget value=inspect-resource-lines
41
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/transport value=authenticated-reference/transport
42
+ bound-lock/1 about="The content port failed or returned shared mutable bytes." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/transport value=host
43
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/transport value=inspect-content-port
44
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/integrity value=authenticated-reference/integrity
45
+ bound-lock/1 about="Carrier bytes or the snapshot commitment differ from their declared digest." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/integrity value=integrity
46
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/integrity value=resolve-exact-bytes
47
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/framing value=authenticated-reference/framing
48
+ bound-lock/1 about="The carrier is not the canonical supported UTF-8 frame." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/framing value=input
49
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/framing value=check-carrier
50
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/wire value=authenticated-reference/wire
51
+ bound-lock/1 about="An original record is not canonical supported wire." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/wire value=input
52
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/wire value=check-original-records
53
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/authority value=authenticated-reference/authority
54
+ bound-lock/1 about="The proof or an original lacks admitted authority under the supplied context." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/authority value=authority
55
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/authority value=inspect-authority
56
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/history value=authenticated-reference/history
57
+ bound-lock/1 about="This carrier profile cannot authenticate configuration withdrawal history." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/history value=interpretation
58
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/history value=request-admitted-standing
59
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/object-context value=authenticated-reference/object-context
60
+ bound-lock/1 about="The existing object validator refused the declared form or context." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/object-context value=interpretation
61
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/object-context value=inspect-object-context
62
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/authenticated-reference/identity value=authenticated-reference/identity
63
+ bound-lock/1 about="The semantic standing differs from the reference identity." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/authenticated-reference/identity value=integrity
64
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/authenticated-reference/identity value=resolve-standing
65
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/operation/failed value=operation/failed
66
+ bound-lock/1 about="An operation failed without a more specific public code; details are diagnostic only." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/operation/failed value=host
67
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/operation/failed value=inspect-diagnostic
68
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/operation/usage value=operation/usage
69
+ bound-lock/1 about="The command arguments do not describe a supported public operation." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/operation/usage value=input
70
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/operation/usage value=check-arguments
71
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference/backend value=reference/backend
72
+ bound-lock/1 about="The host did not select a supported explicit reference backend." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference/backend value=interpretation
73
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference/backend value=select-reference-backend
74
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=code role=writes scope=refusal/reference/cancelled value=reference/cancelled
75
+ bound-lock/1 about="The opening was interrupted before a complete result." at=policy:bound-reference-export by=target form=alphabet measure=class role=writes scope=refusal/reference/cancelled value=host
76
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=next role=writes scope=refusal/reference/cancelled value=inspect-interruption
77
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/budget value=host-port/budget
78
+ bound-lock/1 about="A host port lacks a valid finite budget or exceeds its byte bound." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/budget value=resource
79
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/budget value=inspect-resource-lines
80
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/cancelled value=host-port/cancelled
81
+ bound-lock/1 about="A host operation was cancelled before a complete result." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/cancelled value=host
82
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/cancelled value=inspect-interruption
83
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/timeout value=host-port/timeout
84
+ bound-lock/1 about="A host operation exceeded its declared lifetime." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/timeout value=host
85
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/timeout value=inspect-host-port
86
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/failed value=host-port/failed
87
+ bound-lock/1 about="A declared host callback failed; no successful result is returned." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/failed value=host
88
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/failed value=inspect-host-port
89
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/integrity value=host-port/integrity
90
+ bound-lock/1 about="Content bytes differ from the requested SHA-256 identity." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/integrity value=integrity
91
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/integrity value=resolve-exact-bytes
92
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=code role=writes scope=refusal/host-port/response value=host-port/response
93
+ bound-lock/1 about="A host response has an unsupported shape or shared mutable bytes." at=policy:bound-host-ports by=target form=alphabet measure=class role=writes scope=refusal/host-port/response value=host
94
+ bound-lock/1 at=policy:bound-host-ports by=target form=alphabet measure=next role=writes scope=refusal/host-port/response value=inspect-host-port
@@ -0,0 +1,47 @@
1
+ # Public refusal catalog
2
+
3
+ Source of truth: `refusals.bound` (`bound-refusals@1`), read through the existing wire parser. `readRefusalCatalog` and `describeRefusal` are exported from `/reference`; resolve `@lapxo/bound/refusals` for the published lines. The digest of these exact lines is bound into the authenticated reference context.
4
+
5
+ `BoundRefusal.code` is stable; diagnostic text is not a code. Native CLI refusals retain the diagnostic and emit a `bound-refusal@1` JSON record with code, category, meaning, next and catalog digest. Recommendations grant no authority and execute nothing. If the installed catalog cannot be read or validated, the CLI emits `catalog/invalid` with metadata explicitly `unmeasured`; it never fabricates a catalog digest or recursively formats that failure. A consumer checks the catalog bytes against its independently accepted context digest before parsing; parsing alone proves no authority. Legacy operations without a specific public code use `operation/failed`; no diagnostic is classified by regex. This does not claim a distinct code for every historical diagnostic. Successful four-state results remain results, never refusal codes.
6
+
7
+ | Code | Class | Meaning | Suggested next |
8
+ | --- | --- | --- | --- |
9
+ | reference-export/source | input | The source URL is not a canonical standing-reference location. | check-source |
10
+ | reference-export/context | interpretation | Required admitted export policy or exact contract bytes are missing or conflicting. | inspect-standing |
11
+ | reference-export/budget | resource | The export exceeds or lacks its explicitly declared record or byte budget. | inspect-resource-lines |
12
+ | reference-export/authority | authority | The selected key is not authorized for the snapshot proof at this epoch. | inspect-authority |
13
+ | reference-export/signer | host | The selected signer failed or returned a signature that does not verify. | inspect-signer |
14
+ | reference-export/history | authority | The current carrier profile cannot represent this historical authority; no original is silently removed. | inspect-standing-contract |
15
+ | catalog/invalid | interpretation | The refusal catalog is malformed, duplicated or incomplete. | resolve-catalog |
16
+ | reference/format | input | The reference has an unsupported or noncanonical shape. | check-reference |
17
+ | standing/view | interpretation | The place has not declared the public standing view. | declare-standing-view |
18
+ | standing/query | input | Standing accepts only the local committed projection. | query-local-standing |
19
+ | reference-export/usage | input | Reference export requires exactly one source and explicit signing options. | check-export-arguments |
20
+ | authenticated-reference/context | interpretation | The supplied interpretation context or snapshot binding is inconsistent. | resolve-public-context |
21
+ | authenticated-reference/budget | resource | The declared record or byte budget is invalid or exceeded. | inspect-resource-lines |
22
+ | authenticated-reference/transport | host | The content port failed or returned shared mutable bytes. | inspect-content-port |
23
+ | authenticated-reference/integrity | integrity | Carrier bytes or the snapshot commitment differ from their declared digest. | resolve-exact-bytes |
24
+ | authenticated-reference/framing | input | The carrier is not the canonical supported UTF-8 frame. | check-carrier |
25
+ | authenticated-reference/wire | input | An original record is not canonical supported wire. | check-original-records |
26
+ | authenticated-reference/authority | authority | The proof or an original lacks admitted authority under the supplied context. | inspect-authority |
27
+ | authenticated-reference/history | interpretation | This carrier profile cannot authenticate configuration withdrawal history. | request-admitted-standing |
28
+ | authenticated-reference/object-context | interpretation | The existing object validator refused the declared form or context. | inspect-object-context |
29
+ | authenticated-reference/identity | integrity | The semantic standing differs from the reference identity. | resolve-standing |
30
+ | operation/failed | host | An operation failed without a more specific public code; details are diagnostic only. | inspect-diagnostic |
31
+ | operation/usage | input | The command arguments do not describe a supported public operation. | check-arguments |
32
+ | reference/backend | interpretation | The host did not select a supported explicit reference backend. | select-reference-backend |
33
+ | reference/cancelled | host | The opening was interrupted before a complete result. | inspect-interruption |
34
+ | host-port/budget | resource | A host port lacks a valid finite budget or exceeds its byte bound. | inspect-resource-lines |
35
+ | host-port/cancelled | host | A host operation was cancelled before a complete result. | inspect-interruption |
36
+ | host-port/timeout | host | A host operation exceeded its declared lifetime. | inspect-host-port |
37
+ | host-port/failed | host | A declared host callback failed; no successful result is returned. | inspect-host-port |
38
+ | host-port/integrity | integrity | Content bytes differ from the requested SHA-256 identity. | resolve-exact-bytes |
39
+ | host-port/response | host | A host response has an unsupported shape or shared mutable bytes. | inspect-host-port |
40
+
41
+ Native quartet: `refusals.publication.json`. `vectors/native/refusals.vector.json` checks the wire catalog, its derived page, duplicate/missing records, and real export/inspection refusals in two places. No failed operation becomes a successful receipt. The captured semantic marker is:
42
+
43
+ ```text
44
+ REFUSALS lines · unique codes · exact metadata · duplicate refused
45
+ ```
46
+
47
+ Specific producers cover reference syntax, standing query/view, native export usage/source/context/budget/authority/signer/history, and authenticated inspection context/budget/transport/integrity/framing/wire/authority/history/object-context/identity. Numeric CLI usage and uncoded legacy failures use the explicitly generic codes above; diagnostics remain unclassified. B2/B5 may add codes only by changing these versioned contract bytes and their vectors.
@@ -0,0 +1,25 @@
1
+ {
2
+ "scope": "contract/published/refusals",
3
+ "members": [
4
+ {
5
+ "role": "contract",
6
+ "path": "docs/contracts/refusals.md",
7
+ "digest": "sha256:ed549322f385e184b0defe705eac62cf546b8617ecb7f9fbe3f727431820f10c"
8
+ },
9
+ {
10
+ "role": "yes",
11
+ "path": "samples/refusals/yes.json",
12
+ "digest": "sha256:ea1c792b30ac00df4390343fe51359efe4e569964cd4da25daa5492b6db4dd03"
13
+ },
14
+ {
15
+ "role": "vector",
16
+ "path": "vectors/native/refusals.vector.json",
17
+ "digest": "sha256:2e2833bc6388784e030b50232bd99f84ccb05b0fd6ed86f6db0a5a0b1dc38e05"
18
+ },
19
+ {
20
+ "role": "no",
21
+ "path": "samples/refusals/no.json",
22
+ "digest": "sha256:731fc1240064d52b90ca04f627821a1f241382cf159fa33d3d1e18e7fc778a70"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,9 @@
1
+ bound-lock/1 at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/contract value=authenticated-standing-projection@1
2
+ bound-lock/1 about="Standing is authenticated under admission snapshots across declared key classes." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/classes value=all-declared
3
+ bound-lock/1 about="Exact redelivery does not establish another origin." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/duplicates value=preserve-attribution
4
+ bound-lock/1 about="Exact configuration withdrawals are applied before publication; typed records retain their admitted effective history." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/withdrawals value=exact
5
+ bound-lock/1 about="Incompatible admitted declarations are preserved; no first-wins selection." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/conflicts value=preserve
6
+ bound-lock/1 about="Historical receipts are evidence, not current authority or a current response." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/history value=distinct
7
+ bound-lock/1 about="Public current configuration omits withdrawal markers; authenticated historical records remain available through evidence and act views." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/publication value=live-configuration
8
+ bound-lock/1 about="The contextual carrier separates Root, legacy places and committed place contexts; clocks are never flattened." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/namespaces value=preserve
9
+ bound-lock/1 about="Typed records retain admitted effective order; standing is evidence rather than a new grant of authority." at=policy:bound-reference-export by=target form=alphabet measure=id role=writes scope=standing/effective-order value=admitted