@lapxo/head 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 (53) hide show
  1. package/README.md +1 -1
  2. package/TARGET.bound +150 -34
  3. package/dist/src/adopt/adopt.d.ts +2 -2
  4. package/dist/src/adopt/adopt.js +20 -6
  5. package/dist/src/answers/answered.js +1 -1
  6. package/dist/src/compile/pin.d.ts +1 -1
  7. package/dist/src/compile/pin.js +5 -3
  8. package/dist/src/core/answer.d.ts +10 -0
  9. package/dist/src/core/answer.js +1 -1
  10. package/dist/src/core/association.d.ts +16 -0
  11. package/dist/src/core/association.js +34 -0
  12. package/dist/src/core/composition.d.ts +32 -0
  13. package/dist/src/core/composition.js +28 -0
  14. package/dist/src/core/package.d.ts +1 -0
  15. package/dist/src/core/package.js +14 -3
  16. package/dist/src/core/read.d.ts +2 -1
  17. package/dist/src/core/read.js +2 -1
  18. package/dist/src/core/receiver.d.ts +11 -0
  19. package/dist/src/core/receiver.js +122 -0
  20. package/dist/src/core/share-bundle.d.ts +9 -0
  21. package/dist/src/core/share-bundle.js +56 -0
  22. package/dist/src/doors/head.d.ts +1 -0
  23. package/dist/src/doors/head.js +3 -0
  24. package/dist/src/flows/answer.js +7 -3
  25. package/dist/src/flows/call.d.ts +1 -1
  26. package/dist/src/flows/call.js +28 -4
  27. package/dist/src/flows/device.d.ts +11 -5
  28. package/dist/src/flows/device.js +13 -5
  29. package/dist/src/flows/plan.js +1 -1
  30. package/dist/src/index.js +3 -31
  31. package/dist/src/links/inspect.js +1 -1
  32. package/dist/src/onboard/first.js +1 -1
  33. package/dist/src/onboard/owed.js +1 -1
  34. package/dist/src/places/admit.js +1 -1
  35. package/dist/src/places/found.js +3 -1
  36. package/dist/src/ports/adapters/bundle.d.ts +44 -0
  37. package/dist/src/ports/adapters/bundle.js +173 -0
  38. package/dist/src/ports/adapters/configured.d.ts +35 -0
  39. package/dist/src/ports/adapters/configured.js +67 -0
  40. package/dist/src/ports/adapters/mcp.d.ts +59 -0
  41. package/dist/src/ports/adapters/mcp.js +122 -0
  42. package/dist/src/ports/adapters/network.d.ts +12 -0
  43. package/dist/src/ports/adapters/network.js +67 -0
  44. package/dist/src/ports/adapters/protocol.d.ts +6 -0
  45. package/dist/src/ports/adapters/protocol.js +51 -0
  46. package/dist/src/ports/adapters/remote.d.ts +13 -0
  47. package/dist/src/ports/adapters/remote.js +33 -0
  48. package/dist/src/sources/connect.d.ts +1 -0
  49. package/dist/src/sources/connect.js +13 -10
  50. package/dist/src/verbs/ask.js +6 -0
  51. package/dist/src/verbs/do.js +2 -1
  52. package/package.json +5 -4
  53. package/runtime.bundle.json +24026 -0
package/TARGET.bound CHANGED
@@ -4,7 +4,7 @@ bound-lock/1 about="# Agreement keeps its sources\n\nTwo matching answers need n
4
4
  bound-lock/1 about="# Connect any API\n\nhead reads an API by the document its provider already publishes, at the address you give it. head names no provider and connects none of its own: what is connected is what you hand it. Here is one way for each level of access, with an API of each kind.\n\n### No access: a document that says nothing about it\n\nTake an API whose document lists its operations and states nothing about access. head does not guess what that means: it tries a read once with nothing attached, and keeps what it saw (`access/<source>/<operation>/observed anonymous`) as a receipt its own key signs. Nothing but a read is ever tried this way.\n\nConnect the document by its address, `https://<provider>/openapi.yaml`, by the site that publishes it, or by a folder holding it, as `forecast`, then read one of its operations. With no place yet, one yes founds your place in `~/place`, connects the document there and lets head read `forecast` for the next 90 days. A document that names several servers asks once which one. The answer comes back typed by what the document declares, one value a line, with a signed receipt of the read (abridged):\n\n```text\nanswer/<request>/current/temperature number …\nanswer/<request>/current_units/temperature text …\nread/forecast/<operation>/<request> digest sha256:… signed by head\n```\n\nAn overlay can still say what the provider says on its own site, so the place states it rather than observes it:\n\n```yaml\noverlay: 1.0.0\ninfo: { title: the forecast, read without a key, version: '1' }\nactions:\n - target: \"$.paths['/forecast'].get\"\n description: the provider says this read needs no key\n update: { security: [] }\n```\n\nWhatever API you connect, its terms are the provider's: read them before you connect it, and say where an answer came from when they ask you to.\n\n### A declared flow: OAuth 2.0\n\nTake an API whose document declares OAuth 2.0 with an authorization code. head compiles it into the two steps it takes, the provider's page with PKCE and then the token exchange, and nobody writes a line of it. What it needs is yours: the client id of an app you registered with the provider, signed into the place as `keys/access/<source>/<flow> client <id>`. Until then head says so and calls nothing.\n\n### A secret entered by hand\n\nWhen a document declares a bearer token or an API key and no way to obtain one, the key is a secret input. head asks for it on its own one-time page, never through the model, and only when the place's root allows a secret with `access/secret-inputs`. It is kept in the keychain, never in a file.\n\n### When the document says too little\n\nA login of its own (an email, a one-time code, a choice of account) is written once as an `x-access` flow, an Arazzo profile in an overlay, and every API of the same issuer refers to it with one `$ref`. The profile and its vectors are on topos-openapi's own page, `docs/x-access.md` in `@lapxo/topos-openapi`. Every API connected this way is read the same way afterwards: one access per issuer, each answer typed and kept.\n" at=policy:head/connect/0.1.4 by=target form=alphabet measure=text role=writes scope=prose/en/page/connect-any-api shape=docs/connect-any-api.md value=lock
5
5
  bound-lock/1 about="# Security\n\nReport vulnerabilities privately to hello@lapxo.com. Do not open public issues for security reports.\n\nWe acknowledge reports within 7 days. There is no bug bounty or reward. We will credit you in a fix if you want.\n\n## What is trusted\n\nThe owner chooses the place, its admitted keys and permissions, the installed instrument, the source descriptions and the transport policy. The operating system, keychain and code running with the user's privileges are part of the trusted computing base. The model, remote source content, received packages and suggested actions are not authority. The MCP client is trusted to display consent requests and report the person's response accurately; a compromised or auto-approving client can misrepresent that response, and head cannot prove a person clicked yes.\n\nA source document describes an operation. Its accuracy and the source's data remain the provider's responsibility. A misclassified read can have server-side effects; head does not prove the provider's implementation. A signature proves the statement checked under its admitted key and context; it does not prove that an API answer is true.\n\n## Signing and access secrets\n\nSigning keys are handled by the short-lived signer. Its supported interface returns public keys or signatures, and the long process refuses a signing key requested by name. API credentials are different: the access and transport adapters must handle them to authenticate the request to the declared provider. Supported paths keep them out of model arguments, normal answers, command arguments and ordinary receipts.\n\nThis is a code boundary, not OS isolation. The signer and head run as the same user. A compromised same-user process can invoke the keychain, replace code or read data that user can access. This release does not claim protection from it, nor guaranteed secret removal from arbitrary malicious source bodies, crash dumps or external programs. Do not put secrets in API descriptions or model messages.\n\n## Network and doors\n\nA digest is not network permission. Retrieval still requires the receiver's origin and transport policy. The declared host checks destinations and redirect policy; a matching hash does not authorize a private-network request, a downgrade or forwarding credentials to another origin.\n\nThe network doors bind to loopback and validate their Host and Origin boundaries. Loopback alone is not authentication. A client can suggest an action, but the place's permissions and consent rules still apply. Cancellation and request scratch cleanup have their existing bounds; they do not make an arbitrary process safe to run.\n\n## Configuration is not general execution authority\n\nThe native authority preflight checks exact configuration records and their admission context. It authenticates the selected place, instrument, key, records, epoch and explicit clock. A card is an observation of that context, not permission to sign or land a changed future action. The actual act independently checks current authority.\n\nAPI execution, aggregates, access negotiation, secret consent and personal-attestation admission are not all covered by that preflight. Their existing domain checks remain. An old card can become stale after any Root epoch change even when a particular key's eligibility remains unchanged. A local coverage declaration is not revocation of the original Root anchor.\n\n## Sharing and lineage\n\nA content reference, source package and portable public birth declaration are different objects. Inspection does not connect a source, import grants or install an owner. A holder address is not authenticated sender identity. Hash equality establishes the named bytes only under the selected contract.\n\nSource descriptions can themselves contain sensitive information. Review them before sharing. The selected portable birth profile excludes authority material; it does not make every file in a place public. Keep the local birth journal, credentials, keychain, admission history and derived stores out of a shared package.\n\nLineage marks report declared relationships and recognized source identity. They do not establish statistical independence, a confidence score or a count of independent causes. Withdrawing a declaration changes the current view; it does not erase earlier receipts.\n\n## Supported environment and useful reports\n\nmacOS desktop is the supported environment. Other platform adapters and tests are not evidence of a real Linux secret service, browser flow or unattended deployment. Multiple local processes do not establish distributed coordination over a shared object store.\n\nUseful reports include a reproducible action that obtains a key without coverage, lands without an admitted signer, bypasses a door or network policy, changes a refusal through a supported door, or treats received bytes or a stale card as permission. Include the version, expected boundary and a minimal reproducer. Redact credentials and personal paths; never send a signing key.\n\nThe model's behavior, third-party API correctness and programs outside the supported boundaries are not security guarantees of head. A vulnerability in how head handles those inputs is still relevant. Related algebra, contract and instrument bugs can be reported through the same private channel.\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/security shape=SECURITY.md value=lock
6
6
  bound-lock/1 about="# Share public declarations, then inspect them\n\nA place has several different things you can share:\n\n- A source package names its documents, overlays and compiled pins by digest. Receiving it still needs local permission.\n- A content reference names bytes. A separate holder location says where to obtain them; no location means no invented address. A viewer address is not a holder.\n- `birth.topos` is a separate unsigned public declaration artifact. It does not carry the local `birth.bound`, keys, grants or admission history.\n\nThis executable checkout example shares only a public language declaration. It creates independent fixture places and simulated keys. It does not contact an external API or change your real keychain. Run `npm ci --ignore-scripts` first; Node 22.18 or later is required.\n\n```sh\nnode --input-type=module <<'JS'\nimport { readFileSync, mkdtempSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { strict as assert } from 'node:assert';\nimport { born, line } from './test/place.ts';\nimport { ask } from './test/client.ts';\nconst demo = JSON.parse(readFileSync('docs/examples/sharing.json', 'utf8'));\nconst shared = mkdtempSync(join(tmpdir(), 'head-public-example-'));\nconst sender = born(undefined, [line(demo.sender.scope, 'id', demo.sender.value)], null, false, 'catalog', false);\nconst receiver = born(undefined, [line(demo.receiver.scope, 'id', demo.receiver.value)], null, false, 'route-notes', false);\nconst env = p => ({ ...p.keychain.env, HEAD_HOME: join(mkdtempSync(join(tmpdir(), 'head-example-home-')), 'home') });\nconst call = (name, arguments_) => ({ method: 'tools/call', params: { name, arguments: arguments_ } });\nconst [packed] = await ask([call('share', { place: sender.place, to: join(shared, 'public') })], [shared], env(sender));\nconst birth = packed.result.structuredContent.cells.find(c => c.code === 'head/birth-shared');\nassert(birth);\nconst before = readFileSync(join(receiver.place, 'TARGET.bound'));\nconst [inspected, altered] = await ask([\n call('connect', { place: receiver.place, document: birth.fields.document, digest: birth.fields.digest }),\n call('connect', { place: receiver.place, document: birth.fields.record + ' ', digest: birth.fields.digest })\n], [shared], env(receiver));\nconst observation = inspected.result.structuredContent.cells.find(c => c.code === demo.expectedCode);\nassert(observation && observation.fields.collisions === demo.expectedCollision);\nassert(altered.result.structuredContent.cells.some(c => c.code === demo.negativeCode));\nassert.deepEqual(readFileSync(join(receiver.place, 'TARGET.bound')), before);\nconsole.log(JSON.stringify({ inspection: observation.code, collision: observation.fields.collisions, alteredBytes: demo.negativeCode, authorityTransferred: false }, null, 2));\nJS\n```\n\nThe receiver names the occupied `lang` coordinate and keeps its own value. One changed byte with the expected digest is refused. Inspection does not import permission or identify an authenticated sender. To adopt a declaration, the receiver uses its ordinary local admission process; this example intentionally does not do that.\n\nA standing reference follows the same separation: compare the expected content identity and apply the receiver's network policy before fetching. A holder URL is not authority. The existing located-reference vector is `node --test test/link-url.test.ts`; it also covers missing locations, altered bytes and denied transport. Review source documents for sensitive information before sharing them.\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/sharing shape=docs/sharing.md value=lock
7
- bound-lock/1 about="# head\n\nAsk your APIs through an assistant. Keep who answered, what was read, and what you allowed.\n\nhead is an MCP server. Give it an API document, approve the connection, and ask a question. It reads operations the document declares, returns typed fields when a schema is available, and keeps signed receipts of its reads. Without a usable schema, the answer is named as untyped.\n\n```text\nYou: Connect this API as forecast.\n [give its OpenAPI document; approve the connection]\nYou: What is the forecast in Lima?\n\nforecast: temperature 21, sky clear\nreceipt: sha256:…\n```\n\nThis is an illustrative fixture, not a live forecast. [Run the local example](docs/first-minute.md) without an account or a real secret.\n\n## Start\n\nFor an assistant that starts MCP servers by command:\n\n```sh\nnpx -y @lapxo/head@0.2.0 run\n```\n\nThe pin above names this release; the executable examples in this tree use the checkout. A client can also open a desktop extension from [releases](https://github.com/Lapxo/head/releases); check the artifact digests supplied with the release. Starting head alone prints help; `head run` starts the MCP server.\n\nmacOS is the supported desktop environment. Node 22.18 or later is required. Linux, Windows and unattended cloud execution are not validated as supported environments here. A successful mock or CI job does not establish working system-keychain and browser integration.\n\n## What you do\n\n- **Connect** a document, optionally with an overlay. head pins the compiled description by digest. With no place yet, the first approved connection creates `~/place`.\n- **Ask** for one operation or compare the same question across sources. Receipts keep the source and time. A missing answer stays owed; an empty answer is not a missing answer.\n- **Act** within the place's permissions and consent rules. A suggested next step is not authorization. Writes do not become allowed because a model asked for them.\n- **Share and inspect** public material. A reference identifies content; a separate holder location says where to obtain it. Inspection checks the selected contract and grants nothing. [Try sharing and verification](docs/sharing.md).\n\nYour place keeps its declarations as text. `birth.bound` separates your local declarations from head's profile. Keep it private unless you have reviewed what you are sharing: it is not the portable public `birth.topos` artifact.\n\n## Two names are not two independent sources\n\nIf `mirror` shares `forecast`'s declared lineage, agreement is shown as `●○`. Both sources and their receipts remain visible. `●●` does not prove independence; it only reports what the declared lineage and source identity establish. Disagreement keeps each source's value instead of choosing a winner.\n\n[Run the lineage example](docs/lineage.md), including withdrawal of the lineage declaration without erasing earlier receipts.\n\n## Boundaries you can check\n\nSigning keys stay behind a short-lived signer port in the supported flow. Tokens go to the declared transport, not into model arguments. A compromised process running as your user is outside that code boundary: it can invoke the keychain itself.\n\nA digest is not network permission or proof that an answer is true. Received bytes install no authority. Configuration preflight does not replace API permission, access or secret-consent checks. See the [threat model and reporting policy](SECURITY.md), and [connect an API](docs/connect-any-api.md) for access options.\n\nThe three public MCP tools are `ask`, `connect` and `do`. Examples reuse the existing client and fixtures; they add no provider-specific behavior to head.\n" at=policy:head/release/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/readme shape=README.md value=lock
7
+ bound-lock/1 about="# head\n\nAsk your APIs through an assistant. Keep who answered, what was read, and what you allowed.\n\nhead is an MCP server. Give it an API document, approve the connection, and ask a question. It reads operations the document declares, returns typed fields when a schema is available, and keeps signed receipts of its reads. Without a usable schema, the answer is named as untyped.\n\n```text\nYou: Connect this API as forecast.\n [give its OpenAPI document; approve the connection]\nYou: What is the forecast in Lima?\n\nforecast: temperature 21, sky clear\nreceipt: sha256:…\n```\n\nThis is an illustrative fixture, not a live forecast. [Run the local example](docs/first-minute.md) without an account or a real secret.\n\n## Start\n\nFor an assistant that starts MCP servers by command:\n\n```sh\nnpx -y @lapxo/head@0.2.1 run\n```\n\nThe pin above names this release; the executable examples in this tree use the checkout. A client can also open a desktop extension from [releases](https://github.com/Lapxo/head/releases); check the artifact digests supplied with the release. Starting head alone prints help; `head run` starts the MCP server.\n\nmacOS is the supported desktop environment. Node 22.18 or later is required. Linux, Windows and unattended cloud execution are not validated as supported environments here. A successful mock or CI job does not establish working system-keychain and browser integration.\n\n## What you do\n\n- **Connect** a document, optionally with an overlay. head pins the compiled description by digest. With no place yet, the first approved connection creates `~/place`.\n- **Ask** for one operation or compare the same question across sources. Receipts keep the source and time. A missing answer stays owed; an empty answer is not a missing answer.\n- **Act** within the place's permissions and consent rules. A suggested next step is not authorization. Writes do not become allowed because a model asked for them.\n- **Share and inspect** public material. A reference identifies content; a separate holder location says where to obtain it. Inspection checks the selected contract and grants nothing. [Try sharing and verification](docs/sharing.md).\n\nYour place keeps its declarations as text. `birth.bound` separates your local declarations from head's profile. Keep it private unless you have reviewed what you are sharing: it is not the portable public `birth.topos` artifact.\n\n## Two names are not two independent sources\n\nIf `mirror` shares `forecast`'s declared lineage, agreement is shown as `●○`. Both sources and their receipts remain visible. `●●` does not prove independence; it only reports what the declared lineage and source identity establish. Disagreement keeps each source's value instead of choosing a winner.\n\n[Run the lineage example](docs/lineage.md), including withdrawal of the lineage declaration without erasing earlier receipts.\n\n## Boundaries you can check\n\nSigning keys stay behind a short-lived signer port in the supported flow. Tokens go to the declared transport, not into model arguments. A compromised process running as your user is outside that code boundary: it can invoke the keychain itself.\n\nA digest is not network permission or proof that an answer is true. Received bytes install no authority. Configuration preflight does not replace API permission, access or secret-consent checks. See the [threat model and reporting policy](SECURITY.md), and [connect an API](docs/connect-any-api.md) for access options.\n\nThe three public MCP tools are `ask`, `connect` and `do`. Examples reuse the existing client and fixtures; they add no provider-specific behavior to head.\n" at=policy:head/release/0.2.1 by=target form=alphabet measure=text role=writes scope=prose/en/readme shape=README.md value=lock
8
8
  bound-lock/1 about="*.mts\n*changelog*\n!node_modules/@lapxo/bound/**/*.d.ts\n" at=policy:head/bundle-pin/0.1.7 by=target form=alphabet measure=text role=writes scope=prose/en/bundle/exclusions shape=.mcpbignore value=lock
9
9
  bound-lock/1 about="A call through this door carries the card of its place ({place}): ask for it first. Nothing was asked or called." at=policy:head/doors/0.1.7-guard by=target form=alphabet measure=id role=writes scope=said/door-uncarded value=lock
10
10
  bound-lock/1 about="A place is founded in an absolute folder: nothing was made." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/place-absolute value=lock
@@ -43,18 +43,26 @@ bound-lock/1 about="Configuration preflight for {key}: {decision}; kind {kind};
43
43
  bound-lock/1 about="Configuration preflight needs {needs} for {key}. Nothing is signed or admitted." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-needed value=lock
44
44
  bound-lock/1 about="Configuration preflight refused for {key}: {why}. No configuration signature or admission was requested." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-refused value=lock
45
45
  bound-lock/1 about="Connect a source to a place from its document." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/connect value=place|source|document
46
- bound-lock/1 about="Connect a source to a place, once the person says yes: its document, and an overlay beside it, laid whatever its kind and compiled once by whichever world reads it — or open, with the line that pays it — into what the source offers and how access is proven, pinned by digest. Nothing is called. A document at an address may be read as a source the place connected, with the access it holds, and checked against its digest. A package another place shared is connected whole: its lock as the document, named by its digest. A site alone or a folder is looked for its document first, before anything is founded. With no place yet, the first connect founds the person's place on one yes that also lets head read the source." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/connect value=place|source|document|overlay|digest|via|accept|operation|args
46
+ bound-lock/1 about="Connect a source to a place, once the person says yes: its document, and an overlay beside it, laid whatever its kind and compiled once by whichever world reads it — or open, with the line that pays it — into what the source offers and how access is proven, pinned by digest. Nothing is called. A document at an address may be read as a source the place connected, with the access it holds, and checked against its digest. A package another place shared is connected whole: its lock as the document, named by its digest. A site alone or a folder is looked for its document first, before anything is founded. With no place yet, the first connect founds the person's place on one yes that also lets head read the source." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/connect value=protocol|place|source|document|overlay|digest|via|accept|operation|args
47
47
  bound-lock/1 about="Connect any API" at=policy:head/docs by=target form=alphabet measure=text role=writes scope=prose/en/page/connect-any-api/heading value=lock
48
+ bound-lock/1 about="Connect the selected public document {document} as {source}, then repeat share. Nothing was fetched by export." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-source-needed value=lock
48
49
  bound-lock/1 about="Connect {source} to the place {place} from {document} with the connect tool, then show me what it offers." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/connect/text value=lock
49
50
  bound-lock/1 about="Connected to {place} from the package {package}: {sources} — every document and every pin as it names them. Nothing was granted with them: access is asked here, issuer by issuer." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=said/received value=lock
51
+ bound-lock/1 about="Current physical reading sha256:a89dd0f85117745631734c6bfa612a18c5aacc79f5c328295f7a247d9da0601f; the lines of all of head's source, together, read by head's suite; widened by the ports region removing what each bound run read once it ends, 4, as the owner ruled; widened by the signing key leaving head-s long process and its refusal written by every door, 7, as the owner ruled; B measured capacity: 2779 lines; witness sha256:30dbaabd472e14a868bbf3a5abe0ff1919232e33668de67fac07d57b572da3a0; C measured capacity: 2826 lines; witness sha256:5b13f1d6e99c3898a11a849d89608f6b92ec968e32b307ed8ae9e4a5242e1622; B1-B3 measured capacity: 2828 lines; witness sha256:d5cd8a69c52aac6de6c39c2a3380b86d84ef1b10b0e3e959927cb382da0a6ae4; composition preparation measured capacity: 2902 lines; witness sha256:352052b687589a55fbd333dab46db39306117f4861e82ebb335e794986b5ef87; share assembly measured capacity: 3024 lines; witness sha256:e4fdec6a3605976ebbd1a38d97958b9da4a5bdcd680cb5ca587a7eedefe76a17; measured 3107 lines; witness sha256:971e89508c79a57a115f0d510f512ec7289d1ec43159ff87df9fce1eae0591d5; single SDK binding and configured ports: 3118 physical lines; witness sha256:57aeee51f2ae0f23b8068c8ff190047361deec6232e386bbec192edcb0902c0e; receiver runtime measured capacity: 3252 lines; witness sha256:fefc88b1c0699aae34af20bc593a85194650bf2ab8f41f4bfab5dfdcf9d82480" at=witness:head/mcp-answer/capacity by=target form=interval measure=source-lines role=writes scope=source/lines value=0..3421
52
+ bound-lock/1 about="Current physical reading sha256:a89dd0f85117745631734c6bfa612a18c5aacc79f5c328295f7a247d9da0601f; the lines of the core region, together; B1-B3 measured capacity: 804 lines; witness sha256:376da26ce87d9b34fe44bd1b1cdd8a54663b96a1009bdacbf8a72c09d3367463; composition preparation measured capacity: 830 lines; witness sha256:d69a7a46e4bfb232dfdca4c29866588b9a88b0d9bf7b08132d9181deafad32d2; share assembly measured capacity: 883 lines; witness sha256:2de050b66a257fe61553b993a22f0c258dba06161db105c6e2013b73bd9dd2af; measured 912 lines; witness sha256:f5546111121539910dd698f64746ea1aa89f7a9d97ad42139d75d758409404f2; receiver runtime measured capacity: 1003 lines; witness sha256:4dd0ff82bd9a481058ed29623325c6aee418636145beba2bbfe1fbf0938060ab" at=witness:head/mcp-answer/capacity by=target form=interval measure=core-lines role=reads scope=core/lines value=0..1071
53
+ bound-lock/1 about="Current physical reading sha256:a89dd0f85117745631734c6bfa612a18c5aacc79f5c328295f7a247d9da0601f; the lines of the doors region, together, read by head's suite; widened by each door reading its ceiling of refusals from its own line; widened by head writing what it refuses, so MCP writes it as lines and http do, 6, as the owner ruled; C measured capacity: 205 lines; witness sha256:8fbd5a22177e9c61fb62fd7af605548d02b2cc425f7326b3c826cd23f333f658; share assembly measured capacity: 206 lines; witness sha256:561a8d0454ca2f3f112455054d0c64452e530d6c09fc6e7678ed319a756813a1; receiver runtime measured capacity: 207 lines; witness sha256:19501574950e156b89a1dc48e3ac82823a6deca0ed7595252a269510d9529987" at=witness:head/mcp-answer/capacity by=target form=interval measure=doors-lines role=writes scope=doors/lines value=0..208
50
54
  bound-lock/1 about="Current selected package metadata consumed by the installed acceptance release checks." at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/release-metadata value=package.json|package-lock.json
51
55
  bound-lock/1 about="Desktop Extension exclusions applied by the native packager without changing installed dependencies" at=policy:head/bundle-exclusions/0.1.6 by=target form=alphabet measure=id needs=.mcpbignore role=demands scope=view/bundle-exclusions shape=.mcpbignore value=text
52
56
  bound-lock/1 about="Do one action in a place, on the card ask answered for it: found a place, admit a device, land a lot ask planned, share a place, make this device's key, prove access to a source, call an offer that is not a read, or keep what the person states as theirs. An action on a place that moved since its card was asked is refused, with nothing done; one the place does not allow is said not to be in the card. The answer ends with the card valid from this act." at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=tool/do value=action|card|place|dir|name|key|coverage|lot|to|urls|who|source|operation|args|said|withdraw|origin
53
57
  bound-lock/1 about="Drafted lines, one a line, each by=target and unsigned: shown to the person and, on their yes to exactly those, signed by their key and folded as if landed. Nothing lands; the answer names the lot do lands." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/lines value=string
54
58
  bound-lock/1 about="Earlier, {source} answered the same request at {at}, under receipt {digest}." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/history-earlier value=lock
55
59
  bound-lock/1 about="Exact configuration records, one per line. Presence requests native configuration preflight instead of the existing cells view." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/card/lines value=string
60
+ bound-lock/1 about="Exact current producer inputs required by this regional evidence; compiled members are consumed inputs, not ignored maintenance." at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=digest needs=src/|dist/|test/|vectors/|docs/contracts/|package.json|package-lock.json|samples/composition/yes/ role=writes scope=dep/composition-inputs value=sha256:ff823082358cf7d8b83f91e76a6396b8dee0acdff1e07b2a1dcef609807e7ab4
56
61
  bound-lock/1 about="Exact selected manifest and lock agree with the reviewed installed artifact. Existing world-pin semantics remain in their current consumer vectors; no generic profile-composition integration is claimed." at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=release/category/pins value=release/installed-pins|release/metadata/*
62
+ bound-lock/1 about="Explicit document protocol: mcp discovers only the named HTTPS endpoint after recipient consent; omitted retains ordinary source documents." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/connect/protocol value=string
57
63
  bound-lock/1 about="Explicit recipient origins for the pinned content sources and their declared release-asset destination. The content digest grants no network permission; Bound validates each connection and redirect." at=policy:head/receiver/0.1.7 by=target form=alphabet measure=id role=writes scope=bound/receiver/origins value=https://github.com|https://registry.npmjs.org|https://release-assets.githubusercontent.com
64
+ bound-lock/1 about="Export the existing public source package to a folder, or assemble an .mcpb from a host-provisioned verified runtime and a JSON recipe in args. Unconnected OpenAPI URLs require the existing consented connect flow first. Missing MCP execution integration stays open; export grants nothing." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/share value=place|to|urls|args
65
+ bound-lock/1 about="First connect the MCP endpoint {document} as {source} with protocol=mcp. Export never discovers or invokes a server implicitly." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-mcp-needed value=lock
58
66
  bound-lock/1 about="For access and act: a source the place compiles." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/source value=string
59
67
  bound-lock/1 about="For act, the operation, by its name or in the person's words; for access, the read whose access is proven, without one the first read the source offers." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/do/operation value=string
60
68
  bound-lock/1 about="For act: the parameters by name, and body for what the operation is sent." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/args value=object
@@ -67,8 +75,9 @@ bound-lock/1 about="For key: head, for the key that signs what head read and did
67
75
  bound-lock/1 about="For land: the lot ask answered for the drafted lines." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/lot value=string
68
76
  bound-lock/1 about="For place, the name it is known by, without one the folder's; for admit, the name the place knows that device by." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/do/name value=string
69
77
  bound-lock/1 about="For place: the folder of the new place, absolute." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/dir value=string
70
- bound-lock/1 about="For share: The folder the package is written into, absolute, inside the place or a folder the client shares: never the place itself, its connected documents, a folder head or bound keeps, or a folder holding a lock that is no package." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/to value=string
71
78
  bound-lock/1 about="For share: Where the package's bytes are also published, as a JSON object from each path the package names to an encrypted address, signed or expiring as it may be; optional. A receiver then connects the lock from its own address, by its digest." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/do/urls value=string
79
+ bound-lock/1 about="For share: an absolute destination in a client-shared root or inside the place. A folder exports the public package; a new .mcpb file requests standard bundle assembly. Existing files and private place directories are never overwritten." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/do/to value=string
80
+ bound-lock/1 about="For share: an absolute destination in a client-shared root or inside the place. A folder exports the public package; a new .mcpb file requests standard bundle assembly. Existing files and private place directories are never overwritten." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/share/to value=string
72
81
  bound-lock/1 about="Found a place for my sources in a folder." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/place value=dir|name
73
82
  bound-lock/1 about="Found a place in a folder, once the person says yes: its root key made in the keychain, the lines it is born with — reads bounded, read-only — and its name in head's index of places." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/place value=dir|name
74
83
  bound-lock/1 about="Found the place {name} in {dir} with the do tool, as its place action. Ask me before you do." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/place/text value=lock
@@ -77,6 +86,9 @@ bound-lock/1 about="History, not a current answer: what {source} answered to {op
77
86
  bound-lock/1 about="How many times, at most." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/can/times value=string
78
87
  bound-lock/1 about="How {source} proves access, the most trusted first: {flows}. A flow that asks a secret runs only as far as this place allows: {allowed} on head's page (access/secret-inputs)." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/trust value=lock
79
88
  bound-lock/1 about="I allow {operation} on {source} up to {times} times. Plan this line for me to sign:" at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/can/text value=lock
89
+ bound-lock/1 about="Import the public sources {sources} from package {name} {revision} into {place}, founding it if needed, and remember this choice on this device? No sender keys, credentials or permissions are imported." at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-bundle-receive value=lock
90
+ bound-lock/1 about="Inspect the named refusal before preparing another request; no permission is granted." at=policy:head/ci-contract-repair/0.2.1 by=target form=alphabet measure=id role=writes scope=said/mcp-refused/next value=none
91
+ bound-lock/1 about="Invoke the selected MCP tool {source}/{operation} at {endpoint}, request {request}? A read-only hint is a declaration, not proof of an effect." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-mcp-call value=lock
80
92
  bound-lock/1 about="Its document: an https address or a file." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/connect/document value=string
81
93
  bound-lock/1 about="Its link is {link}. Publish {document} at {at} exactly as it is: the link names that document's bytes, never the package's files, which still go apart with its digest." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/shared-link value=lock
82
94
  bound-lock/1 about="Keep a source read-only: whatever it offers beyond reads is never called, whatever else is allowed." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/readonly value=source
@@ -86,11 +98,19 @@ bound-lock/1 about="Kept as yours in {place}: {said}" at=policy:head/claims/0.1.
86
98
  bound-lock/1 about="Kept in {place} as an agent stated it, never as the person's: {said}" at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/agent-claimed value=lock
87
99
  bound-lock/1 about="Land a lot plan signed, by its digest, while the place still stands on the base it was planned against." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/land value=lot
88
100
  bound-lock/1 about="Lines to sign come drafted, one a line, each by=target and unsigned: nothing was asked." at=policy:head/words/0.1.7-forbidden by=target form=alphabet measure=id role=writes scope=said/bad-lot value=lock
101
+ bound-lock/1 about="MCP endpoint {document} requires the client transport integration before it can be packaged as a working source. Nothing was invoked." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-protocol-pending value=lock
102
+ bound-lock/1 about="MCP refused: {why}. No permission follows from a catalogue or a package." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/mcp-refused value=lock
89
103
  bound-lock/1 about="Maximum history and request records in the native authority-card query; the existing bound/printed byte budget applies independently." at=policy:head/configuration-preflight/0.2.0 by=target form=interval measure=count role=writes scope=bound/authority/items value=0..65536
104
+ bound-lock/1 about="Measured response budget; witness sha256:c44e6ae5f10f3ee938f6d846f6c0a704688f5bbb9b15f261212fd73ccc45e922" at=witness:head/0.2.1/response-budget by=target form=interval measure=milliseconds needs=samples/mcp-receiver/yes/ role=demands scope=composition/mcp-receiver-latency value=0..6000
105
+ bound-lock/1 about="Measured response budget; witness sha256:c44e6ae5f10f3ee938f6d846f6c0a704688f5bbb9b15f261212fd73ccc45e922" at=witness:head/0.2.1/response-budget by=target form=interval measure=seconds role=reads scope=answer/seconds value=0..6
90
106
  bound-lock/1 about="More than one of what {source} offers fits \"{asked}\": the person chooses the one they meant, in head's form, which lists them to the person alone." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/pick-offer value=lock
91
107
  bound-lock/1 about="Native projection of the existing exact installed first-minute acceptance, checked against the current manifest and lock. Not CI or independent-machine evidence." at=policy:head/release-gates/0.2.0 by=target form=interval measure=defects needs=samples/first-minute/yes/ role=demands scope=release/cli-startup value=0..0
92
108
  bound-lock/1 about="Native projection of the existing exact installed first-minute acceptance, checked against the current manifest and lock. Not CI or independent-machine evidence." at=policy:head/release-gates/0.2.0 by=target form=interval measure=defects needs=samples/first-minute/yes/ role=demands scope=release/installed-pins value=0..0
109
+ bound-lock/1 about="No action is authorized by this result." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-protocol-pending/next value=none
110
+ bound-lock/1 about="No action is authorized by this result." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-refused/next value=none
111
+ bound-lock/1 about="No action is authorized by this result." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-shared/next value=none
93
112
  bound-lock/1 about="No answer of {operation} on {source} is held for this request: there is no line to say why. A read of it, at 8, lands the receipt that would." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=said/why-none value=lock
113
+ bound-lock/1 about="No bundle was written: {why}." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-refused value=lock
94
114
  bound-lock/1 about="No intent {intent} stands open for this source: nothing was closed." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/nothing-open value=lock
95
115
  bound-lock/1 about="No place stands yet, and head connects no API of its own: connecting {source} by the address of its document founds your place at {dir}, on one yes, and {operation} is asked again with {args}." at=policy:head/birth/0.1.4 by=target form=alphabet measure=id role=writes scope=said/unborn value=lock
96
116
  bound-lock/1 about="No place was named and the client shares no root: name the folder of a place." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-place value=lock
@@ -105,15 +125,22 @@ bound-lock/1 about="One view of a place as bound folds it, for a client to hold
105
125
  bound-lock/1 about="Only exact record-coverage and Root configuration admission are mapped. The receiver supplies canonical place, installed instrument and an explicit instant clock horizon; Bound selects and authenticates its current local admission epoch. Foreign evidence clocks never select receiver authority. API execution, aggregate actions, access negotiation, secret consent and personal attestation admission remain outside Q4 coverage. A snapshot card grants no later act; actual signing and admission independently validate current authority." at=policy:head/bound-repin/0.2.8 by=target form=alphabet measure=id role=writes scope=bound/authority/scope value=configuration
106
126
  bound-lock/1 about="Open this page on this device to answer: {title}. What you enter goes to head on this device, never through the model." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/answer value=lock
107
127
  bound-lock/1 about="Open this page on this device to enter what {title} asks for. Nothing you type passes through the model; only the secret it yields is kept, in your keychain." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/enter value=lock
128
+ bound-lock/1 about="Operation {source}/{operation} is outside the package selection for {place}." at=policy:head/ci-contract-repair/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-not-selected value=lock
129
+ bound-lock/1 about="Optional composition recipe JSON: id, revision, title, description and sources with source, namespace and offers. A missing document source may name its public HTTPS document to request consented connect; an MCP endpoint remains pending until its client transport is integrated. No executable or secret configuration is accepted." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=tool/share/args value=string
108
130
  bound-lock/1 about="Optional native configuration card for receiver-context rechecking; separate from the legacy do.card digest." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/ask/authority value=string
109
131
  bound-lock/1 about="Optional previously observed native authority card to recheck at the supplied receiver instant. It is separate from do.card and never chooses Root, instrument, key, clock or records." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/card/authority value=string
110
- bound-lock/1 about="Pack a place for another place to receive: a lock naming by digest each world its sources were compiled under and each source's document, overlay and compiled pin, written with those bytes into a folder — and, beside each digest, the encrypted address its bytes are also published at, where the person names one. It carries no key, no grant and no answer; nothing is asked, signed or landed. The folder or the addresses travel as the person chooses, and the digest apart, over a private channel." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/share value=place|to|urls
132
+ bound-lock/1 about="Package {name} {revision} is associated with your place {place}." at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-associated value=lock
111
133
  bound-lock/1 about="Packed from {place} into {to}: {sources}. Its lock names each by digest, beside the bytes it names. The package is {digest}: send it apart from the folder, over a private channel, and the receiver connects the lock by it. It carries no key and no answer, and grants nothing." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=said/shared value=lock
134
+ bound-lock/1 about="Physical bytes of each world standing selected by world/adopts; one reading per world, verified by its declared digest; excludes Root storage and sums across worlds" at=policy:head/world-standing/0.2.1 by=target form=interval measure=world-standing-bytes role=reads scope=world/standing-bytes value=0..1048576
112
135
  bound-lock/1 about="Pick the origin head reaches {source} at in this place, once. None is a default." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/pick value=lock
113
- bound-lock/1 about="Project reviewed local installed-client measurements; project the conservative recorded values in whole milliseconds and an explicit completeness reading. The existing strict client test enforces the six unchanged gates; receipt closure alone is not a latency verdict. No CI or independent-machine claim." at=policy:head/release-gates/0.2.0 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/first-minute/yes/|package.json|package-lock.json role=writes scope=reader/first-minute shape=run value=dist/test/first-minute.js
114
- bound-lock/1 about="Project reviewed regional source-client runs in Node 22 and 24, bound to exact current sources and contract. This is not a source-budget, Q4-completeness, installed-acceptance or CI verdict." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet kind=process measure=reader needs=src/|test/|docs/contracts/|samples/authority-preflight/yes/ role=writes scope=reader/authority-preflight shape=run value=dist/test/authority-preflight-reader.js
115
- bound-lock/1 about="Project the two existing consumer walk vectors in Node 22 and 24, bound to fresh sources, producer inputs and the unchanged declared birth/walk/host/instrument contract. Preserve the birth/view/walk demand; do not implement the walk or transfer authority. Independent observer files are excluded from other observer inventories to avoid self-reference." at=policy:head/walk-reading/0.2.0 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/walk-reading/yes/|TARGET.bound role=writes scope=reader/walk-reading shape=run value=dist/test/walk-reading.js
136
+ bound-lock/1 about="Project reviewed local installed-client measurements; project the conservative recorded values in whole milliseconds and an explicit completeness reading. The existing strict client test enforces the six unchanged gates; receipt closure alone is not a latency verdict. No CI or independent-machine claim." at=policy:head/acceptance-successors/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/first-minute/yes/|package.json|package-lock.json|dist/test/ role=writes scope=reader/first-minute shape=run value=dist/test/first-minute.js
137
+ bound-lock/1 about="Project reviewed regional source-client runs in Node 22 and 24, bound to exact current sources and contract. This is not a source-budget, Q4-completeness, installed-acceptance or CI verdict." at=policy:head/acceptance-successors/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|docs/contracts/|samples/authority-preflight/yes/|dist/test/ role=writes scope=reader/authority-preflight shape=run value=dist/test/authority-preflight-reader.js
138
+ bound-lock/1 about="Project the two existing consumer walk vectors in Node 22 and 24, bound to fresh sources, producer inputs and the unchanged declared birth/walk/host/instrument contract. Preserve the birth/view/walk demand; do not implement the walk or transfer authority. Independent observer files are excluded from other observer inventories to avoid self-reference." at=policy:head/acceptance-successors/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/walk-reading/yes/|TARGET.bound|dist/test/ role=writes scope=reader/walk-reading shape=run value=dist/test/walk-reading.js
116
139
  bound-lock/1 about="Propose lines for the person to sign: they are shown to the person with the place and the base they are made against; on a yes to exactly those, the person's key signs them and they are folded as if landed. Nothing lands; the lot is kept by its digest." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/plan value=place|lines
140
+ bound-lock/1 about="Proposed exact protocol-owned response model; its standing, executable blob and source are pinned separately. Admission and publication are not inferred." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=digest role=writes scope=world/topos-mcp/blob value=sha256:1c3c9326e89aabe3a43bf074d0e06b5bbebd1fdb6e06423b957dc03914de051d
141
+ bound-lock/1 about="Proposed exact protocol-owned response model; its standing, executable blob and source are pinned separately. Admission and publication are not inferred." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=digest role=writes scope=world/topos-mcp/standing value=sha256:c472ae2856813c7e8cbc3dbd7e96884aa2e769dd5fa277fcb21d7061a81dda3e
142
+ bound-lock/1 about="Proposed exact protocol-owned response model; its standing, executable blob and source are pinned separately. Admission and publication are not inferred." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=sources/topos-mcp value=https://github.com/Lapxo/topos-mcp/releases/download/v0.1.2/standing.bound
143
+ bound-lock/1 about="Proposed exact protocol-owned response model; its standing, executable blob and source are pinned separately. Admission and publication are not inferred." at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=sources/topos-mcp-blob value=https://github.com/Lapxo/topos-mcp/releases/download/v0.1.2/1c3c9326e89aabe3a43bf074d0e06b5bbebd1fdb6e06423b957dc03914de051d.tar.gz
117
144
  bound-lock/1 about="Prove access to a source ahead of any call, the way its document declares: the person's own page, or its provider with a client registered for the visit; the secret is kept in this keychain and a receipt lands without it. Nothing is called." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/access value=place|source|operation
118
145
  bound-lock/1 about="Prove access to a source the way it declares, ahead of any call: entered on head's page or at its provider, never here." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=prompt/access value=place|source
119
146
  bound-lock/1 about="Prove access to {source} in {place} with the do tool, as its access action. I will enter what it asks on head's own page or at its provider, never here." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=prompt/access/text value=lock
@@ -131,7 +158,8 @@ bound-lock/1 about="Rendered from the admitted prose. Verbatim native output sel
131
158
  bound-lock/1 about="Rendered from the admitted prose. Verbatim native output selected by shape. Verification compares the rendered bytes; a retained seal is not a guarantee of later file presence." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=role role=reads scope=leaf-role/docs/first-minute.md value=derived
132
159
  bound-lock/1 about="Rendered from the admitted prose. Verbatim native output selected by shape. Verification compares the rendered bytes; a retained seal is not a guarantee of later file presence." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=role role=reads scope=leaf-role/docs/lineage.md value=derived
133
160
  bound-lock/1 about="Rendered from the admitted prose. Verbatim native output selected by shape. Verification compares the rendered bytes; a retained seal is not a guarantee of later file presence." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=role role=reads scope=leaf-role/docs/sharing.md value=derived
134
- bound-lock/1 about="Reviewed local capture for the preserved regional archive, before admission changes the public lock. Final release acceptance remains separate." at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/first-minute-capture shape=samples/first-minute/yes/installed.json value=sha256:0d4596f8fac4ee0613596dc8930d66ccb692f9818e76b18b2caae84717a527d2
161
+ bound-lock/1 about="Reviewed local capture for the preserved regional archive, before admission changes the public lock. Final release acceptance remains separate." at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/first-minute-capture shape=samples/first-minute/yes/installed.json value=sha256:c415a3dd92eb6dfe893fd72a607526a359b9acd499c72e9838db86b8d05d8edb
162
+ bound-lock/1 about="Reviewed selection, SDK port and standard packager-format vectors only; not integrated composition, runtime closure, recipient lifecycle, Desktop acceptance or global closure." at=policy:head/composition-preparation/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/|test/|vectors/|docs/contracts/|package.json|package-lock.json|samples/composition/yes/ role=writes scope=reader/composition-vectors shape=run value=dist/test/composition-reading.js
135
163
  bound-lock/1 about="Several sources, joined by |, asked the same operation with the same arguments: what they agree on is marked by who says it, and what they differ on is shown from each." at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=writes scope=tool/ask/sources value=string
136
164
  bound-lock/1 about="Share a place with someone: its sources, as a package they connect by its digest." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=prompt/share value=place|who
137
165
  bound-lock/1 about="Share the place {place} with {who}: pack it with the do tool, as its share action, into a folder I share, show me the package's digest, and tell me to send {who} the folder — or the addresses it is published at — and the digest apart from it, over a private channel." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=prompt/share/text value=lock
@@ -172,7 +200,6 @@ bound-lock/1 about="The folder of the place, absolute; without one, the first ro
172
200
  bound-lock/1 about="The folder of the place, absolute; without one, the person's place." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/claim/place value=string
173
201
  bound-lock/1 about="The folder of the place." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/access/place value=string
174
202
  bound-lock/1 about="The folder of the place." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/connect/place value=string
175
- bound-lock/1 about="The folder the package is written into, absolute, inside the place or a folder the client shares: never the place itself, its connected documents, a folder head or bound keeps, or a folder holding a lock that is no package." at=policy:head/surface/0.1.1 by=target form=alphabet measure=id role=writes scope=tool/share/to value=string
176
203
  bound-lock/1 about="The folder, absolute." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/place/dir value=string
177
204
  bound-lock/1 about="The grant under which {operation} on {source} was read at {at} had to be given again, so what was kept of it stands no longer: it was read again." at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=writes scope=said/kept-withdrawn value=lock
178
205
  bound-lock/1 about="The host passes only an explicitly supplied public receiver policy to Bound; production defaults remain unchanged. Tests use declared HTTPS trust and internal destinations, never NODE_OPTIONS or ambient TLS settings." at=policy:head/host/0.1.7-repin-027 by=target form=alphabet measure=id role=writes scope=bound/host/receiver value=explicit-receiver-policy@1
@@ -198,6 +225,7 @@ bound-lock/1 about="The operation, by the id the source offers it under." at=pol
198
225
  bound-lock/1 about="The operation, by the id the source offers it under." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/can/operation value=string
199
226
  bound-lock/1 about="The operation, by the id the source offers it under." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/act/operation value=string
200
227
  bound-lock/1 about="The operation, by the id the source offers it under." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/why/operation value=string
228
+ bound-lock/1 about="The package is ready in {document}: {digest}. Selected sources: {sources}. It carries no sender authority." at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-shared value=lock
201
229
  bound-lock/1 about="The package's lock: an absolute file, or an encrypted address." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=prompt/receive/package value=string
202
230
  bound-lock/1 about="The parameters by name, and body for what the operation is sent." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/act/args value=object
203
231
  bound-lock/1 about="The parameters of that operation, by name; optional." at=policy:head/birth/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/connect/args value=object
@@ -205,11 +233,13 @@ bound-lock/1 about="The parameters of the operation, by name." at=policy:head/su
205
233
  bound-lock/1 about="The parameters of the operation, by name." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/args value=object
206
234
  bound-lock/1 about="The person did not finish entering what {source} asks for, or no page could be offered: nothing was called. Asking again, with the person there, pays it." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=said/entry-unfinished value=lock
207
235
  bound-lock/1 about="The person did not say yes: nothing was signed and nothing was called." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-yes value=lock
236
+ bound-lock/1 about="The person must approve or refuse the exact pending request; no invocation follows from this question." at=policy:head/ci-contract-repair/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-mcp-call/next value=none
208
237
  bound-lock/1 about="The place holds nothing read of {source}: no line says where it is or what it offers." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/unread value=lock
209
238
  bound-lock/1 about="The place moved since base {base}: nothing landed. Plan again." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/base-moved value=lock
210
239
  bound-lock/1 about="The public birth record has not arrived: {document}. Nothing was admitted." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-needs value=lock
211
240
  bound-lock/1 about="The public birth record was refused: {why}. Nothing was admitted." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-refused value=lock
212
241
  bound-lock/1 about="The read whose access is proven; without one, the first read the source offers." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/access/operation value=string
242
+ bound-lock/1 about="The recipient must approve or refuse the pending import; a package grants no authority." at=policy:head/ci-contract-repair/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-bundle-receive/next value=none
213
243
  bound-lock/1 about="The resolution that explains, in place of the one a person reads. With a source: its region with each offer's forms and how access is proven. With an operation: its region the same way and, once it was read, why its newest answer stands, who said it and when, its receipt digest and the pins it rests on. With a view: the view as it explains itself. Nothing is called." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/ask/why value=boolean
214
244
  bound-lock/1 about="The resolution: of a view, the one it is read at; of a source, 0, 1 or 8 to read one offer." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/look/at value=integer
215
245
  bound-lock/1 about="The response came back but its receipt did not land: {why}" at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/not-landed value=lock
@@ -229,13 +259,14 @@ bound-lock/1 about="This client cannot ask you: sign these lines yourself in {pl
229
259
  bound-lock/1 about="This device keeps keys for two roles only: head and person." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-role value=lock
230
260
  bound-lock/1 about="This device keeps no keychain head can reach: no key was made." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-keychain value=lock
231
261
  bound-lock/1 about="This device's person key already states {scope} in {place}, or the place states it itself: a second line of it can only be read from all of this key's lines together, which bound does not publish. Nothing was signed; the place's root can sign it." at=policy:head/words/0.1.7-forbidden by=target form=alphabet measure=id role=writes scope=said/attested-again value=lock
262
+ bound-lock/1 about="This installed package names {name} {revision}. Connect its public sources from {document}, pinned by {digest}, into {place}; no authority has been imported." at=policy:head/ci-contract-repair/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-receiver-ready value=lock
232
263
  bound-lock/1 about="This keychain keeps no root of {place}: whoever holds it connects sources and admits devices there. Nothing was asked." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-root value=lock
233
264
  bound-lock/1 about="This place signs no view of cells: nothing is open to ask." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/no-cells value=lock
234
265
  bound-lock/1 about="Through this door nothing is kept as the person's: a statement here is an agent's, and says so with origin agent. Nothing was asked or kept." at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/door-unoriginated value=lock
235
266
  bound-lock/1 about="Total header-byte budget for the chain, preserving Bound default 16384-byte header limit." at=policy:head/receiver/0.1.7 by=target form=interval measure=bytes role=writes scope=bound/receiver/header-bytes value=0..16384
236
267
  bound-lock/1 about="Use the published native identity-and-text projection in the actual caller context; group only views the operation needs. Check every installed member current bytes and the declared instrument pin on every call. Cached parsed views and one descriptor are reused only by the observed digests. Signing remains in its existing one-call host." at=policy:head/first-minute/0.2.0 by=target form=alphabet measure=id role=writes scope=bound/native-read-snapshots value=native-view-batch@1
237
268
  bound-lock/1 about="Validate every completed cached lines/evidence view with the public identity returned by Bound, and bind new result text to that expected identity. A missing or refused identity never validates an older result. Head keeps no filesystem fingerprint or maintenance exclusion as a substitute." at=policy:head/verified-delivery/0.1.6 by=target form=alphabet measure=id role=writes scope=reading/use value=bound-view-identity
238
- bound-lock/1 about="Verify exact current inputs of reviewed regional source client runs in Node 22 and 24. Inspection does not install authority. This reader does not pay source-size limits, installed first-minute acceptance, release acceptance or CI." at=policy:head/share-inspect/0.2.0 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/share-inspect/yes/ role=writes scope=reader/share-inspect shape=run value=dist/test/share-inspect.js
269
+ bound-lock/1 about="Verify exact current inputs of reviewed regional source client runs in Node 22 and 24. Inspection does not install authority. This reader does not pay source-size limits, installed first-minute acceptance, release acceptance or CI." at=policy:head/acceptance-successors/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|samples/share-inspect/yes/|dist/test/ role=writes scope=reader/share-inspect shape=run value=dist/test/share-inspect.js
239
270
  bound-lock/1 about="What do I have in head? List my places and the sources each one holds." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/what-i-have/text value=lock
240
271
  bound-lock/1 about="What do I have: my places and the sources each one holds." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/what-i-have value=
241
272
  bound-lock/1 about="What happened: what head read and did in my place." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/what-happened value=
@@ -321,7 +352,6 @@ bound-lock/1 about="a view is lines of text" at=policy:head/surface by=target fo
321
352
  bound-lock/1 about="a view of cells the place signs" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/no-cells/next value=none
322
353
  bound-lock/1 about="a wider allowance the person signs" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/not-allowed/next value=none
323
354
  bound-lock/1 about="a wider read/response-bytes the root signs" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/too-large/next value=none
324
- bound-lock/1 about="a world head carries and adopts in every place it connects, pinned by its standing and its blob where its release publishes them; what it reads is said by its standing, never here" at=policy:head/worlds/0.2.0 by=target form=alphabet measure=digest role=writes scope=world/topos-mcp/standing value=sha256:bb3fe7c5e79fc72e6dd6548cfdcb33dcfea62344f1d4c629ebdc828c7c865899
325
355
  bound-lock/1 about="a world head carries and adopts in every place it connects, pinned by its standing and its blob where its release publishes them; what it reads is said by its standing, never here" at=policy:head/worlds/0.2.0 by=target form=alphabet measure=digest role=writes scope=world/topos-openapi/standing value=sha256:24e6ad5fd58afce93964cdf1079a353046b09b5a075906b3dad225bfe21cda74
326
356
  bound-lock/1 about="access the document accepts" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/fetch-status/next value=none
327
357
  bound-lock/1 about="access/<source>/<operation>/observed value=anonymous, a receipt head-s key signs: the read whose access its document leaves unstated answered once with nothing attached, so it is read so from then on" at=policy:head/access/0.1.1g by=target form=alphabet measure=id role=writes scope=access/observed value=observed
@@ -345,7 +375,6 @@ bound-lock/1 about="and reading it from an https address, by the mechanism bound
345
375
  bound-lock/1 about="and taking at most this many bytes of it" at=policy:head/link/0.1.5 by=target form=interval measure=bytes role=writes scope=birth/transport/response-bytes value=0..1048576
346
376
  bound-lock/1 about="another name" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/place-taken/next value=none
347
377
  bound-lock/1 about="another name, or the old admission withdrawn" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/key-taken/next value=none
348
- bound-lock/1 about="answering a question takes at most this; slower reads red with its coordinate" at=policy:head/ceilings by=target form=interval measure=seconds role=reads scope=answer/seconds value=0..2
349
378
  bound-lock/1 about="ask reads and never writes but the receipts of what it read; asked twice it answers the same" at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/hints value=readOnly|idempotent
350
379
  bound-lock/1 about="asked again, key answers the same lines; the first ask makes the key" at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/key/hints value=idempotent
351
380
  bound-lock/1 about="asked twice of the same place, share writes the same bytes" at=policy:head/surface/0.1.1 by=target form=alphabet measure=id role=writes scope=tool/share/hints value=idempotent
@@ -416,8 +445,8 @@ bound-lock/1 about="how to report a vulnerability, privately, what is in scope a
416
445
  bound-lock/1 about="how to report a vulnerability, privately, what is in scope and what is not, and that there is no reward" at=policy:head/docs/0.1.7-security-text by=target form=alphabet measure=text role=writes scope=region/security value=lock
417
446
  bound-lock/1 about="its encrypted address" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/insecure-origin/next value=none
418
447
  bound-lock/1 about="look reads and never writes; asked twice of the same place it answers the same" at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/look/hints value=readOnly|idempotent
419
- bound-lock/1 about="name: check\non:\n push:\n branches: [main, 'measure/**']\n pull_request:\npermissions:\n contents: read\nconcurrency:\n group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}\n cancel-in-progress: true\njobs:\n test:\n strategy:\n fail-fast: false\n matrix:\n shard: [1, 2, 3, 4, 5, 6]\n runs-on: ubuntu-latest\n env:\n SHARD_1: test/authority-preflight.test.ts test/portable-birth.test.ts test/doors.test.ts test/share.test.ts test/verbs.test.ts test/reuse.test.ts test/born-closed.test.ts test/reading-identity.test.ts test/numbers.test.ts test/transport.test.ts\n SHARD_2: test/act.test.ts test/channels.test.ts test/consent.test.ts test/gestures.test.ts test/claims.test.ts test/fold-ahead.test.ts test/trust.test.ts\n SHARD_3: test/marks.test.ts test/share-receive.test.ts test/authorizer.test.ts test/link-url.test.ts test/read.test.ts test/shape.test.ts test/release.test.ts test/device.test.ts test/surface.test.ts test/refusal-record.test.ts test/welcome.test.ts test/bound.test.ts test/warm-compact.test.ts test/pack.test.ts test/pending-document.test.ts test/keys.test.ts test/acts.test.ts test/bundle.test.ts test/onboarding.test.ts\n SHARD_4: test/issuer.test.ts test/fetch.test.ts test/connect.test.ts test/first-minute.test.ts test/use.test.ts test/places.test.ts test/warm.test.ts test/session.test.ts test/process.test.ts test/stores.test.ts test/signer.test.ts\n SHARD_5: test/org.test.ts test/ahead-read.test.ts test/access.test.ts test/answered.test.ts test/world.test.ts test/named.test.ts test/first-run.test.ts test/place-neutral.test.ts\n SHARD_6: test/marks-lineage.test.ts test/share-refused.test.ts test/kept-zero-moved.test.ts test/observed.test.ts test/walk.test.ts test/kept-zero.test.ts test/adopt.test.ts test/asking.test.ts\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - name: Require every test file in exactly one shard\n run: diff <(printf '%s\\n' $SHARD_1 $SHARD_2 $SHARD_3 $SHARD_4 $SHARD_5 $SHARD_6 | sort) <(ls test/*.test.ts | sort)\n - run: npm ci\n - run: npm run build\n - name: Run tests, shard ${{ matrix.shard }} of 6, the files listed for it\n run: |\n set -euo pipefail\n files=\"SHARD_${{ matrix.shard }}\"\n node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=\"$RUNNER_TEMP/head-junit.xml\" ${!files} 2>&1 | tee \"$RUNNER_TEMP/head-tests.log\"\n - name: Preserve test logs\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-node-22-shard-${{ matrix.shard }}\n path: |\n ${{ runner.temp }}/head-tests.log\n ${{ runner.temp }}/head-junit.xml\n if-no-files-found: ignore\n walk:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - run: npm ci\n - run: npm run build\n - name: Check the committed receipts on a clean checkout\n run: npx --no-install bound fold --check\n bundle:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - run: npm ci\n - name: Pack the archive npm would publish\n run: mkdir -p \"$RUNNER_TEMP/release\" && npm pack --pack-destination \"$RUNNER_TEMP/release\"\n - name: Make the Desktop Extension from that archive, twice, repacked with fixed times and order, and require one digest\n run: |\n set -euo pipefail\n test \"$(node -p \"require('./manifest.json').version\")\" = \"$(node -p \"require('./package.json').version\")\"\n archive=\"$(ls \"$RUNNER_TEMP\"/release/*.tgz)\"\n export SOURCE_DATE_EPOCH=\"$(git log -1 --format=%ct)\"\n for n in 1 2; do\n stage=\"$RUNNER_TEMP/stage-$n\"\n mkdir -p \"$stage\"\n tar -xzf \"$archive\" -C \"$stage\" --strip-components 1\n cp package-lock.json manifest.json .mcpbignore \"$stage/\"\n (cd \"$stage\" && npm ci --omit=dev --ignore-scripts --no-audit --no-fund --loglevel=error)\n npx --no-install mcpb pack \"$stage\" \"$RUNNER_TEMP/packed-$n.mcpb\"\n unpacked=\"$RUNNER_TEMP/unpacked-$n\"\n mkdir -p \"$unpacked\"\n unzip -q \"$RUNNER_TEMP/packed-$n.mcpb\" -d \"$unpacked\"\n chmod -R u=rwX,go=rX \"$unpacked\"\n TZ=UTC find \"$unpacked\" -exec touch -h -t 198001020000 {} +\n (cd \"$unpacked\" && find . -type f | LC_ALL=C sort | TZ=UTC zip -X -9 -q -@ \"$RUNNER_TEMP/head-$n.mcpb\")\n done\n one=\"$(shasum -a 256 \"$RUNNER_TEMP/head-1.mcpb\" | cut -d' ' -f1)\"\n two=\"$(shasum -a 256 \"$RUNNER_TEMP/head-2.mcpb\" | cut -d' ' -f1)\"\n for n in 1 2; do printf 'CONTENT %s · %s\\n' \"$n\" \"$(cd \"$RUNNER_TEMP/unpacked-$n\" && find . -type f | LC_ALL=C sort | xargs shasum -a 256 | shasum -a 256 | cut -d' ' -f1)\"; done\n printf 'BUNDLE sha256:%s · made again sha256:%s · from %s\\n' \"$one\" \"$two\" \"$(shasum -a 256 \"$archive\" | cut -d' ' -f1)\"\n test \"$one\" = \"$two\"\n - name: Run it as a host would, from the unpacked bundle in a fresh home\n run: HEAD_BUNDLE=\"$RUNNER_TEMP/head-1.mcpb\" node --test test/bundle.test.ts\n - uses: actions/upload-artifact@v4\n if: always()\n with:\n name: head-bundle\n path: |\n ${{ runner.temp }}/release/\n ${{ runner.temp }}/head-1.mcpb\n if-no-files-found: error\n tree:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - name: Keep the tree this run tests, so a tag can rest on it once the pull request is merged\n run: git rev-parse \"HEAD^{tree}\" | tee \"$RUNNER_TEMP/tested-tree\"\n - uses: actions/upload-artifact@v4\n with:\n name: tested-tree\n path: ${{ runner.temp }}/tested-tree\n if-no-files-found: error\n" at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/test shape=.github/workflows/test.yml value=lock
420
- bound-lock/1 about="name: measure\non:\n workflow_dispatch:\n push:\n tags: ['epoch/*']\npermissions:\n contents: read\njobs:\n test:\n strategy:\n fail-fast: false\n matrix:\n node: [22, 24]\n shard: [1, 2, 3, 4, 5, 6]\n runs-on: ubuntu-latest\n env:\n SHARD_1: test/authority-preflight.test.ts test/portable-birth.test.ts test/doors.test.ts test/share.test.ts test/verbs.test.ts test/reuse.test.ts test/born-closed.test.ts test/reading-identity.test.ts test/numbers.test.ts test/transport.test.ts\n SHARD_2: test/act.test.ts test/channels.test.ts test/consent.test.ts test/gestures.test.ts test/claims.test.ts test/fold-ahead.test.ts test/trust.test.ts\n SHARD_3: test/marks.test.ts test/share-receive.test.ts test/authorizer.test.ts test/link-url.test.ts test/read.test.ts test/shape.test.ts test/release.test.ts test/device.test.ts test/surface.test.ts test/refusal-record.test.ts test/welcome.test.ts test/bound.test.ts test/warm-compact.test.ts test/pack.test.ts test/pending-document.test.ts test/keys.test.ts test/acts.test.ts test/bundle.test.ts test/onboarding.test.ts\n SHARD_4: test/issuer.test.ts test/fetch.test.ts test/connect.test.ts test/first-minute.test.ts test/use.test.ts test/places.test.ts test/warm.test.ts test/session.test.ts test/process.test.ts test/stores.test.ts test/signer.test.ts\n SHARD_5: test/org.test.ts test/ahead-read.test.ts test/access.test.ts test/answered.test.ts test/world.test.ts test/named.test.ts test/first-run.test.ts test/place-neutral.test.ts\n SHARD_6: test/marks-lineage.test.ts test/share-refused.test.ts test/kept-zero-moved.test.ts test/observed.test.ts test/walk.test.ts test/kept-zero.test.ts test/adopt.test.ts test/asking.test.ts\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: ${{ matrix.node }}\n - name: Require every test file in exactly one shard\n run: diff <(printf '%s\\n' $SHARD_1 $SHARD_2 $SHARD_3 $SHARD_4 $SHARD_5 $SHARD_6 | sort) <(ls test/*.test.ts | sort)\n - run: npm ci\n - run: npm run build\n - name: Run tests, shard ${{ matrix.shard }} of 6, the files listed for it\n run: |\n set -euo pipefail\n files=\"SHARD_${{ matrix.shard }}\"\n node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=\"$RUNNER_TEMP/head-junit.xml\" ${!files} 2>&1 | tee \"$RUNNER_TEMP/head-tests.log\"\n - name: Preserve test logs\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-node-${{ matrix.node }}-shard-${{ matrix.shard }}\n path: |\n ${{ runner.temp }}/head-tests.log\n ${{ runner.temp }}/head-junit.xml\n if-no-files-found: ignore\n time:\n strategy:\n fail-fast: false\n matrix:\n node: [22, 24]\n runs-on: macos-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: ${{ matrix.node }}\n - run: npm ci\n - run: npm run build\n - name: Run the timed tests alone on this machine, one at a time\n run: |\n set -euo pipefail\n node --test --test-concurrency=1 test/time/*.test.ts 2>&1 | tee \"$RUNNER_TEMP/head-time.log\"\n - name: Measure a new person's first minute against an API on this machine\n run: |\n set -euo pipefail\n HEAD_ONBOARDING=1 HEAD_FIRST_CELL_STRICT=1 node --test test/onboarding.test.ts 2>&1 | tee -a \"$RUNNER_TEMP/head-time.log\"\n - name: Check the committed receipts on a clean checkout\n if: ${{ !cancelled() }}\n run: npx --no-install bound fold --check\n - name: Preserve the timed log\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-time-node-${{ matrix.node }}\n path: ${{ runner.temp }}/head-time.log\n if-no-files-found: ignore\n" at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/measure shape=.github/workflows/measure.yml value=lock
448
+ bound-lock/1 about="name: check\non:\n push:\n branches: [main, 'measure/**']\n pull_request:\npermissions:\n contents: read\nconcurrency:\n group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}\n cancel-in-progress: true\njobs:\n test:\n strategy:\n fail-fast: false\n matrix:\n shard: [1, 2, 3, 4, 5, 6]\n runs-on: ubuntu-latest\n env:\n SHARD_1: test/authority-preflight.test.ts test/portable-birth.test.ts test/doors.test.ts test/share.test.ts test/verbs.test.ts test/reuse.test.ts test/born-closed.test.ts test/reading-identity.test.ts test/numbers.test.ts test/transport.test.ts test/adopt-model.test.ts test/answer-model.test.ts\n SHARD_2: test/act.test.ts test/channels.test.ts test/consent.test.ts test/gestures.test.ts test/claims.test.ts test/fold-ahead.test.ts test/trust.test.ts test/configured-receiver.test.ts test/receiver.test.ts\n SHARD_3: test/marks.test.ts test/share-receive.test.ts test/authorizer.test.ts test/link-url.test.ts test/read.test.ts test/shape.test.ts test/release.test.ts test/device.test.ts test/surface.test.ts test/refusal-record.test.ts test/welcome.test.ts test/bound.test.ts test/warm-compact.test.ts test/pack.test.ts test/pending-document.test.ts test/keys.test.ts test/acts.test.ts test/bundle.test.ts test/onboarding.test.ts\n SHARD_4: test/issuer.test.ts test/fetch.test.ts test/connect.test.ts test/first-minute.test.ts test/use.test.ts test/places.test.ts test/warm.test.ts test/session.test.ts test/process.test.ts test/stores.test.ts test/signer.test.ts\n SHARD_5: test/org.test.ts test/ahead-read.test.ts test/access.test.ts test/answered.test.ts test/world.test.ts test/named.test.ts test/first-run.test.ts test/place-neutral.test.ts test/composition.test.ts test/kind-boundary.test.ts test/protocol-surface.test.ts\n SHARD_6: test/marks-lineage.test.ts test/share-refused.test.ts test/kept-zero-moved.test.ts test/observed.test.ts test/walk.test.ts test/kept-zero.test.ts test/adopt.test.ts test/asking.test.ts test/mcp-transport.test.ts test/runtime-resolution.test.ts test/share-bundle.test.ts test/source-policy.test.ts test/world-standing.test.ts\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - name: Require every test file in exactly one shard\n run: diff <(printf '%s\\n' $SHARD_1 $SHARD_2 $SHARD_3 $SHARD_4 $SHARD_5 $SHARD_6 | sort) <(ls test/*.test.ts | sort)\n - run: npm ci\n - run: npm run build\n - name: Verify pinned compiler test fixtures without claiming producer publication\n run: |\n set -euo pipefail\n (cd test/fixtures/content && shasum -a 256 -c SHA256SUMS)\n worlds=\"$(node -p \"require('path').join(require('os').tmpdir(), 'head-worlds')\")\"\n mkdir -p \"$worlds\"\n while read -r digest file; do\n cp \"test/fixtures/content/$file\" \"$worlds/$digest\"\n done < test/fixtures/content/SHA256SUMS\n - name: Run tests, shard ${{ matrix.shard }} of 6, the files listed for it\n run: |\n set -euo pipefail\n files=\"SHARD_${{ matrix.shard }}\"\n node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=\"$RUNNER_TEMP/head-junit.xml\" ${!files} 2>&1 | tee \"$RUNNER_TEMP/head-tests.log\"\n - name: Preserve test logs\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-node-22-shard-${{ matrix.shard }}\n path: |\n ${{ runner.temp }}/head-tests.log\n ${{ runner.temp }}/head-junit.xml\n if-no-files-found: ignore\n walk:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - run: npm ci\n - run: npm run build\n - name: Verify pinned compiler test fixtures without claiming producer publication\n run: |\n set -euo pipefail\n (cd test/fixtures/content && shasum -a 256 -c SHA256SUMS)\n worlds=\"$(node -p \"require('path').join(require('os').tmpdir(), 'head-worlds')\")\"\n mkdir -p \"$worlds\"\n while read -r digest file; do\n cp \"test/fixtures/content/$file\" \"$worlds/$digest\"\n done < test/fixtures/content/SHA256SUMS\n - name: Check the committed receipts on a clean checkout\n run: npx --no-install bound fold --check\n bundle:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: 22\n - run: npm ci\n - name: Verify pinned compiler test fixtures without claiming producer publication\n run: |\n set -euo pipefail\n (cd test/fixtures/content && shasum -a 256 -c SHA256SUMS)\n worlds=\"$(node -p \"require('path').join(require('os').tmpdir(), 'head-worlds')\")\"\n mkdir -p \"$worlds\"\n while read -r digest file; do\n cp \"test/fixtures/content/$file\" \"$worlds/$digest\"\n done < test/fixtures/content/SHA256SUMS\n - name: Pack the archive npm would publish\n run: mkdir -p \"$RUNNER_TEMP/release\" && npm pack --pack-destination \"$RUNNER_TEMP/release\"\n - name: Make the Desktop Extension from that archive, twice, repacked with fixed times and order, and require one digest\n run: |\n set -euo pipefail\n test \"$(node -p \"require('./manifest.json').version\")\" = \"$(node -p \"require('./package.json').version\")\"\n archive=\"$(ls \"$RUNNER_TEMP\"/release/*.tgz)\"\n export SOURCE_DATE_EPOCH=\"$(git log -1 --format=%ct)\"\n for n in 1 2; do\n stage=\"$RUNNER_TEMP/stage-$n\"\n mkdir -p \"$stage\"\n tar -xzf \"$archive\" -C \"$stage\" --strip-components 1\n cp package-lock.json manifest.json .mcpbignore \"$stage/\"\n (cd \"$stage\" && npm ci --omit=dev --ignore-scripts --no-audit --no-fund --loglevel=error)\n npx --no-install mcpb pack \"$stage\" \"$RUNNER_TEMP/packed-$n.mcpb\"\n unpacked=\"$RUNNER_TEMP/unpacked-$n\"\n mkdir -p \"$unpacked\"\n unzip -q \"$RUNNER_TEMP/packed-$n.mcpb\" -d \"$unpacked\"\n chmod -R u=rwX,go=rX \"$unpacked\"\n TZ=UTC find \"$unpacked\" -exec touch -h -t 198001020000 {} +\n (cd \"$unpacked\" && find . -type f | LC_ALL=C sort | TZ=UTC zip -X -9 -q -@ \"$RUNNER_TEMP/head-$n.mcpb\")\n done\n one=\"$(shasum -a 256 \"$RUNNER_TEMP/head-1.mcpb\" | cut -d' ' -f1)\"\n two=\"$(shasum -a 256 \"$RUNNER_TEMP/head-2.mcpb\" | cut -d' ' -f1)\"\n for n in 1 2; do printf 'CONTENT %s · %s\\n' \"$n\" \"$(cd \"$RUNNER_TEMP/unpacked-$n\" && find . -type f | LC_ALL=C sort | xargs shasum -a 256 | shasum -a 256 | cut -d' ' -f1)\"; done\n printf 'BUNDLE sha256:%s · made again sha256:%s · from %s\\n' \"$one\" \"$two\" \"$(shasum -a 256 \"$archive\" | cut -d' ' -f1)\"\n test \"$one\" = \"$two\"\n - name: Run it as a host would, from the unpacked bundle in a fresh home\n run: HEAD_BUNDLE=\"$RUNNER_TEMP/head-1.mcpb\" node --test test/bundle.test.ts\n - uses: actions/upload-artifact@v4\n if: always()\n with:\n name: head-bundle\n path: |\n ${{ runner.temp }}/release/\n ${{ runner.temp }}/head-1.mcpb\n if-no-files-found: error\n tree:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - name: Keep the tree this run tests, so a tag can rest on it once the pull request is merged\n run: git rev-parse \"HEAD^{tree}\" | tee \"$RUNNER_TEMP/tested-tree\"\n - uses: actions/upload-artifact@v4\n with:\n name: tested-tree\n path: ${{ runner.temp }}/tested-tree\n if-no-files-found: error\n" at=policy:head/ci-suites/0.2.1 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/test shape=.github/workflows/test.yml value=lock
449
+ bound-lock/1 about="name: measure\non:\n workflow_dispatch:\n push:\n tags: ['epoch/*']\npermissions:\n contents: read\njobs:\n test:\n strategy:\n fail-fast: false\n matrix:\n node: [22, 24]\n shard: [1, 2, 3, 4, 5, 6]\n runs-on: ubuntu-latest\n env:\n SHARD_1: test/authority-preflight.test.ts test/portable-birth.test.ts test/doors.test.ts test/share.test.ts test/verbs.test.ts test/reuse.test.ts test/born-closed.test.ts test/reading-identity.test.ts test/numbers.test.ts test/transport.test.ts test/adopt-model.test.ts test/answer-model.test.ts\n SHARD_2: test/act.test.ts test/channels.test.ts test/consent.test.ts test/gestures.test.ts test/claims.test.ts test/fold-ahead.test.ts test/trust.test.ts test/configured-receiver.test.ts test/receiver.test.ts\n SHARD_3: test/marks.test.ts test/share-receive.test.ts test/authorizer.test.ts test/link-url.test.ts test/read.test.ts test/shape.test.ts test/release.test.ts test/device.test.ts test/surface.test.ts test/refusal-record.test.ts test/welcome.test.ts test/bound.test.ts test/warm-compact.test.ts test/pack.test.ts test/pending-document.test.ts test/keys.test.ts test/acts.test.ts test/bundle.test.ts test/onboarding.test.ts\n SHARD_4: test/issuer.test.ts test/fetch.test.ts test/connect.test.ts test/first-minute.test.ts test/use.test.ts test/places.test.ts test/warm.test.ts test/session.test.ts test/process.test.ts test/stores.test.ts test/signer.test.ts\n SHARD_5: test/org.test.ts test/ahead-read.test.ts test/access.test.ts test/answered.test.ts test/world.test.ts test/named.test.ts test/first-run.test.ts test/place-neutral.test.ts test/composition.test.ts test/kind-boundary.test.ts test/protocol-surface.test.ts\n SHARD_6: test/marks-lineage.test.ts test/share-refused.test.ts test/kept-zero-moved.test.ts test/observed.test.ts test/walk.test.ts test/kept-zero.test.ts test/adopt.test.ts test/asking.test.ts test/mcp-transport.test.ts test/runtime-resolution.test.ts test/share-bundle.test.ts test/source-policy.test.ts test/world-standing.test.ts\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: ${{ matrix.node }}\n - name: Require every test file in exactly one shard\n run: diff <(printf '%s\\n' $SHARD_1 $SHARD_2 $SHARD_3 $SHARD_4 $SHARD_5 $SHARD_6 | sort) <(ls test/*.test.ts | sort)\n - run: npm ci\n - run: npm run build\n - name: Verify pinned compiler test fixtures without claiming producer publication\n run: |\n set -euo pipefail\n (cd test/fixtures/content && shasum -a 256 -c SHA256SUMS)\n worlds=\"$(node -p \"require('path').join(require('os').tmpdir(), 'head-worlds')\")\"\n mkdir -p \"$worlds\"\n while read -r digest file; do\n cp \"test/fixtures/content/$file\" \"$worlds/$digest\"\n done < test/fixtures/content/SHA256SUMS\n - name: Run tests, shard ${{ matrix.shard }} of 6, the files listed for it\n run: |\n set -euo pipefail\n files=\"SHARD_${{ matrix.shard }}\"\n node --test --test-reporter=spec --test-reporter-destination=stdout --test-reporter=junit --test-reporter-destination=\"$RUNNER_TEMP/head-junit.xml\" ${!files} 2>&1 | tee \"$RUNNER_TEMP/head-tests.log\"\n - name: Preserve test logs\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-node-${{ matrix.node }}-shard-${{ matrix.shard }}\n path: |\n ${{ runner.temp }}/head-tests.log\n ${{ runner.temp }}/head-junit.xml\n if-no-files-found: ignore\n time:\n strategy:\n fail-fast: false\n matrix:\n node: [22, 24]\n runs-on: macos-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n - uses: actions/setup-node@v4\n with:\n node-version: ${{ matrix.node }}\n - run: npm ci\n - run: npm run build\n - name: Verify pinned compiler test fixtures without claiming producer publication\n run: |\n set -euo pipefail\n (cd test/fixtures/content && shasum -a 256 -c SHA256SUMS)\n worlds=\"$(node -p \"require('path').join(require('os').tmpdir(), 'head-worlds')\")\"\n mkdir -p \"$worlds\"\n while read -r digest file; do\n cp \"test/fixtures/content/$file\" \"$worlds/$digest\"\n done < test/fixtures/content/SHA256SUMS\n - name: Run the timed tests alone on this machine, one at a time\n run: |\n set -euo pipefail\n node --test --test-concurrency=1 test/time/*.test.ts 2>&1 | tee \"$RUNNER_TEMP/head-time.log\"\n - name: Measure a new person's first minute against an API on this machine\n run: |\n set -euo pipefail\n HEAD_ONBOARDING=1 HEAD_FIRST_CELL_STRICT=1 node --test test/onboarding.test.ts 2>&1 | tee -a \"$RUNNER_TEMP/head-time.log\"\n - name: Check the committed receipts on a clean checkout\n if: ${{ !cancelled() }}\n run: npx --no-install bound fold --check\n - name: Preserve the timed log\n if: always()\n uses: actions/upload-artifact@v4\n with:\n name: head-time-node-${{ matrix.node }}\n path: ${{ runner.temp }}/head-time.log\n if-no-files-found: ignore\n" at=policy:head/ci-suites/0.2.1 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/measure shape=.github/workflows/measure.yml value=lock
421
450
  bound-lock/1 about="name: release\non:\n workflow_run:\n workflows: [tag]\n types: [completed]\n workflow_dispatch:\nconcurrency: release-delivery\njobs:\n approve:\n if: github.event_name == 'workflow_dispatch' || (github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.head_branch == 'main')\n runs-on: ubuntu-latest\n permissions:\n contents: write\n outputs:\n tag: ${{ steps.judge.outputs.tag }}\n digest: ${{ steps.judge.outputs.digest }}\n archive: ${{ steps.judge.outputs.archive }}\n steps:\n - uses: actions/checkout@v4\n with:\n ref: ${{ github.event.workflow_run.head_sha || github.sha }}\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm install --prefix .instrument --no-save --ignore-scripts @lapxo/bound@0.2.8\n - name: Prepare release\n env:\n GH_TOKEN: ${{ github.token }}\n run: |\n set -euo pipefail\n TAG=\"v$(node -p \"require('./package.json').version\")\"\n printf 'TAG=%s\\n' \"$TAG\" >> \"$GITHUB_ENV\"\n git fetch origin \"refs/tags/$TAG:refs/tags/$TAG\"\n gh api --paginate \"repos/$GITHUB_REPOSITORY/releases\" --jq '.[].tag_name' > \"$RUNNER_TEMP/release-tags\"\n if grep -Fxq \"$TAG\" \"$RUNNER_TEMP/release-tags\"; then\n printf 'RELEASE %s · exists\\n' \"$TAG\"\n else\n gh release create \"$TAG\" --verify-tag --draft --title \"$TAG\" --generate-notes\n printf 'RELEASE %s · draft created · awaiting signed assets\\n' \"$TAG\"\n fi\n - name: Read owner approval\n env:\n GH_TOKEN: ${{ github.token }}\n run: |\n set -euo pipefail\n mkdir .release\n gh release download \"$TAG\" --pattern approval-signed --dir .release\n node .instrument/node_modules/@lapxo/bound/dist/cli/verb.js fold --as release .release/approval-signed > .release/verdict\n cat .release/verdict\n - name: Judge the approved release archive\n id: judge\n env:\n GH_TOKEN: ${{ github.token }}\n run: |\n set -euo pipefail\n read -r status digest archive source extra < .release/verdict\n test \"$status\" = READY\n test -z \"$extra\"\n gh release download \"$TAG\" --pattern \"$archive\" --dir .release\n printf '%s %s\\n' \"${digest#sha256:}\" \".release/$archive\" | sha256sum -c -\n expected=\"$(node -p \"require('./package.json').name+'@'+require('./package.json').version\")\"\n actual=\"$(tar -xOf \".release/$archive\" package/package.json | node -p \"const p=JSON.parse(require('fs').readFileSync(0,'utf8'));p.name+'@'+p.version\")\"\n test \"$actual\" = \"$expected\"\n printf 'SOURCE release/%s/%s · %s · declared %s\\n' \"$TAG\" \"$archive\" \"$digest\" \"$source\"\n printf 'tag=%s\\ndigest=%s\\narchive=%s\\n' \"$TAG\" \"$digest\" \"$archive\" >> \"$GITHUB_OUTPUT\"\n bundle:\n needs: approve\n runs-on: macos-latest\n permissions:\n contents: write\n env:\n GH_TOKEN: ${{ github.token }}\n TAG: ${{ needs.approve.outputs.tag }}\n DIGEST: ${{ needs.approve.outputs.digest }}\n ARCHIVE: ${{ needs.approve.outputs.archive }}\n steps:\n - uses: actions/checkout@v4\n with:\n ref: ${{ github.event.workflow_run.head_sha || github.sha }}\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm ci\n - name: Make the Desktop Extension from the approved archive, twice, repacked with fixed times and order, and require one digest\n run: |\n set -euo pipefail\n mkdir -p \"$RUNNER_TEMP/release\"\n gh release download \"$TAG\" --pattern \"$ARCHIVE\" --dir \"$RUNNER_TEMP/release\"\n printf '%s %s\\n' \"${DIGEST#sha256:}\" \"$RUNNER_TEMP/release/$ARCHIVE\" | shasum -a 256 -c -\n test \"v$(node -p \"require('./manifest.json').version\")\" = \"$TAG\"\n export SOURCE_DATE_EPOCH=\"$(git log -1 --format=%ct)\"\n for n in 1 2; do\n stage=\"$RUNNER_TEMP/stage-$n\"\n mkdir -p \"$stage\"\n tar -xzf \"$RUNNER_TEMP/release/$ARCHIVE\" -C \"$stage\" --strip-components 1\n cp package-lock.json manifest.json .mcpbignore \"$stage/\"\n (cd \"$stage\" && npm ci --omit=dev --ignore-scripts --no-audit --no-fund --loglevel=error)\n npx --no-install mcpb pack \"$stage\" \"$RUNNER_TEMP/packed-$n.mcpb\"\n unpacked=\"$RUNNER_TEMP/unpacked-$n\"\n mkdir -p \"$unpacked\"\n unzip -q \"$RUNNER_TEMP/packed-$n.mcpb\" -d \"$unpacked\"\n chmod -R u=rwX,go=rX \"$unpacked\"\n TZ=UTC find \"$unpacked\" -exec touch -h -t 198001020000 {} +\n (cd \"$unpacked\" && find . -type f | LC_ALL=C sort | TZ=UTC zip -X -9 -q -@ \"$RUNNER_TEMP/head-$n.mcpb\")\n done\n one=\"$(shasum -a 256 \"$RUNNER_TEMP/head-1.mcpb\" | cut -d' ' -f1)\"\n two=\"$(shasum -a 256 \"$RUNNER_TEMP/head-2.mcpb\" | cut -d' ' -f1)\"\n for n in 1 2; do printf 'CONTENT %s · %s\\n' \"$n\" \"$(cd \"$RUNNER_TEMP/unpacked-$n\" && find . -type f | LC_ALL=C sort | xargs shasum -a 256 | shasum -a 256 | cut -d' ' -f1)\"; done\n test \"$one\" = \"$two\"\n bundle=\"head-${TAG#v}-${one:0:16}.mcpb\"\n cp \"$RUNNER_TEMP/head-1.mcpb\" \"$RUNNER_TEMP/$bundle\"\n printf 'BUNDLE=%s\\nMADE=sha256:%s\\n' \"$bundle\" \"$one\" >> \"$GITHUB_ENV\"\n printf 'BUNDLE %s · sha256:%s · made twice · from %s\\n' \"$bundle\" \"$one\" \"$DIGEST\"\n - name: Run it as a host would, from the unpacked bundle in a fresh home\n run: HEAD_BUNDLE=\"$RUNNER_TEMP/$BUNDLE\" node --test test/bundle.test.ts\n - name: Attach it to the release, its digest in the notes\n run: |\n set -euo pipefail\n gh release view \"$TAG\" --json body --jq .body > \"$RUNNER_TEMP/notes.md\"\n if grep -q 'The Desktop Extension `head-' \"$RUNNER_TEMP/notes.md\"; then\n grep -Fq \"$MADE\" \"$RUNNER_TEMP/notes.md\" || { printf 'REFUSE·bundle the release names another digest than %s\\n' \"$MADE\"; exit 1; }\n else\n printf '\\n\\nThe signature covers `%s` (`%s`). The Desktop Extension `%s` (`%s`) is made by this workflow from that archive, packed by mcpb and repacked with fixed times, modes and order; made again, it gives the same digest.\\n' \"$ARCHIVE\" \"$DIGEST\" \"$BUNDLE\" \"$MADE\" >> \"$RUNNER_TEMP/notes.md\"\n gh release edit \"$TAG\" --notes-file \"$RUNNER_TEMP/notes.md\"\n fi\n gh release upload \"$TAG\" \"$RUNNER_TEMP/$BUNDLE\" --clobber\n mkdir -p \"$RUNNER_TEMP/back\"\n gh release download \"$TAG\" --pattern \"$BUNDLE\" --dir \"$RUNNER_TEMP/back\"\n printf '%s %s\\n' \"${MADE#sha256:}\" \"$RUNNER_TEMP/back/$BUNDLE\" | shasum -a 256 -c -\n publish:\n needs: [approve, bundle]\n environment: release\n runs-on: ubuntu-latest\n permissions:\n contents: write\n id-token: write\n env:\n GH_TOKEN: ${{ github.token }}\n TAG: ${{ needs.approve.outputs.tag }}\n DIGEST: ${{ needs.approve.outputs.digest }}\n ARCHIVE: ${{ needs.approve.outputs.archive }}\n steps:\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm install --global npm@'12.1.0' --ignore-scripts\n - name: Stage the approved release archive\n run: |\n set -euo pipefail\n mkdir .release\n gh release download \"$TAG\" --repo \"$GITHUB_REPOSITORY\" --pattern \"$ARCHIVE\" --dir .release\n printf '%s %s\\n' \"${DIGEST#sha256:}\" \".release/$ARCHIVE\" | sha256sum -c -\n gh release edit \"$TAG\" --repo \"$GITHUB_REPOSITORY\" --draft=false\n printf 'RELEASE %s · published · %s\\n' \"$TAG\" \"$DIGEST\"\n npm stage publish \".release/$ARCHIVE\" --access public --ignore-scripts\n printf 'STAGED %s · %s · owner approval pending\\n' \"$ARCHIVE\" \"$DIGEST\"\n" at=policy:head/bound-repin/0.2.8 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/release shape=.github/workflows/release.yml value=lock
422
451
  bound-lock/1 about="name: suite-map\non:\n push:\n branches: ['suite-map/**']\npermissions:\n contents: read\njobs:\n map:\n strategy:\n fail-fast: false\n matrix:\n shard: [1, 2, 3, 4, 5, 6]\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n with:\n persist-credentials: false\n fetch-depth: 0\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm ci\n - name: Run each test file of this shard alone, three at a time, its processes measured, keeping only what of head they ran\n run: |\n set -uo pipefail\n map=\"$RUNNER_TEMP/suite-map\"\n mkdir -p \"$map\"\n measure() {\n out=\"$1/$(basename \"$2\")\"\n mkdir -p \"$out\"\n NODE_V8_COVERAGE=\"$out\" node --test \"$2\" > \"$out.log\" 2>&1 || echo \"FAILED $2\" >> \"$out.log\"\n grep -L -F \"$GITHUB_WORKSPACE/src/\" \"$out\"/*.json 2>/dev/null | xargs rm -f\n }\n export -f measure\n ls test/*.test.ts | awk -v s=\"${{ matrix.shard }}\" 'NR % 6 == s % 6' | xargs -P 3 -I{} bash -c 'measure \"$0\" \"$1\"' \"$map\" {}\n git log --format='%H %s' origin/main..HEAD > \"$map/commits.txt\"\n cat \"$map\"/*.log | grep -E '^(FAILED|ℹ (pass|fail))' || true\n - uses: actions/upload-artifact@v4\n if: always()\n with:\n name: suite-map-${{ matrix.shard }}\n path: ${{ runner.temp }}/suite-map/\n if-no-files-found: error\n" at=policy:head/forge/suite-map/0.1.6 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/suite-map shape=.github/workflows/suite-map.yml value=lock
423
452
  bound-lock/1 about="name: tag\non:\n push:\n branches: [main]\njobs:\n tag:\n runs-on: ubuntu-latest\n permissions:\n contents: write\n actions: read\n pull-requests: read\n steps:\n - uses: actions/checkout@v4\n with:\n fetch-depth: 0\n - name: Tag the version once the pull request that merged it was checked green on this very tree\n env:\n GH_TOKEN: ${{ github.token }}\n run: |\n set -euo pipefail\n version=\"v$(node -p \"require('./package.json').version\")\"\n git tag --list \"$version\" | grep -q . && { printf 'TAG %s · exists\\n' \"$version\"; exit 0; }\n tree=\"$(git rev-parse \"HEAD^{tree}\")\"\n pr=\"$(gh api \"repos/$GITHUB_REPOSITORY/commits/$GITHUB_SHA/pulls\" --jq '.[0].number // empty')\"\n test -n \"$pr\" || { printf 'REFUSE %s · no pull request merged %s\\n' \"$version\" \"$GITHUB_SHA\"; exit 1; }\n head=\"$(gh api \"repos/$GITHUB_REPOSITORY/pulls/$pr\" --jq .head.sha)\"\n run=\"$(gh api \"repos/$GITHUB_REPOSITORY/actions/workflows/test.yml/runs?event=pull_request&head_sha=$head&status=success\" --jq '.workflow_runs[0].id // empty')\"\n test -n \"$run\" || { printf 'REFUSE %s · pull request #%s has no green test run at %s\\n' \"$version\" \"$pr\" \"$head\"; exit 1; }\n gh run download \"$run\" -R \"$GITHUB_REPOSITORY\" --name tested-tree --dir \"$RUNNER_TEMP/tested\"\n tested=\"$(cat \"$RUNNER_TEMP/tested/tested-tree\")\"\n test \"$tested\" = \"$tree\" || { printf 'REFUSE %s · run %s of pull request #%s tested tree %s; main holds %s\\n' \"$version\" \"$run\" \"$pr\" \"$tested\" \"$tree\"; exit 1; }\n printf 'TAG %s · tree %s · tested by run %s of pull request #%s\\n' \"$version\" \"$tree\" \"$run\" \"$pr\"\n git tag \"$version\" && git push origin \"$version\"\n" at=policy:head/forge/tag/0.1.6 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/tag shape=.github/workflows/tag.yml value=lock
@@ -528,7 +557,6 @@ bound-lock/1 about="the ledger a place-s history is said to come from, named by
528
557
  bound-lock/1 about="the line a place declares its act result by; head lands nothing where land would print none" at=policy:head/bound by=target form=alphabet measure=id role=writes scope=bound/profile value=wire/act-result
529
558
  bound-lock/1 about="the line that follows" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/no-world/next value=none
530
559
  bound-lock/1 about="the lines a place admits a content transport by, the first the one a link is inspected only where it stands" at=policy:head/link/0.1.5 by=target form=alphabet measure=id role=writes scope=link/transport value=wire/transport|transport/https|transport/timeout|transport/response-bytes
531
- bound-lock/1 about="the lines of all of head's source, together, read by head's suite; widened by the ports region removing what each bound run read once it ends, 4, as the owner ruled; widened by the signing key leaving head-s long process and its refusal written by every door, 7, as the owner ruled; B measured capacity: 2779 lines; witness sha256:30dbaabd472e14a868bbf3a5abe0ff1919232e33668de67fac07d57b572da3a0; C measured capacity: 2826 lines; witness sha256:5b13f1d6e99c3898a11a849d89608f6b92ec968e32b307ed8ae9e4a5242e1622" at=witness:head/configuration-preflight/source-lines by=target form=interval measure=source-lines role=writes scope=source/lines value=0..2826
532
560
  bound-lock/1 about="the lines of each file of the onboard region, read by head-s suite: split from the sources that connect, never raised; a region ceiling landed after founding has no reading of bound-s, so bound holds it as data" at=policy:head/ceilings/0.1.2 by=target form=interval measure=file-lines role=writes scope=onboard/lines value=0..40
533
561
  bound-lock/1 about="the lines of each file of the ports region, alone" at=policy:head/ceilings by=target form=interval measure=file-lines role=reads scope=ports/lines value=0..120
534
562
  bound-lock/1 about="the lines of the access region, together" at=policy:head/ceilings by=target form=interval measure=access-lines role=reads scope=access/lines value=0..100
@@ -537,8 +565,6 @@ bound-lock/1 about="the lines of the ahead region, together, read by head-s suit
537
565
  bound-lock/1 about="the lines of the answers region, together, read by head-s suite; paid from the ceiling of the whole source" at=policy:head/ceilings/0.1.6 by=target form=interval measure=answers-lines role=writes scope=answers/lines value=0..29
538
566
  bound-lock/1 about="the lines of the claims region, together, read by head's suite; widened by an agent as an origin and the view of what was stated" at=witness:an-agent-as-an-origin by=target form=interval measure=claims-lines role=writes scope=claims/lines value=0..48
539
567
  bound-lock/1 about="the lines of the compile region, together" at=policy:head/ceilings by=target form=interval measure=compile-lines role=reads scope=compile/lines value=0..80
540
- bound-lock/1 about="the lines of the core region, together" at=policy:head/ceilings by=target form=interval measure=core-lines role=reads scope=core/lines value=0..800
541
- bound-lock/1 about="the lines of the doors region, together, read by head's suite; widened by each door reading its ceiling of refusals from its own line; widened by head writing what it refuses, so MCP writes it as lines and http do, 6, as the owner ruled; C measured capacity: 205 lines; witness sha256:8fbd5a22177e9c61fb62fd7af605548d02b2cc425f7326b3c826cd23f333f658" at=witness:head/configuration-preflight/doors-lines by=target form=interval measure=doors-lines role=writes scope=doors/lines value=0..205
542
568
  bound-lock/1 about="the lines of the kept region, together, read by head-s suite; paid from the ceiling of the whole source" at=policy:head/ceilings/0.1.5 by=target form=interval measure=kept-lines role=writes scope=kept/lines value=0..40
543
569
  bound-lock/1 about="the lines of the links region, together, read by head-s suite; paid from the ceiling of the whole source; B measured capacity: 102 lines; witness sha256:2198bc9abd86e5f63c2fcf77409755d806eb8c579d4e05cac4baebe186a45806" at=witness:head/share-inspect/links-lines by=target form=interval measure=links-lines role=writes scope=links/lines value=0..102
544
570
  bound-lock/1 about="the lines of the marks region, together, read by head-s suite; paid from the ceiling of the whole source" at=policy:head/ceilings/0.1.5 by=target form=interval measure=marks-lines role=writes scope=marks/lines value=0..60
@@ -565,7 +591,6 @@ bound-lock/1 about="the measure a source-s region names its document by, by dige
565
591
  bound-lock/1 about="the measure that names what kinds of input an access flow asks" at=policy:head/vocabulary/0.1.1 by=target form=alphabet measure=id role=writes scope=vocab/asks value=asks
566
592
  bound-lock/1 about="the most bytes head reads of a document it connects from an address" at=policy:head/transport/0.1.1 by=target form=interval measure=bytes role=writes scope=adapter/request/document-bytes value=0..16777216
567
593
  bound-lock/1 about="the most bytes head reads of what bound prints, a process's output or a fold host's answer, and the most a fold host may hold queued; past it the process is stopped or the host closed, and what was printed is no reading" at=policy:head/host/0.1.7 by=target form=interval measure=bytes role=writes scope=bound/printed value=0..16777216
568
- bound-lock/1 about="the most head reads of a world-s standing to learn its readers" at=policy:head/ceilings by=target form=interval measure=bytes role=reads scope=world/standing-bytes value=0..1048576
569
594
  bound-lock/1 about="the next hour, or a wider read/rate the root signs" at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/rate/next value=none
570
595
  bound-lock/1 about="the next window, or a wider read/calls the root signs" at=policy:head/calls/0.1.7 by=target form=alphabet measure=id role=writes scope=said/calls-owed/next value=none
571
596
  bound-lock/1 about="the numbers a cell shows that are exact by construction — epochs, counts and caps, pins, digests, the times lines carry: no model, kind structural" at=policy:head/numbers/0.1.6 by=target form=alphabet measure=id role=writes scope=numbers/structural value=ceiling|offers|reads|count|allowed|done|epoch|pinned|digest|card|pin|at|until|more
@@ -708,14 +733,13 @@ bound-lock/1 about="where an origin publishes the catalog of its documents (RFC
708
733
  bound-lock/1 about="where the bound package head pins is fetched from, verified by its digest" at=policy:head/bound-repin/0.2.8 by=target form=alphabet measure=id role=writes scope=sources/bound value=https://registry.npmjs.org/@lapxo/bound/-/bound-0.2.8.tgz
709
734
  bound-lock/1 about="where the sdk package head pins is fetched from, verified by its digest" at=policy:head/pins by=target form=alphabet measure=id role=writes scope=sources/sdk value=https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.32.1.tgz
710
735
  bound-lock/1 about="where the topos package head pins is fetched from, verified by its digest" at=policy:head/pins/topos/0.2.4 by=target form=alphabet measure=id role=writes scope=sources/topos value=https://registry.npmjs.org/@lapxo/topos/-/topos-0.2.4.tgz
711
- bound-lock/1 about="where topos-mcp 0.1.0 publishes its standing: bound fetches it there for every place that pins it, and head reads its readers from it, both by its digest" at=policy:head/worlds/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/topos-mcp value=https://github.com/Lapxo/topos-mcp/releases/download/v0.1.1/standing.bound
712
736
  bound-lock/1 about="where topos-openapi 0.1.0 publishes its standing: bound fetches it there for every place that pins it, and head reads its readers from it, both by its digest" at=policy:head/worlds/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/topos-openapi value=https://github.com/Lapxo/topos-openapi/releases/download/v0.1.1/standing.bound
713
737
  bound-lock/1 about="who is in a place: founding it with its root, admitting another device" at=policy:project by=target form=alphabet measure=coordinates role=reads scope=region/places value=src/places/**
714
738
  bound-lock/1 about="whoever holds the place's root" at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/no-root/next value=none
715
739
  bound-lock/1 about="{\n \"example\": \"declared-lineage-retirement@1\",\n \"response\": {\n \"temperature\": 21,\n \"sky\": \"clear\"\n },\n \"sources\": [\n \"forecast\",\n \"mirror\"\n ],\n \"declare\": \"bound-lock/1 at=policy:person/lineage by=target form=alphabet measure=id role=writes scope=shares/mirror value=forecast\",\n \"withdraw\": \"bound-lock/1 at=policy:person/lineage by=target form=alphabet measure=id role=writes scope=shares/mirror value=withdraw\",\n \"before\": {\n \"code\": \"head/agreed-lineage\",\n \"marks\": \"●○\"\n },\n \"after\": {\n \"code\": \"head/agreed-unknown\",\n \"marks\": \"●●\"\n },\n \"interpretation\": \"No declaration after withdrawal is unknown lineage, never proof of independence; old per-source receipts remain.\"\n}\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/example-lineage shape=docs/examples/lineage.json value=lock
716
740
  bound-lock/1 about="{\n \"example\": \"public-birth-inspection@1\",\n \"sender\": {\n \"scope\": \"lang\",\n \"value\": \"en\"\n },\n \"receiver\": {\n \"scope\": \"lang\",\n \"value\": \"fr\"\n },\n \"expectedCode\": \"head/birth-inspected\",\n \"expectedCollision\": \"lang\",\n \"negativeCode\": \"head/document-digest\",\n \"authorityTransferred\": false\n}\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/example-sharing shape=docs/examples/sharing.json value=lock
717
741
  bound-lock/1 about="{\n \"example\": \"typed-local-api@1\",\n \"fixture\": \"Two-field OpenAPI forecast, not real weather\",\n \"source\": \"forecast\",\n \"operation\": \"get-forecast\",\n \"args\": {\n \"city\": \"lima\"\n },\n \"response\": {\n \"temperature\": 21,\n \"sky\": \"clear\"\n },\n \"expectedTypedValues\": {\n \"temperature\": \"21\",\n \"sky\": \"clear\"\n },\n \"secrets\": \"Simulated keychain and temporary home; no real credential\"\n}\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/example-first-minute shape=docs/examples/first-minute.json value=lock
718
- bound-lock/1 about="{\n \"manifest_version\": \"0.3\",\n \"name\": \"head\",\n \"display_name\": \"head\",\n \"version\": \"0.2.0\",\n \"description\": \"An MCP server that answers by its lines: it runs bound as a process, hands a model what bound printed, and lands what it read as receipts.\",\n \"author\": {\n \"name\": \"Lapxo\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Lapxo/head\"\n },\n \"homepage\": \"https://github.com/Lapxo/head\",\n \"server\": {\n \"type\": \"node\",\n \"entry_point\": \"dist/src/index.js\",\n \"mcp_config\": {\n \"command\": \"node\",\n \"args\": [\n \"${__dirname}/dist/src/index.js\",\n \"run\"\n ],\n \"env\": {}\n }\n },\n \"tools\": [\n {\n \"name\": \"ask\",\n \"description\": \"Ask head, and nothing changes but the receipts of what was read. With nothing: what this device has connected. A source: its region, what it offers; with an operation and its parameters, one read of an offer of class read, answered with the receipt the device key landed for it, or, while the place allows reuse, the answer kept for it and nothing called. A view: as bound folds it. card: what is open, and the card do needs. lines: a lot for the person to sign. Nothing that is not a read is ever called. An answer about one place ends with its card, valid from it.\"\n },\n {\n \"name\": \"connect\",\n \"description\": \"Connect a source to a place, once the person says yes: its document, and an overlay beside it, laid whatever its kind and compiled once by whichever world reads it — or open, with the line that pays it — into what the source offers and how access is proven, pinned by digest. Nothing is called. A document at an address may be read as a source the place connected, with the access it holds, and checked against its digest. A package another place shared is connected whole: its lock as the document, named by its digest. A site alone or a folder is looked for its document first, before anything is founded. With no place yet, the first connect founds the person's place on one yes that also lets head read the source.\"\n },\n {\n \"name\": \"do\",\n \"description\": \"Do one action in a place, on the card ask answered for it: found a place, admit a device, land a lot ask planned, share a place, make this device's key, prove access to a source, call an offer that is not a read, or keep what the person states as theirs. An action on a place that moved since its card was asked is refused, with nothing done; one the place does not allow is said not to be in the card. The answer ends with the card valid from this act.\"\n }\n ],\n \"tools_generated\": false,\n \"keywords\": [\n \"bound\",\n \"openapi\",\n \"mcp\"\n ],\n \"compatibility\": {\n \"platforms\": [\n \"darwin\"\n ],\n \"runtimes\": {\n \"node\": \">=22.18\"\n }\n }\n}\n" at=policy:head/release/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/bundle/manifest shape=manifest.json value=lock
742
+ bound-lock/1 about="{\n \"manifest_version\": \"0.3\",\n \"name\": \"head\",\n \"display_name\": \"head\",\n \"version\": \"0.2.1\",\n \"description\": \"An MCP server that answers by its lines: it runs bound as a process, hands a model what bound printed, and lands what it read as receipts.\",\n \"author\": {\n \"name\": \"Lapxo\"\n },\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/Lapxo/head\"\n },\n \"homepage\": \"https://github.com/Lapxo/head\",\n \"server\": {\n \"type\": \"node\",\n \"entry_point\": \"dist/src/index.js\",\n \"mcp_config\": {\n \"command\": \"node\",\n \"args\": [\n \"${__dirname}/dist/src/index.js\",\n \"run\"\n ],\n \"env\": {}\n }\n },\n \"tools\": [\n {\n \"name\": \"ask\",\n \"description\": \"Ask head, and nothing changes but the receipts of what was read. With nothing: what this device has connected. A source: its region, what it offers; with an operation and its parameters, one read of an offer of class read, answered with the receipt the device key landed for it, or, while the place allows reuse, the answer kept for it and nothing called. A view: as bound folds it. card: what is open, and the card do needs. lines: a lot for the person to sign. Nothing that is not a read is ever called. An answer about one place ends with its card, valid from it.\"\n },\n {\n \"name\": \"connect\",\n \"description\": \"Connect a source to a place, once the person says yes: its document, and an overlay beside it, laid whatever its kind and compiled once by whichever world reads it — or open, with the line that pays it — into what the source offers and how access is proven, pinned by digest. Nothing is called. A document at an address may be read as a source the place connected, with the access it holds, and checked against its digest. A package another place shared is connected whole: its lock as the document, named by its digest. A site alone or a folder is looked for its document first, before anything is founded. With no place yet, the first connect founds the person's place on one yes that also lets head read the source.\"\n },\n {\n \"name\": \"do\",\n \"description\": \"Do one action in a place, on the card ask answered for it: found a place, admit a device, land a lot ask planned, share a place, make this device's key, prove access to a source, call an offer that is not a read, or keep what the person states as theirs. An action on a place that moved since its card was asked is refused, with nothing done; one the place does not allow is said not to be in the card. The answer ends with the card valid from this act.\"\n }\n ],\n \"tools_generated\": false,\n \"keywords\": [\n \"bound\",\n \"openapi\",\n \"mcp\"\n ],\n \"compatibility\": {\n \"platforms\": [\n \"darwin\"\n ],\n \"runtimes\": {\n \"node\": \">=22.18\"\n }\n }\n}\n" at=policy:head/release/0.2.1 by=target form=alphabet measure=text role=writes scope=prose/en/bundle/manifest shape=manifest.json value=lock
719
743
  bound-lock/1 about="{action} is not in the card of {place}: {why}. Nothing was done." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=said/not-in-card value=lock
720
744
  bound-lock/1 about="{count} lines landed." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/landed value=lock
721
745
  bound-lock/1 about="{dir} is a place already: nothing was made." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/place-exists value=lock
@@ -846,6 +870,12 @@ bound-lock/1 at=policy:head/access/0.1.4 by=target form=alphabet measure=id role
846
870
  bound-lock/1 at=policy:head/access/0.1.4 by=target form=alphabet measure=id role=writes scope=said/access-refused/next/args value=action:access|source:$source|place:$place
847
871
  bound-lock/1 at=policy:head/access/0.1.4 by=target form=alphabet measure=id role=writes scope=said/access-refused/state value=refused
848
872
  bound-lock/1 at=policy:head/acts by=target form=alphabet measure=id role=writes scope=act/done value=done
873
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/test/|TARGET.bound role=writes scope=reader/source-lines shape=run value=dist/test/source-lines.js
874
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|dist/test/|samples/foundation/yes/|TARGET.bound role=writes scope=reader/foundation shape=run value=dist/test/foundation-reading.js
875
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/foundation value=samples/foundation/**
876
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=interval measure=defects needs=samples/foundation/yes/ role=demands scope=foundation/B1 value=0..0
877
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=interval measure=defects needs=samples/foundation/yes/ role=demands scope=foundation/B2 value=0..0
878
+ bound-lock/1 at=policy:head/api-mcp-foundation/0.2.1 by=target form=interval measure=defects needs=samples/foundation/yes/ role=demands scope=foundation/B3 value=0..0
849
879
  bound-lock/1 at=policy:head/authority by=owner epoch=1 form=alphabet measure=public-key role=writes scope=keys/owner sig="ed25519:era1:HIVD8P4NcWjPd0Fec8d1Ff52oPI+PMa6U+w8WHKAbj8sJtUWvG5Epmt/44DGRkGB455ByTtcMTK2jMGPN3EPBQ==" value="MCowBQYDK2VwAyEAIYI0be8OWhf3HcVceKpibjgZ+hbYJKYO5ayX8Kk16LE="
850
880
  bound-lock/1 at=policy:head/authority by=target form=alphabet measure=class role=writes scope=keys/owner value=authorize
851
881
  bound-lock/1 at=policy:head/authority by=target form=alphabet measure=coverage role=writes scope=keys/owner value=*
@@ -903,6 +933,17 @@ bound-lock/1 at=policy:head/bound by=target form=alphabet measure=id role=writes
903
933
  bound-lock/1 at=policy:head/bound by=target form=alphabet measure=id role=writes scope=bound/view value=--as
904
934
  bound-lock/1 at=policy:head/calls/0.1.7 by=target form=alphabet measure=id role=writes scope=said/calls-owed/state value=open
905
935
  bound-lock/1 at=policy:head/calls/0.1.7 by=target form=alphabet measure=id role=writes scope=said/calls-unwindowed/state value=refused
936
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet kind=js measure=reader needs=runtime.bundle.json|package.json|package-lock.json|TARGET.bound role=writes scope=reader/share-runtime-metadata shape=runtime.bundle.json|package.json|package-lock.json|TARGET.bound value=dist/test/share-runtime.js
937
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/authority-preflight-capture shape=samples/authority-preflight/yes/client.json value=sha256:1ff9d628ca14e1db144da9659565c0e9c9bdad6aef5093557fc2f6b9361464ad
938
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/foundation-capture shape=samples/foundation/yes/client.json value=sha256:9e92b75e05f0193b64394acc0f271097ea8e2638ed49858bfcb552f5eb5f506f
939
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/share-inspect-capture shape=samples/share-inspect/yes/client.json value=sha256:ab37d9ab5a7a2572f455e59a2d4ac884b65b5c6e949a7aff6e1dbf267b347fa9
940
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/walk-reading-capture shape=samples/walk-reading/yes/client.json value=sha256:c6cca891c755ebdc06279e37bb9cb924a281cfff9ef181595f89a8af6cc3d1a3
941
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-authority-preflight shape=dist/test/authority-preflight-reader.js value=sha256:bcc2825b0d8e9f0a325ec2ec7a90809b9621b95f54dcaac57bc19c81338afb28
942
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-foundation shape=dist/test/foundation-reading.js value=sha256:11d42f19030b5235cd69f6b27f571c55b30379a92cf48947f3018a6ef490164e
943
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-share-inspect shape=dist/test/share-inspect.js value=sha256:dbae11f97f8487c045a7b12e3c4c0b7f2ec4f2dfbb7cbc3bf08da1f637e98410
944
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-share-runtime shape=dist/test/share-runtime.js value=sha256:2234d5609ebc6a44f0b6af54775f5a7f63e4c28dd8d371de9c8f080ec20e1d77
945
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-walk-reading shape=dist/test/walk-reading.js value=sha256:16a8a0ace5fe3165768233aa8dd32d296f00a0e5c4d8d0309383d987c3141d35
946
+ bound-lock/1 at=policy:head/catalogue-share-successor/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/share-runtime-capture shape=samples/share-runtime/yes/client.json value=sha256:a1ead8412105b6da05acbb86163b213d8235c0109ce0543df4bc089a2e8de380
906
947
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/host value=0..0
907
948
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/key value=0..0
908
949
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/org value=0..0
@@ -927,6 +968,12 @@ bound-lock/1 at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=i
927
968
  bound-lock/1 at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/claim-backed/state value=done
928
969
  bound-lock/1 at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/claims-none/state value=done
929
970
  bound-lock/1 at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/door-unoriginated/state value=refused
971
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/composition-vectors value=samples/composition/**
972
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/composition-contract shape=docs/contracts/composition.json value=sha256:73ceb593ee1e891449dde2a62e8bbf03a5e2dd8d9afe80960b320ddca5d90f8f
973
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/composition-vectors shape=vectors/composition.json value=sha256:76465e408b34018eba9dabe3ea25db680410f8dfa57d69a5b447a60e18923939
974
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=interval measure=defects needs=samples/composition/yes/ role=demands scope=composition/mcp-port-vector value=0..0
975
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=interval measure=defects needs=samples/composition/yes/ role=demands scope=composition/mcpb-format-vector value=0..0
976
+ bound-lock/1 at=policy:head/composition-preparation/0.2.1 by=target form=interval measure=defects needs=samples/composition/yes/ role=demands scope=composition/selection-vector value=0..0
930
977
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/authority-preflight value=samples/authority-preflight/**
931
978
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/authority-preflight-fixtures value=test/**|docs/contracts/**
932
979
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=bound/authority/clock value=unix
@@ -938,6 +985,8 @@ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabe
938
985
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-refused/next value=none
939
986
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-refused/state value=refused
940
987
  bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=interval measure=defects needs=samples/authority-preflight/yes/ role=demands scope=authority-preflight/configuration value=0..0
988
+ bound-lock/1 at=policy:head/configured-policy-input/0.2.1 by=target form=alphabet kind=js measure=reader needs=TARGET.bound role=writes scope=reader/configured-ports-policy shape=*.bound value=dist/test/configured-ports.js
989
+ bound-lock/1 at=policy:head/configured-policy-input/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/src/|test/|dist/test/|docs/contracts/|vectors/|samples/configured-ports/yes/|TARGET.bound role=writes scope=reader/configured-ports shape=run value=dist/test/configured-ports.js
941
990
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/digest-algorithms value=sha256
942
991
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/era value=era1
943
992
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/signature-algorithms value=ed25519:era1
@@ -966,6 +1015,9 @@ bound-lock/1 at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=w
966
1015
  bound-lock/1 at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=writes scope=said/kept-expired/state value=done
967
1016
  bound-lock/1 at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=writes scope=said/kept-withdrawn/state value=done
968
1017
  bound-lock/1 at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=writes scope=said/kept/state value=done
1018
+ bound-lock/1 at=policy:head/kind-boundary/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/protocol-surface-contract shape=docs/contracts/protocol-surface.json value=sha256:4780879d1ad578dc093a46bb20dbab580f909e3e84e2b8de2e87f3f884e0c206
1019
+ bound-lock/1 at=policy:head/kind-boundary/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-protocol-surface shape=dist/test/protocol-surface.js value=sha256:d15fbd9a058a4d33bb5dc00b557af3af5c69c7eff567b6e6f8d75494fc00e1aa
1020
+ bound-lock/1 at=policy:head/kind-boundary/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-protocol-surface-reading shape=dist/test/protocol-surface-reading.js value=sha256:9eda478073df605cdbcdf9414609e91a3d9631185b6376a80f26dde3f5bbb793
969
1021
  bound-lock/1 at=policy:head/link/0.1.5 by=target form=alphabet measure=id role=writes scope=said/inspected/state value=done
970
1022
  bound-lock/1 at=policy:head/link/0.1.5 by=target form=alphabet measure=id role=writes scope=said/link-owed/state value=open
971
1023
  bound-lock/1 at=policy:head/link/0.1.5 by=target form=alphabet measure=id role=writes scope=said/link-refused/state value=refused
@@ -979,19 +1031,68 @@ bound-lock/1 at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=
979
1031
  bound-lock/1 at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=writes scope=said/agreed-undeclared/state value=done
980
1032
  bound-lock/1 at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=writes scope=said/agreed-unknown/state value=done
981
1033
  bound-lock/1 at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=writes scope=said/forked/state value=done
1034
+ bound-lock/1 at=policy:head/mcp-physical-counter/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-source-lines shape=dist/test/source-lines.js value=sha256:2f8006981ee9f9c40b342feb1b6214be10bb5b40a8beab959d8fe481237f7e43
1035
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet kind=js measure=reader needs=TARGET.bound role=writes scope=reader/mcp-receiver-policy shape=*.bound value=dist/test/mcp-receiver-reading.js
1036
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet kind=js measure=reader needs=runtime.bundle.json|package.json|package-lock.json|vectors/mcp-receiver-flow.json|docs/contracts/|samples/mcp-receiver/yes/ role=writes scope=reader/mcp-receiver-json shape=*.json value=dist/test/mcp-receiver-reading.js
1037
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet kind=js measure=reader needs=test/mcp-fixture.ts|test/mcp-transport.test.ts|test/mcp-flow-native.ts|test/answer-model.test.ts|test/adopt-model.test.ts role=writes scope=reader/mcp-receiver-tests shape=*.ts value=dist/test/mcp-receiver-reading.js
1038
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/src/|docs/contracts/|vectors/mcp-receiver-flow.json|test/mcp-fixture.ts|test/mcp-transport.test.ts|test/mcp-flow-native.ts|test/answer-model.test.ts|test/adopt-model.test.ts|dist/test/mcp-receiver-reading.js|samples/mcp-receiver/yes/|runtime.bundle.json|package.json|package-lock.json|TARGET.bound role=writes scope=reader/mcp-receiver shape=run value=dist/test/mcp-receiver-reading.js
1039
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/mcp-receiver value=samples/mcp-receiver/**
1040
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/composition-mcpb-contract shape=docs/contracts/composition-mcpb.json value=sha256:90fd486f82c50e4500e09d8673bb0b38e408131a32fb24d2968263b775b5719e
1041
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/mcp-receiver-vectors shape=vectors/mcp-receiver-flow.json value=sha256:335b2f28f4537cd1bf3dcf267d773eff7bf9e5366dc640889175da11f0a56565
1042
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/configured-ports-contract shape=docs/contracts/configured-receiver.json value=sha256:a18f55e36739ec65c9a3677756ea70b954e6c04c9515d06cce8f4d4641070921
1043
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/receiver-contract shape=docs/contracts/bundle-receiver.json value=sha256:4782fb3d7d11f5041589fc077f0cb51510ae8ead1a6be731e1efdef44a06a5db
1044
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/share-runtime-assembly-contract shape=docs/contracts/share-bundle.json value=sha256:ea46eed91ee5b954d7742b1652f66ed6e027bebea791558ad8100938c48745a5
1045
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-mcp-needed/next value=connect
1046
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-mcp-needed/next/args value=document:$document|source:$source|protocol:mcp
1047
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-mcp-needed/state value=open
1048
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-mcp-call/state value=asked
1049
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=alphabet measure=id role=writes scope=said/mcp-refused/state value=refused
1050
+ bound-lock/1 at=policy:head/mcp-receiver/0.2.1 by=target form=interval measure=defects needs=samples/mcp-receiver/yes/ role=demands scope=composition/mcp-receiver-transport value=0..0
982
1051
  bound-lock/1 at=policy:head/numbers/0.1.5 by=target form=alphabet measure=id role=writes scope=said/unmeasured/state value=open
1052
+ bound-lock/1 at=policy:head/post-kind-acceptances/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/configured-ports-capture shape=samples/configured-ports/yes/client.json value=sha256:097426cc2a0a3b6923baf1e0461687bdb094880e2906afd8c73285359b85de85
1053
+ bound-lock/1 at=policy:head/post-kind-acceptances/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-configured-ports shape=dist/test/configured-ports.js value=sha256:0485b1fd07b8446b3cfa127f5f630eda3f8405e24c086c61d59dd152f1128694
1054
+ bound-lock/1 at=policy:head/protocol-parser-inputs/0.2.1 by=target form=alphabet kind=js measure=reader needs=TARGET.bound|node_modules/typescript/ role=writes scope=reader/protocol-surface-policy shape=*.bound value=dist/test/protocol-surface-reading.js
1055
+ bound-lock/1 at=policy:head/protocol-parser-inputs/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/test/|docs/contracts/|node_modules/typescript/ role=writes scope=reader/protocol-surface shape=run value=dist/test/protocol-surface-reading.js
1056
+ bound-lock/1 at=policy:head/protocol-parser-inputs/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/protocol-surface-parser shape=node_modules/typescript/lib/typescript.js value=sha256:3ae902c92cc44dace175c0e69e13a4b0899f6983c6121d76b9ab8dd5795e7675
1057
+ bound-lock/1 at=policy:head/protocol-parser-inputs/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/protocol-surface-parser-manifest shape=node_modules/typescript/package.json value=sha256:822ef7ca6452205657b6288b066481ecf508bfbf43455d715cf7d3ec457561e6
1058
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=bundle/association-family value=packages
1059
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=bundle/receiver-folder value=head-packages
1060
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-associated/next value=ask
1061
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-associated/next/args value=place:$place
1062
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-associated/state value=done
1063
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-not-selected/next value=ask
1064
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-not-selected/next/args value=place:$place
1065
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-not-selected/state value=refused
1066
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-receiver-ready/next value=connect
1067
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-receiver-ready/next/args value=document:$document|digest:$digest|place:$place
1068
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-receiver-ready/state value=open
1069
+ bound-lock/1 at=policy:head/receiver-flow/0.2.1 by=target form=alphabet measure=id role=writes scope=said/elicit-bundle-receive/state value=asked
1070
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet kind=js measure=reader needs=TARGET.bound role=writes scope=reader/receiver-runtime-policy shape=*.bound value=dist/test/receiver-runtime.js
1071
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet kind=js measure=reader needs=runtime.bundle.json|package-lock.json|docs/contracts/bundle-receiver.json|vectors/bundle-receiver.json|samples/receiver-runtime/yes/client.json role=writes scope=reader/receiver-runtime-json shape=*.json value=dist/test/receiver-runtime.js
1072
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet kind=js measure=reader needs=test/receiver.test.ts|test/source-policy.test.ts|test/share-bundle.test.ts|test/runtime-resolution.test.ts role=writes scope=reader/receiver-runtime-tests shape=*.ts value=dist/test/receiver-runtime.js
1073
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|dist/src/|test/receiver.test.ts|test/source-policy.test.ts|test/share-bundle.test.ts|test/runtime-resolution.test.ts|dist/test/receiver-runtime.js|docs/contracts/bundle-receiver.json|vectors/bundle-receiver.json|samples/receiver-runtime/yes/|runtime.bundle.json|package-lock.json|TARGET.bound role=writes scope=reader/receiver-runtime shape=run value=dist/test/receiver-runtime.js
1074
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/receiver-runtime value=samples/receiver-runtime/**
1075
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/receiver-vectors shape=vectors/bundle-receiver.json value=sha256:bc3d8cb077542d54d2f2666ccb3603ed5af8e5c598007e53115815c3c6df0fac
1076
+ bound-lock/1 at=policy:head/receiver-runtime/0.2.1 by=target form=interval measure=defects needs=samples/receiver-runtime/yes/ role=demands scope=composition/receiver-runtime value=0..0
983
1077
  bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/blocks value=integrity|pins|cli|surface
984
1078
  bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/category/integrity value=literal/host|literal/key|literal/org|literal/path|duplicate/src|door/unreceipted
985
1079
  bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/category/surface value=surface/**|tools/config|core/lines|access/lines|places/lines|sources/lines|compile/lines|adopt/lines|walk/lines|ports/lines
1080
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/composition-capture shape=samples/composition/yes/client.json value=sha256:ff823082358cf7d8b83f91e76a6396b8dee0acdff1e07b2a1dcef609807e7ab4
1081
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/mcp-receiver-capture shape=samples/mcp-receiver/yes/client.json value=sha256:32c21ca4a06694b78c998a86fdc33a06c1b1a29a620b5f648a491536621ced82
1082
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/receiver-capture shape=samples/receiver-runtime/yes/client.json value=sha256:20cd9d32b193e0c801f571ee6238b81bea19adf5410f984b2cb756ab5608d76f
1083
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-composition-vectors shape=dist/test/composition-reading.js value=sha256:51d97f1ab12337b44ba2a5730e5f6d801cec5b99d976cd6511eb1a3a06b4a714
1084
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-first-minute shape=dist/test/first-minute.js value=sha256:267bfbd081d60fcb4b6ee5b66972c86aa7c69905394e46d876f0f0290a132f84
1085
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-mcp-receiver shape=dist/test/mcp-receiver-reading.js value=sha256:43e7081b56197d559249eb0a440304de9fcd98b5f72d8f0f8e2cd9be67ef3cdc
1086
+ bound-lock/1 at=policy:head/release-acceptance/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-receiver shape=dist/test/receiver-runtime.js value=sha256:c4b29227035b4fc5d12728537037ec76cb3b4d411d6d6be291b047f036fb017d
986
1087
  bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/authority-preflight-contract shape=docs/contracts/authority-preflight.json value=sha256:7fced2a3721f0857fb78fbcf72c5b0225c8c1e80c10fc192869928014b748b35
987
- bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/runtime-release-metadata shape=entry.js value=sha256:1e56d1365f21b99d6d0e84293803f680e9c33de5d933a6060d84b502704d88d1
988
- bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=digest role=writes scope=uses/release-metadata value=sha256:801055d20e13ed42267021e7efdb9b1ac914e23ad053f7d151f2801fab57f7ae
989
- bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=dep/runtime-first-minute shape=dist/test/first-minute.js value=sha256:0f27ad4d77d2fb60253dc64c593392fbb97f99c6820e12fcbda5981597ff402c
990
- bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/release-metadata value=https://github.com/Lapxo/head/releases/download/v0.2.0/801055d20e13ed42267021e7efdb9b1ac914e23ad053f7d151f2801fab57f7ae.bound
991
- bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/runtime-release-metadata value=https://github.com/Lapxo/head/releases/download/v0.2.0/1e56d1365f21b99d6d0e84293803f680e9c33de5d933a6060d84b502704d88d1.tgz
992
1088
  bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=status needs=package-lock.json role=demands scope=release/metadata/lock shape=decision value=present
993
1089
  bound-lock/1 at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=status needs=package.json role=demands scope=release/metadata/manifest shape=decision value=present
994
- bound-lock/1 at=policy:head/release/0.2.0 by=target form=alphabet measure=id role=writes scope=version value=0.2.0
1090
+ bound-lock/1 at=policy:head/release-metadata/0.2.1 by=target form=alphabet measure=digest role=writes scope=dep/runtime-release-metadata shape=entry.js value=sha256:c0569d3c32decf3c064094ec9562e1e31b8aac456e07504871922d8fc5e342f0
1091
+ bound-lock/1 at=policy:head/release-metadata/0.2.1 by=target form=alphabet measure=digest role=writes scope=uses/release-metadata value=sha256:c09d3744bcd410b4634ffb78cc7cd787f4c029298f8ce60fe36f230461bb4885
1092
+ bound-lock/1 at=policy:head/release-metadata/0.2.1 by=target form=alphabet measure=id role=writes scope=sources/release-metadata value=https://github.com/Lapxo/head/releases/download/v0.2.1/c09d3744bcd410b4634ffb78cc7cd787f4c029298f8ce60fe36f230461bb4885.bound
1093
+ bound-lock/1 at=policy:head/release-metadata/0.2.1 by=target form=alphabet measure=id role=writes scope=sources/runtime-release-metadata value=https://github.com/Lapxo/head/releases/download/v0.2.1/c0569d3c32decf3c064094ec9562e1e31b8aac456e07504871922d8fc5e342f0.tgz
1094
+ bound-lock/1 at=policy:head/release/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-bundle shape=runtime.bundle.json value=sha256:f20d82a86d78a47086e5d043def1be3799d9132922c6227cfbc6186fdd6233cc
1095
+ bound-lock/1 at=policy:head/release/0.2.1 by=target form=alphabet measure=id role=writes scope=version value=0.2.1
995
1096
  bound-lock/1 at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/access-anonymous/state value=done
996
1097
  bound-lock/1 at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/access-kept/state value=done
997
1098
  bound-lock/1 at=policy:head/shape/0.1.2 by=target form=alphabet measure=id role=writes scope=said/access-unstated/state value=refused
@@ -1121,6 +1222,12 @@ bound-lock/1 at=policy:head/shape/0.1.6 by=target form=alphabet measure=id role=
1121
1222
  bound-lock/1 at=policy:head/shape/0.1.6 by=target form=alphabet measure=id role=writes scope=said/pick-offer/state value=asked
1122
1223
  bound-lock/1 at=policy:head/shape/0.1.6 by=target form=alphabet measure=id role=writes scope=said/why-transport/state value=done
1123
1224
  bound-lock/1 at=policy:head/shape/0.1.6-answered by=target form=alphabet measure=id role=writes scope=said/answered-nothing/state value=done
1225
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-protocol-pending/state value=open
1226
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-refused/state value=refused
1227
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-shared/state value=done
1228
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-source-needed/next value=connect
1229
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-source-needed/next/args value=source:$source|document:$document
1230
+ bound-lock/1 at=policy:head/share-assembly/0.2.1 by=target form=alphabet measure=id role=writes scope=said/bundle-source-needed/state value=open
1124
1231
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/share-inspect value=samples/share-inspect/**
1125
1232
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/share-inspect-fixtures value=test/**
1126
1233
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=link/prefixes value=#bound:|#topos-reference:
@@ -1140,8 +1247,19 @@ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=
1140
1247
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=share/birth-scopes value=lang
1141
1248
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=interval measure=count role=writes scope=share/birth-items value=0..64
1142
1249
  bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=interval measure=defects needs=samples/share-inspect/yes/ role=demands scope=share-inspect/verified value=0..0
1250
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=alphabet kind=js measure=reader needs=package.json|package-lock.json|runtime.bundle.json role=writes scope=reader/share-runtime-metadata shape=*.json value=dist/test/share-runtime.js
1251
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/|test/|dist/src/|dist/test/|samples/share-runtime/yes/|docs/contracts/|vectors/|runtime.bundle*.json|package*.json|TARGET.bound role=writes scope=reader/share-runtime shape=run value=dist/test/share-runtime.js
1252
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/share-runtime value=samples/share-runtime/**
1253
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/share-runtime-contract shape=docs/contracts/share-runtime.json value=sha256:028c37964e7f02519204203aac5e861458ef62af3b3fcb1b7d83ebbc3f58da60
1254
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=alphabet measure=id role=writes scope=share/bundle-suffix value=.mcpb
1255
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=interval measure=defects needs=samples/share-runtime/yes/ role=demands scope=composition/share-runtime value=0..0
1256
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=interval measure=share-public-bytes role=writes scope=share/bundle-bytes value=0..16777216
1257
+ bound-lock/1 at=policy:head/share-runtime/0.2.1 by=target form=interval measure=share-selections role=writes scope=share/bundle-selections value=0..64
1143
1258
  bound-lock/1 at=policy:head/signer by=target form=interval measure=bytes role=writes scope=signer/response-bytes value=1048576..1048576
1144
1259
  bound-lock/1 at=policy:head/signer by=target form=interval measure=milliseconds role=writes scope=signer/timeout value=30000..30000
1260
+ bound-lock/1 at=policy:head/single-sdk-prerequisites/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/configured-ports value=samples/configured-ports/**
1261
+ bound-lock/1 at=policy:head/single-sdk-prerequisites/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/configured-ports-vectors shape=vectors/configured-receiver.json value=sha256:964b8698039b397e3c52f77bc1dda669ca7a639535c722752c03964134a59ace
1262
+ bound-lock/1 at=policy:head/single-sdk-prerequisites/0.2.1 by=target form=interval measure=defects needs=samples/configured-ports/yes/ role=demands scope=configured/prerequisite-ports value=0..0
1145
1263
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/access/required value=source
1146
1264
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/ask/required value=source|operation
1147
1265
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/can/required value=source|operation|times
@@ -1233,12 +1351,6 @@ bound-lock/1 at=policy:head/walk by=target form=alphabet measure=id role=writes
1233
1351
  bound-lock/1 at=policy:head/walk by=target form=alphabet measure=id role=writes scope=birth/wire/walk/projections value=0:inventory|1:summary|8:history
1234
1352
  bound-lock/1 at=policy:head/walk by=target form=alphabet measure=id role=writes scope=birth/wire/walk/resolutions value=0|1|8
1235
1353
  bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/walk-reading value=samples/walk-reading/**
1236
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/authority-preflight-capture shape=samples/authority-preflight/yes/client.json value=sha256:d35558a76bbb9051137da7befc5bee72c3cd6e4f9138e4531752f113dbda481e
1237
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/share-inspect-capture shape=samples/share-inspect/yes/client.json value=sha256:5afcd841e5ad36c57df79e477f395656c9db7379af8c8939b169e2fe9a79a1fc
1238
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=digest role=writes scope=dep/walk-reading-capture shape=samples/walk-reading/yes/client.json value=sha256:80dff9c0f4691ef8c8272bf6d8648a301a78186ba49eb02e3a5e89c3b1d26622
1239
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=id role=writes scope=dep/runtime-authority-preflight shape=dist/test/authority-preflight-reader.js value=sha256:33b7431d0a22fe9639f05764b4f535bf2ea55948d470ba571ae4574f40fe4509
1240
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=id role=writes scope=dep/runtime-share-inspect shape=dist/test/share-inspect.js value=sha256:7a0b8f97fbb7b134b9a5d7f0cc86c61b6d68e4f4e903eebcfe8494c1c30ea59d
1241
- bound-lock/1 at=policy:head/walk-reading/0.2.0 by=target form=alphabet measure=id role=writes scope=dep/runtime-walk-reading shape=dist/test/walk-reading.js value=sha256:3ed223f5e659e3c47f1f81a561f84d86b99b8492ab31cf08c87a417b8e0d6936
1242
1354
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/at-classes value=origin|place|receipt|witness|policy
1243
1355
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/families value=audit|beat|block|cites|comments|concept|cost|dep|effect|fold|hazard|keys|law|license|lines|literal|offers|question|reader|region|release|render|roles|sample|session|take|test|tree|vector|view|write
1244
1356
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/fields value=scope|role|form|measure|value|by|at|needs|sig|epoch|shape|restsOn|condition|about|kind|view
@@ -1252,10 +1364,14 @@ bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads s
1252
1364
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/shapes value=decision|lock|package|reader|render|run|vector|view
1253
1365
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/states value=absent|present|unread|withdraw
1254
1366
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/templates value={cone}|{roots}
1367
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=alphabet kind=process measure=reader needs=src/core/|dist/src/core/|test/|dist/test/|samples/world-standing/yes/|docs/contracts/|TARGET.bound role=writes scope=reader/world-standing shape=run value=dist/test/world-standing.js
1368
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=alphabet measure=coordinates role=reads scope=region/world-standing value=samples/world-standing/**
1369
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/runtime-world-standing shape=dist/test/world-standing.js value=sha256:105dbf80dfca6572c7a3af5799b1e083943cd957fb47de3615a2f89169d115d5
1370
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/world-standing-contract shape=docs/contracts/world-standing-size.json value=sha256:25b0bfe9c37a169367ce0152ca1379623f3585e7111b3b3807bb45e64bcbd737
1371
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=alphabet measure=id role=writes scope=dep/world-standing-helper shape=dist/src/core/worlds.js value=sha256:5987da9b517c1b4229eda2c2bc7871d64b610e267ed0f8817bf05ad864d3bf92
1372
+ bound-lock/1 at=policy:head/world-standing/0.2.1 by=target form=interval measure=defects needs=samples/world-standing/yes/ role=demands scope=world/standing-integrity value=0..0
1255
1373
  bound-lock/1 at=policy:head/worlds by=target form=alphabet measure=id role=writes scope=world/shape value=dist/index.js
1256
- bound-lock/1 at=policy:head/worlds/0.2.0 by=target form=alphabet measure=digest role=writes scope=world/topos-mcp/blob value=sha256:d2a4eaa804501a8425498499727954f3328a9bdda19651bc4757959f67cb0a6d
1257
1374
  bound-lock/1 at=policy:head/worlds/0.2.0 by=target form=alphabet measure=digest role=writes scope=world/topos-openapi/blob value=sha256:13a79fc41f1b837a0527fbe4c5aed3cec190fae7d28215a36ec25e54f7d67274
1258
- bound-lock/1 at=policy:head/worlds/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/topos-mcp-blob value=https://github.com/Lapxo/topos-mcp/releases/download/v0.1.1/d2a4eaa804501a8425498499727954f3328a9bdda19651bc4757959f67cb0a6d.tar.gz
1259
1375
  bound-lock/1 at=policy:head/worlds/0.2.0 by=target form=alphabet measure=id role=writes scope=sources/topos-openapi-blob value=https://github.com/Lapxo/topos-openapi/releases/download/v0.1.1/13a79fc41f1b837a0527fbe4c5aed3cec190fae7d28215a36ec25e54f7d67274.tar.gz
1260
1376
  bound-lock/1 at=policy:project by=target form=alphabet measure=coordinates role=reads scope=region/checks value=test/**|vectors/**|samples/**
1261
1377
  bound-lock/1 at=policy:project by=target form=alphabet measure=coordinates role=reads scope=region/project value=package.json|LICENSE