@lapxo/head 0.1.7 → 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 (70) hide show
  1. package/README.md +39 -14
  2. package/TARGET.bound +237 -31
  3. package/dist/src/adopt/adopt.d.ts +2 -2
  4. package/dist/src/adopt/adopt.js +20 -6
  5. package/dist/src/ahead/read.d.ts +2 -2
  6. package/dist/src/ahead/read.js +2 -4
  7. package/dist/src/answers/answered.js +1 -1
  8. package/dist/src/compile/pin.d.ts +1 -1
  9. package/dist/src/compile/pin.js +5 -3
  10. package/dist/src/core/answer.d.ts +12 -0
  11. package/dist/src/core/answer.js +1 -1
  12. package/dist/src/core/association.d.ts +16 -0
  13. package/dist/src/core/association.js +34 -0
  14. package/dist/src/core/composition.d.ts +32 -0
  15. package/dist/src/core/composition.js +28 -0
  16. package/dist/src/core/package.d.ts +1 -0
  17. package/dist/src/core/package.js +17 -4
  18. package/dist/src/core/read.d.ts +2 -1
  19. package/dist/src/core/read.js +2 -1
  20. package/dist/src/core/receiver.d.ts +11 -0
  21. package/dist/src/core/receiver.js +122 -0
  22. package/dist/src/core/share-bundle.d.ts +9 -0
  23. package/dist/src/core/share-bundle.js +56 -0
  24. package/dist/src/doors/head.d.ts +1 -0
  25. package/dist/src/doors/head.js +11 -3
  26. package/dist/src/flows/answer.js +7 -3
  27. package/dist/src/flows/call.d.ts +1 -1
  28. package/dist/src/flows/call.js +28 -4
  29. package/dist/src/flows/device.d.ts +14 -5
  30. package/dist/src/flows/device.js +15 -7
  31. package/dist/src/flows/plan.d.ts +2 -0
  32. package/dist/src/flows/plan.js +16 -2
  33. package/dist/src/index.js +3 -31
  34. package/dist/src/links/birth.d.ts +6 -0
  35. package/dist/src/links/birth.js +48 -0
  36. package/dist/src/links/inspect.d.ts +1 -1
  37. package/dist/src/links/inspect.js +23 -12
  38. package/dist/src/links/link.d.ts +2 -2
  39. package/dist/src/links/link.js +7 -10
  40. package/dist/src/onboard/first.js +1 -1
  41. package/dist/src/onboard/owed.js +1 -1
  42. package/dist/src/places/admit.js +1 -1
  43. package/dist/src/places/found.js +3 -1
  44. package/dist/src/ports/adapters/bundle.d.ts +44 -0
  45. package/dist/src/ports/adapters/bundle.js +173 -0
  46. package/dist/src/ports/adapters/configured.d.ts +35 -0
  47. package/dist/src/ports/adapters/configured.js +67 -0
  48. package/dist/src/ports/adapters/mcp.d.ts +59 -0
  49. package/dist/src/ports/adapters/mcp.js +122 -0
  50. package/dist/src/ports/adapters/network.d.ts +12 -0
  51. package/dist/src/ports/adapters/network.js +67 -0
  52. package/dist/src/ports/adapters/protocol.d.ts +6 -0
  53. package/dist/src/ports/adapters/protocol.js +51 -0
  54. package/dist/src/ports/adapters/remote.d.ts +13 -0
  55. package/dist/src/ports/adapters/remote.js +33 -0
  56. package/dist/src/ports/bound.d.ts +0 -1
  57. package/dist/src/ports/bound.js +14 -15
  58. package/dist/src/ports/host.d.ts +18 -0
  59. package/dist/src/ports/host.js +58 -9
  60. package/dist/src/sources/connect.d.ts +1 -0
  61. package/dist/src/sources/connect.js +15 -11
  62. package/dist/src/tools/card.js +3 -2
  63. package/dist/src/use/named.js +3 -3
  64. package/dist/src/verbs/ask.js +7 -1
  65. package/dist/src/verbs/card.js +2 -2
  66. package/dist/src/verbs/do.js +2 -1
  67. package/package.json +6 -5
  68. package/runtime.bundle.json +24026 -0
  69. package/dist/src/ports/reading.d.ts +0 -8
  70. package/dist/src/ports/reading.js +0 -14
package/TARGET.bound CHANGED
@@ -1,11 +1,15 @@
1
1
  bound-lock/1 about= at=policy:head/doors/0.1.7-guard by=target form=alphabet measure=id role=writes scope=device/head/coverage value=read/**|kept/**|act/**|access/**|use/**|refused/**
2
+ bound-lock/1 about="# A typed answer from a local API\n\nThis checkout example needs macOS and Node 22.18 or later. From the repository root, install its pinned dependencies with `npm ci --ignore-scripts`.\n\nThe existing test client speaks MCP, follows cards and handles the catalogue actions through the three public tools. This demo creates a temporary home, simulated keychain and loopback API. Its automatic yes applies only to this fixture. In normal use, you approve the connection yourself. The first run may fetch pinned public world artifacts; the API itself is local.\n\nRun this from the repository root:\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 { api } from './test/two-sources.ts';\nimport { ask } from './test/client.ts';\nimport { fakeKeychain } from './test/fake-keychain.ts';\nimport { parse } from '@lapxo/topos/wire';\nconst demo = JSON.parse(readFileSync('docs/examples/first-minute.json', 'utf8'));\nconst fixture = await api(() => JSON.stringify(demo.response));\nconst home = mkdtempSync(join(tmpdir(), 'head-example-'));\nconst env = { ...fakeKeychain({}).env, HEAD_HOME: join(home, 'home'), HOME: home, USERPROFILE: home };\nconst call = (name, arguments_) => ({ method: 'tools/call', params: { name, arguments: arguments_ } });\ntry {\n const results = await ask([\n call('connect', { source: demo.source, document: fixture.document }),\n call('ask', { place: join(home, 'place'), source: demo.source, operation: demo.operation, args: demo.args })\n ], [], env, () => ({ action: 'accept', content: { yes: true } }));\n const output = results.at(-1).result.content[0].text;\n const lines = output.split('\\n').map(parse).filter(p => p.kind === 'fact').map(p => p.value.fields);\n for (const [field, value] of Object.entries(demo.expectedTypedValues))\n assert(lines.some(line => line.scope?.endsWith('/' + field) && line.value === value));\n assert(lines.some(line => line.scope?.startsWith('read/forecast/') && line.measure === 'digest' && line.sig));\n console.log(JSON.stringify({ source: demo.source, values: Object.fromEntries(Object.keys(demo.expectedTypedValues).map(field => [field, lines.find(line => line.scope?.endsWith('/' + field)).value])), receipt: lines.find(line => line.scope?.startsWith('read/forecast/') && line.measure === 'digest').value }, null, 2));\n} finally { fixture.close(); }\nJS\n```\n\nThe returned fields include `temperature = 21` and `sky = clear`, plus the read's signed digest receipt. Paths and signatures vary; those are observations, not fixed demo bytes. The fixture schema supplies the types. Another API with no usable schema is named untyped instead of receiving invented types.\n\nTo ask a real source, supply its document in your assistant, choose a source name, and approve its connection. An overlay can fill in what the provider declares separately. Access is anonymous only when permitted, or obtained by the declared flow or secret-input path. Never enter a secret in the model conversation. See [access options](connect-any-api.md).\n\nThe separate timing acceptance is `HEAD_ONBOARDING=1 HEAD_FIRST_CELL_STRICT=1 node --test test/onboarding.test.ts`. Running this demo is not a timing or platform certification.\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/first-minute shape=docs/first-minute.md value=lock
3
+ bound-lock/1 about="# Agreement keeps its sources\n\nTwo matching answers need not be two independent observations. head compares typed fields, keeps each source and its read receipt, and displays declared lineage rather than inventing a confidence score.\n\n| Marks | What the view says |\n|---|---|\n| `●○` | A later source shares declared lineage or a recognized source identity with an earlier one. |\n| `●●` | Separate source marks in this view. Unknown or undeclared lineage is not proof of independence. |\n\nIf values differ, head shows each source's value and time. It does not pick a winner or manufacture a numeric loss. A field missing from one source is partial evidence, not disagreement with an assertion nobody made.\n\nThis checkout example uses the existing two-source fixture and declaration/withdrawal mechanism. The fixture sources return the same two fields; these are not measurements or an independence experiment. Run `npm ci --ignore-scripts` first, then:\n\n```sh\nnode --input-type=module <<'JS'\nimport { readFileSync } from 'node:fs';\nimport { strict as assert } from 'node:assert';\nimport { api, person } from './test/two-sources.ts';\nconst demo = JSON.parse(readFileSync('docs/examples/lineage.json', 'utf8'));\nconst a = await api(() => JSON.stringify(demo.response));\nconst b = await api(() => JSON.stringify(demo.response));\ntry {\n const p = await person(a.document, b.document);\n p.rooted([demo.declare]);\n const grouped = await p.asked();\n assert(grouped.length > 0 && grouped.every(c => c.code === demo.before.code && c.fields.marks === demo.before.marks));\n const receipts = new Set(grouped.flatMap(c => c.fields.receipts.split('|')));\n assert(grouped.every(c => c.fields.sources === 'forecast, mirror' && c.fields.receipts.split('|').length === 2));\n assert([...receipts].every(receipt => p.receipts().has(receipt)));\n p.rooted([demo.withdraw]);\n const after = await p.asked();\n assert(after.length > 0 && after.every(c => c.code === demo.after.code && c.fields.marks === demo.after.marks));\n assert(after.every(c => c.fields.sources === 'forecast, mirror'));\n assert([...receipts].every(receipt => p.receipts().has(receipt)));\n console.log(JSON.stringify({ before: demo.before, after: demo.after, oldReceiptsRetained: true, independenceProved: false }, null, 2));\n} finally { a.close(); b.close(); }\nJS\n```\n\nThe declaration says that `mirror` shares `forecast`'s lineage. Its withdrawal removes that current claim, not the sources or old receipts. The later `●●` is reported as **unknown lineage**, not newfound independence. Each mark still points to a source-specific read; grouping does not merge receipt identities.\n" at=policy:head/documentation/0.2.0 by=target form=alphabet measure=text role=writes scope=prose/en/page/lineage shape=docs/lineage.md value=lock
2
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
3
- bound-lock/1 about="# Security\n\nReport vulnerabilities privately to hello@lapxo.com.\nDo not open public issues for security reports.\n\nWe acknowledge reports within 7 days. There is no bug bounty\nand no reward of any kind; we will credit you in the fix if you want.\n\nIn scope: Head, Bound, Topos, Obligations, and the published wire.\nOut of scope: the model you connect, third-party APIs you connect\nto, and anything running outside the loopback doors.\n\nHead's signing keys are read only by its signer, a short process\nstarted each time a key is made, checked or used: it hands back a\npublic half or signatures, never the key. The long process that\ntalks to the model and opens doors is refused a signing key by name.\nThe signer and Head run as the same user, so this boundary is in\nHead's code, not in the operating system: a compromised process\ncan call the keychain itself.\n\nA report is useful if it shows one of these:\n- an agent obtaining or using a key it was not granted\n- a line landing without an admitted key\n- a refusal record that can be edited or removed through a door\n- a door accepting a non-loopback bind, foreign Host, or any Origin\n" at=policy:head/docs/0.1.7-signing-key by=target form=alphabet measure=text role=writes scope=prose/en/security shape=SECURITY.md value=lock
4
- bound-lock/1 about="# head\n\nAn API already says what it offers, where it is reached and how access to it is proven. head reads that document once, compiles it into lines its place pins by digest, and from then on answers by those lines: which operation reads, what it asks, what it answered. It names no kind of source and no client: what it reads is said by the worlds it adopts, and what it asks through is what the client declares. [Connect any API](https://github.com/Lapxo/head/blob/main/docs/connect-any-api.md) shows each level of access.\n\nA person does four things, in the client they talk to. **Connect** an API: hand head its document, and an overlay beside it when it says too little; it is compiled once and pinned, and the first connect with no place founds `~/place` on the same yes, its root key kept in the keychain. **Ask**: name what you want by its name or in your own words; head finds it in its own registry of the source, never listing the rest to the model, obtains access the first time as the document declares it, calls only what reads, types the answer and lands a receipt. An answer of nothing is what the source holds today, said with its hour; no byte at all is no answer, and the read stays owed until one brings them. **Do** what is not a read, once you say yes to that very call. **Share** a place: share makes a package you can send and verify; your lines are a plain text file you can copy. A client starts head with `head run`; typed alone, `head` says this and starts nothing.\n\n**Your lines.** Beside your place's lock, `birth.bound` holds your lines and nothing of head's: your root and your devices, the sources you connected, what you allowed, each offer you used under the words you asked it by. It is a text file with your lines, in your own words: read it with `cat`, copy it, paste it. head's own lines are its profile, which you see when you ask why.\n\nAccess comes at three levels, and the place says which. **None**: the document states that a read needs nothing, or says nothing about access at all; then head tries the read once with nothing attached, and keeps what it saw as a receipt. **A declared flow**: the document, or its overlay, declares how access is obtained, as an Arazzo profile: a form, a one-time code, a choice, a provider's page. head runs it once per issuer and keeps only the token, in the keychain. **A secret entered by hand**: a key or a password, only where the place's root allows it, entered on head's own one-time page and never through the model.\n\nWhat head never does. It never guesses how access is proven: when a document does not state it, only a read is tried, with nothing attached, and nothing else is called. It never calls an operation that is not a read without the person's yes, nor past what the place allows; a place that would stand on another's lock as its parent is refused by name, since composing two places' policies is bound's. It never lets a secret reach the model, a file, an answer or an argument. And it never raises a ceiling to make room: what outgrows one stays open until its responsibilities are reduced or split.\n\n## Install\n\n- **As an extension:** download `head-<version>-<digest>.mcpb` from the [latest release](https://github.com/Lapxo/head/releases/latest) and open it. Its digest is in the release notes.\n- **By command:** `npx -y @lapxo/head@0.1.7 run`, for an assistant that starts its servers by command.\n\nhead runs on macOS for now. Its keys live in your keychain, never in a file.\n\n## The first minute\n\nhead connects nothing when it is installed, and names no provider: what it reads is the API you hand it.\n\n1. Ask your assistant something. With no place yet, head says so, and asks for the address of the document of an API that answers it.\n2. Give that address and say yes once. head founds your place in `~/place`, connects the API from its document, pinned by the digest of what it read, and lets head read it for the next 90 days.\n3. Your assistant asks again by itself, and the answer comes back typed, with the source it came from and a receipt signed by head's key.\n" at=policy:head/release/0.1.7 by=target form=alphabet measure=text role=writes scope=prose/en/readme shape=README.md value=lock
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
+ 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.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
5
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
6
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
7
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
8
11
  bound-lock/1 about="A sign or land uses its own host and an injected signer port for one call. Unknown admitted-key selection and missing signer binding are distinct negatives; no key is read before these refusals. The host closes and its own scratch is removed when the call finishes." at=policy:head/host/0.1.7-repin-027 by=target form=alphabet measure=id role=writes scope=bound/signing-host value=one-call@1
12
+ bound-lock/1 about="A source document, a historical or located standing reference, or a public birth record supplied inline or as a client-shared local birth.topos file. Birth records are inspected only." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/connect/document value=string
9
13
  bound-lock/1 about="A source the place compiles, by the name the place gives it: alone, its region, what of it was used and how much more it offers; with an operation, one read of it." at=policy:head/verbs/0.1.6 by=target form=alphabet measure=id role=writes scope=tool/ask/source value=string
10
14
  bound-lock/1 about="A source the place compiles." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/access/source value=string
11
15
  bound-lock/1 about="A source the place compiles." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/act/source value=string
@@ -26,7 +30,7 @@ bound-lock/1 about="Answer the person in their words. Never show them a coordina
26
30
  bound-lock/1 about="Answered from the receipt {scope} ({digest}), as the source answered it at {at}, within the reuse the place allows: nothing was called; nothing typed was kept of it, so it was typed again." at=policy:head/words/0.1.7-forbidden by=target form=alphabet measure=id role=writes scope=said/reread value=lock
27
31
  bound-lock/1 about="Answered from what was kept for {scope} ({digest}), as the source answered it at {at}, within the reuse the place allows: nothing was called and nothing typed again." at=policy:head/words/0.1.7-forbidden by=target form=alphabet measure=id role=writes scope=said/reused value=lock
28
32
  bound-lock/1 about="Any API, read by its document" at=policy:head/docs by=target form=alphabet measure=text role=writes scope=docs/tagline value=lock
29
- bound-lock/1 about="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." at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=writes scope=tool/ask value=place|source|operation|args|view|card|key|lines|why|history|closes|sources
33
+ bound-lock/1 about="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." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/ask value=place|source|operation|args|view|card|key|lines|why|history|closes|sources|preflight|authority
30
34
  bound-lock/1 about="Ask me before {operation} on {source} is called, every time. Plan this line for me to sign:" at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/ask/text value=lock
31
35
  bound-lock/1 about="Ask the person before an offer is called, every time." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/ask value=source|operation
32
36
  bound-lock/1 about="Asked of a link, the transport it is read by: the lines of head's profile the place was born with, and who laid them." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/connect/why value=boolean
@@ -35,16 +39,30 @@ bound-lock/1 about="At most three digest-bound HTTPS redirects under the existin
35
39
  bound-lock/1 about="Call one offer that is not of class read, only as far as the person allowed it and after their yes when they asked to be asked. The intent lands before the call and the receipt after; a call that never answered stays open until a look closes it." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/act value=place|source|operation|args
36
40
  bound-lock/1 about="Clone, `npm ci && npm test`. A vector that gives you a different answer is the contribution: send it with what it printed. Lines land through the fold, never by hand; when a page and the lock disagree, the lock is right." at=policy:head/docs by=target form=alphabet measure=text role=writes scope=prose/en/contributing value=lock
37
41
  bound-lock/1 about="Closed {intent} by this read ({digest}). It counts as done: act runs again only within what is still allowed." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/closed value=lock
42
+ bound-lock/1 about="Configuration preflight for {key}: {decision}; kind {kind}; needs {needs}. This is an observation at one supplied instant, not permission to execute APIs or a later changed action. Q4 domain checks remain separate." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-card value=lock
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
+ 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
38
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
39
- 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
40
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
41
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
42
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
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
43
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
44
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
45
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
46
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
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
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
47
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
48
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
49
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
50
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
@@ -57,8 +75,9 @@ bound-lock/1 about="For key: head, for the key that signs what head read and did
57
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
58
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
59
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
60
- 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
61
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
62
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
63
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
64
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
@@ -67,8 +86,10 @@ bound-lock/1 about="History, not a current answer: what {source} answered to {op
67
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
68
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
69
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
70
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
71
- bound-lock/1 about="Its document: an https address, read with nothing attached and, named by its digest, followed wherever it moves to the bytes that digest names; or an absolute file inside the place or a folder the client shares; or a package's lock, from either, with its digest. Or a site alone, such as api.example.com, its document found where the site publishes its catalog or at the paths head's lock names; or a folder the client shares, its document found inside it at those names. A site or folder names the source when none is given." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/connect/document value=string
72
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
73
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
74
95
  bound-lock/1 about="Keep what the person states in this conversation as theirs, signed by their own key: their words exactly as they said them, never what you concluded from them. The first time in a conversation they are asked once; each statement is said back as it goes in. With withdraw, the same words are taken back. With origin agent, what you yourself state is kept as an agent's, never as theirs, where the place admits an agent." at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=tool/claim value=place|said|withdraw|origin
@@ -77,10 +98,20 @@ bound-lock/1 about="Kept as yours in {place}: {said}" at=policy:head/claims/0.1.
77
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
78
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
79
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
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
80
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
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
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
81
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
82
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
83
- bound-lock/1 about="No link: a link needs the address where its bytes are published. {document} is ready to publish as it is; share again with that address, or send the package's digest apart as before." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/shared-unlinked value=lock
84
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
85
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
86
117
  bound-lock/1 about="No place {place} is in head's index on this device: a place is founded with the place tool, and then it is listed here." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/places-none value=lock
@@ -91,19 +122,44 @@ bound-lock/1 about="Nothing kept in {place} is {said}: nothing was taken back."
91
122
  bound-lock/1 about="Nothing was admitted: hand the lines the other device's key tool answered, and a name." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/no-key value=lock
92
123
  bound-lock/1 about="One place by its folder, absolute; without one, every place." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=tool/places/place value=string
93
124
  bound-lock/1 about="One view of a place as bound folds it, for a client to hold beside the conversation." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=resource/view value=bound://view/{view}{?place,at}
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
94
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
95
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
96
- 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
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
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
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
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
97
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
98
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
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
99
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
100
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
101
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
102
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
147
+ bound-lock/1 about="Public place settings are ready in {document}. They are separate from the source package and grant nothing." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-shared value=lock
148
+ bound-lock/1 about="Public place settings inspected: {inspection}. Already occupied here: {collisions}. No settings or authority were installed; changes require ordinary local review and admission." at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-inspected value=lock
149
+ bound-lock/1 about="Q4 remains partial. Bound checks exact configuration records; Head keeps API permissions, access negotiation and secret consent, plus device attestation admission, under its existing domain card. Native configuration failures are named without converting observations into grants." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=do/not-in-card/head value=not-covered|not-allowed|secret-unallowed|access-unstated|authority-refused|authority-needed
103
150
  bound-lock/1 about="Read one view of a place as bound folds it, at the resolution ask reads it at; or what a source offers, as typed lines: at 0 where it is reached and the class of each offer, past it their forms and how access is proven; or, with an operation of class read, that operation once: the response comes back with the receipt the device key landed for it, or, while the place allows reuse, the answer kept for it and nothing called. Nothing else is ever called." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/look value=place|view|source|operation|args|closes|history|why
104
151
  bound-lock/1 about="Read the current bytes of every declared TypeScript source through the shared surface classifier. Emit the number of source files owning scheduling primitives; refuse any such source except src/ports/host.ts. Bound combines the readings and judges the admitted ceiling." at=policy:head/scheduled-native/0.1.7 by=target form=alphabet kind=js measure=reader needs=src/ role=writes scope=reader/surface-scheduled shape=*.ts value=dist/test/scheduled.js
152
+ bound-lock/1 about="Read the existing cells, or observe Bound configuration preflight for explicit records and key. This observation never installs authority and does not replace Head domain permissions." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/card value=place|key|lines|preflight|authority
105
153
  bound-lock/1 about="Receive a package another place shared: from a file or an address, by the digest its sender sent apart from it." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=prompt/receive value=package|digest|place
106
154
  bound-lock/1 about="Receive the package {package} into the place {place} with the connect tool: its lock as the document, named by the digest {digest}. Ask me before you do, and tell me which sources it connected and that access is asked here again." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=prompt/receive/text value=lock
155
+ 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/examples/first-minute.json value=derived
156
+ 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/examples/lineage.json value=derived
157
+ 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/examples/sharing.json value=derived
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
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
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
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
107
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
108
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
109
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
@@ -115,6 +171,14 @@ bound-lock/1 about="Taken back from {place}: {said}" at=policy:head/claims/0.1.5
115
171
  bound-lock/1 about="The bytes the link names did not arrive from {source}: {place} owes them until they do, by this link or another channel." at=policy:head/link/0.1.5 by=target form=alphabet measure=id role=writes scope=said/link-owed value=lock
116
172
  bound-lock/1 about="The card of {place} is {card}, valid from this {from}: do acts there on it while nothing else lands." at=policy:head/card/0.1.4 by=target form=alphabet measure=id role=writes scope=said/card value=lock
117
173
  bound-lock/1 about="The card the last answer about the place ended with, or the one ask answers asked with card: an action on a place that moved since is refused, and nothing is done." at=policy:head/card/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/do/card value=string
174
+ bound-lock/1 about="The content reference has no holder location: {needs}. No bytes were fetched or authority admitted." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/reference-needs value=lock
175
+ bound-lock/1 about="The content reference is {link}. No holder location is declared; {document} is ready to publish. Inspecting the reference grants nothing." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/shared-unlinked value=lock
176
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/examples/first-minute.json role=demands scope=view/example-first-minute shape=docs/examples/first-minute.json value=text
177
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/examples/lineage.json role=demands scope=view/example-lineage shape=docs/examples/lineage.json value=text
178
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/examples/sharing.json role=demands scope=view/example-sharing shape=docs/examples/sharing.json value=text
179
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/first-minute.md role=demands scope=view/first-minute shape=docs/first-minute.md value=text
180
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/lineage.md role=demands scope=view/lineage shape=docs/lineage.md value=text
181
+ bound-lock/1 about="The declared documentation or executable example data, rendered by the existing pinned prose capsule." at=policy:head/documentation/0.2.0 by=target form=alphabet measure=id needs=docs/sharing.md role=demands scope=view/sharing shape=docs/sharing.md value=text
118
182
  bound-lock/1 about="The digest its sender sent apart from it, exactly as they sent it." at=policy:head/words/0.1.7-forbidden by=target form=alphabet measure=id role=writes scope=prompt/receive/digest value=string
119
183
  bound-lock/1 about="The digest plan answered for the lot." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/land/lot value=string
120
184
  bound-lock/1 about="The document's digest, sha256 and its hex: a document that hashes otherwise is refused, and a document that moved to another address is followed only when named by it; a package is received only by the digest its sender sent apart from it. Optional otherwise." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/connect/digest value=string
@@ -136,10 +200,10 @@ bound-lock/1 about="The folder of the place, absolute; without one, the first ro
136
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
137
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
138
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
139
- 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
140
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
141
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
142
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
206
+ bound-lock/1 about="The installed CLI starts and completes the six declared MCP client cells; the current native act retains its unchanged cost ceiling. Other door parity remains in the existing suite." at=policy:head/release-gates/0.2.0 by=target form=alphabet measure=id role=writes scope=release/category/cli value=release/cli-startup|cost/act
143
207
  bound-lock/1 about="The key whose cells are asked; without one, every open cell." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/card/key value=string
144
208
  bound-lock/1 about="The key {key} names is a signing key, and only head's signer reads it: this door was refused it by name before the keychain was asked, and nothing was read. The refusal is written in {place}." at=policy:head/docs/0.1.7-signing-key by=target form=alphabet measure=id role=writes scope=said/signing-key-refused value=lock
145
209
  bound-lock/1 about="The keychain keeps a root for a place named {name} already: name this one otherwise." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/place-taken value=lock
@@ -161,6 +225,7 @@ bound-lock/1 about="The operation, by the id the source offers it under." at=pol
161
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
162
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
163
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
164
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
165
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
166
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
@@ -168,9 +233,13 @@ bound-lock/1 about="The parameters of the operation, by name." at=policy:head/su
168
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
169
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
170
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
171
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
172
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
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
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
173
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
174
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
175
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
176
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
@@ -185,21 +254,24 @@ bound-lock/1 about="The way {source} proves access asks its host for {input}, wh
185
254
  bound-lock/1 about="The world compiled nothing {source} offers: nothing was pinned. A document that offers at least one operation pays it." at=policy:head/surface/0.1.1g by=target form=alphabet measure=id role=writes scope=said/nothing-offered value=lock
186
255
  bound-lock/1 about="The {origin} stated, carried by {carrier}: {said}. Nobody backed it." at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/claim-alone value=lock
187
256
  bound-lock/1 about="The {origin} stated, carried by {carrier}: {said}. The {backers} backed it." at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=said/claim-backed value=lock
257
+ bound-lock/1 about="There are no selected public place settings to share." at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-empty value=lock
188
258
  bound-lock/1 about="This client cannot ask you: sign these lines yourself in {place} with your key, then land them." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/sign-yourself value=lock
189
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
190
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
191
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
192
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
193
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
194
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
195
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
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
196
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
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
197
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
198
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=
199
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=
200
273
  bound-lock/1 about="What has head read and done in my place? List each read and each act, newest first, with when it happened." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/what-happened/text value=lock
201
274
  bound-lock/1 about="What is done: place founds one, admit lets another device in, land lands a lot ask planned, share packs a place, key makes this device's key, access proves access to a source, act calls an offer that is not a read, claim keeps what the person states as theirs, in their words, or takes it back." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/do/action value=string
202
- bound-lock/1 about="What is open for a key: each cell no reading has answered, its ceiling, its origins and the states it may take, in the order bound ranks them." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/card value=place|key
203
275
  bound-lock/1 about="What is open in the place, and the card do needs to act there." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/card value=boolean
204
276
  bound-lock/1 about="What it may sign there, as scopes joined by |; without it, what a member may." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/admit/coverage value=string
205
277
  bound-lock/1 about="What next: the next step my place names." at=policy:head/surface/0.1.4 by=target form=alphabet measure=id role=writes scope=prompt/what-next value=
@@ -220,6 +292,7 @@ bound-lock/1 about="Why head" at=policy:head/docs by=target form=alphabet measur
220
292
  bound-lock/1 about="With an operation and its parameters: what was retained of that read, as of when it was made, instead of a current answer. Nothing is called; the place must allow it." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=tool/look/history value=boolean
221
293
  bound-lock/1 about="With an operation and its parameters: what was retained of that read, as of when it was made, instead of a current answer. Nothing is called; the place must allow it." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/history value=boolean
222
294
  bound-lock/1 about="With an operation and its parameters: why its newest answer stands — who said it and when, its receipt digest, and the pins it rests on, read off the place's evidence and lines. Nothing is called." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=tool/look/why value=boolean
295
+ bound-lock/1 about="With card true, observe the exact configuration intent named by tool/card/preflight; it grants no API action." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/ask/preflight value=string
223
296
  bound-lock/1 about="With card: the key whose cells are asked; without one, every open cell." at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=tool/ask/key value=string
224
297
  bound-lock/1 about="You would have {operation} on {source} called, {call}, if you admit it for this call alone, your yes signed for it and nothing else. Yes?" at=policy:head/surface/0.1.6-suggest by=target form=alphabet measure=id role=writes scope=said/elicit-act value=lock
225
298
  bound-lock/1 about="You would have {sources} read in {place} until {until} if you admit it: no read asks again before then, writes still do. Yes?" at=policy:head/surface/0.1.6-suggest by=target form=alphabet measure=id role=writes scope=said/grant value=lock
@@ -279,7 +352,6 @@ bound-lock/1 about="a view is lines of text" at=policy:head/surface by=target fo
279
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
280
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
281
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
282
- 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
283
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
284
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
285
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
@@ -303,7 +375,6 @@ bound-lock/1 about="and reading it from an https address, by the mechanism bound
303
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
304
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
305
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
306
- 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
307
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
308
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
309
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
@@ -374,9 +445,9 @@ bound-lock/1 about="how to report a vulnerability, privately, what is in scope a
374
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
375
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
376
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
377
- 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/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/forge/native-reader-build/0.1.7 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/test shape=.github/workflows/test.yml value=lock
378
- 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/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 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/forge/0.1.7-shards by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/measure shape=.github/workflows/measure.yml value=lock
379
- 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.7\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/forge/0.2.7 by=target form=alphabet measure=text role=writes scope=prose/en/pipeline/release shape=.github/workflows/release.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
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
380
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
381
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
382
453
  bound-lock/1 about="no answer of head carries a secret: only public halves and lines leave" at=policy:head/ceilings by=target form=interval measure=count role=reads scope=surface/secrets-out value=0..0
@@ -398,10 +469,10 @@ bound-lock/1 about="plan again" at=policy:head/shape/0.1.2 by=target form=alphab
398
469
  bound-lock/1 about="plan, as a person reads it: at its own resolution" at=policy:head/surface/0.1.6-answered by=target form=alphabet measure=id role=writes scope=resolution/plan/person value=own
399
470
  bound-lock/1 about="questions the person answers before it: the place, the origin, reads — a new person and head 0.1.3 as published (the .mcpb of its release), Open-Meteo-s real document and API, on a client with forms and on one with none; harness baseline-013.mts" at=witness:baseline-013-open-meteo by=target form=interval measure=count role=writes scope=baseline/onboarding/questions value=3..3
400
471
  bound-lock/1 about="read/rate is spent for {source} this hour: nothing was called. The next hour pays it, or a wider read/rate the place's root signs." at=policy:head/words/0.1.7 by=target form=alphabet measure=id role=writes scope=said/rate value=lock
472
+ bound-lock/1 about="record-coverage for drafts or admission for signed Root configuration records. Other intents are not in the native card; default record-coverage." at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=tool/card/preflight value=string
401
473
  bound-lock/1 about="red: {coordinate} took {seconds} s, over {scope} {ceiling}." at=policy:head/surface by=target form=alphabet measure=id role=writes scope=said/red value=lock
402
474
  bound-lock/1 about="steps to the first real answer: install, connect, ask — a new person and head 0.1.3 as published (the .mcpb of its release), Open-Meteo-s real document and API, on a client with forms and on one with none; harness baseline-013.mts" at=witness:baseline-013-open-meteo by=target form=interval measure=count role=writes scope=baseline/onboarding/steps value=3..3
403
475
  bound-lock/1 about="structural numbers shown only where why is asked: a ledger epoch anywhere else is red" at=policy:head/numbers/0.1.5 by=target form=alphabet measure=id role=writes scope=numbers/structural/why value=epoch|pinned
404
- bound-lock/1 about="temporary: head-s own checks said as not in the card, until topos and bound publish the authority-card view that folds what a key may do (demand-authority-card.md)" at=policy:head/verbs/0.1.4 by=target form=alphabet measure=id role=writes scope=do/not-in-card/head value=not-covered|not-allowed|secret-unallowed|access-unstated
405
476
  bound-lock/1 about="the APIs head-s own lock names for a person to connect: none; head connects only what a person hands it, by the address of its document" at=policy:head/ceilings/0.1.4 by=target form=interval measure=count role=writes scope=first-minute/connects value=0..0
406
477
  bound-lock/1 about="the SDK head reads lines through, as published" at=policy:head/pins/topos/0.2.4 by=target form=alphabet measure=digest needs=node_modules/@lapxo/topos role=reads scope=dep/topos shape=package value=sha256:7aca161279d14bc0e054dcc281cd110aeb95be2e026b42fdf527a260e58b2aae
407
478
  bound-lock/1 about="the Secret Service of a Linux session, through libsecret-s secret-tool" at=policy:head/platform by=target form=alphabet measure=id role=writes scope=platform/linux/store value=secret-tool
@@ -473,8 +544,8 @@ bound-lock/1 about="the forms its values are read through (value read from Lapxo
473
544
  bound-lock/1 about="the heap a place's fold host is started with, Node's old-generation limit and not the process's whole memory" at=policy:head/host/0.1.7 by=target form=interval measure=mebibytes role=writes scope=bound/host/heap value=512..512
474
545
  bound-lock/1 about="the hosts head keeps keys on, each in its own secret store and opening its one-time page with its own opener; on any other host every call is refused by name" at=policy:head/platform by=target form=alphabet measure=id role=writes scope=platform/supported value=darwin|linux|win32
475
546
  bound-lock/1 about="the identity of a reading of a place, given without folding it, so what head folded before is kept under bound-s own identity and not a superset of it; until then head keys it by every file the place holds" at=policy:head/ahead/0.1.5 by=target form=alphabet measure=id role=demands scope=bound/reading-identity value=reading-identity@1
476
- bound-lock/1 about="the installed bound's identity, as bound computes it from the installed bytes with head's selection (export ./engine, entry dist/cli/verb.js): a place's fold host is started on this instrument alone, and refused by name on any other; said again at every repin, beside dep/bound, which pins the archive" at=policy:head/host/0.1.7 by=target form=alphabet measure=digest role=writes scope=dep/bound/installed value=sha256:679fc95589915f02640a30d1548420c26dd58ec956895b7a60a518b0a91353c3
477
- bound-lock/1 about="the instrument head runs, as published" at=policy:head/pins/0.2.7 by=target form=alphabet measure=digest needs=node_modules/@lapxo/bound role=reads scope=dep/bound shape=package value=sha256:9e8f8404995f600d307336c8fd33886de6a36bedb29a2b563256cef3b0e58c99
547
+ bound-lock/1 about="the installed bound's identity, as bound computes it from the installed bytes with head's selection (export ./engine, entry dist/cli/verb.js): a place's fold host is started on this instrument alone, and refused by name on any other; said again at every repin, beside dep/bound, which pins the archive" at=policy:head/bound-repin/0.2.8 by=target form=alphabet measure=digest role=writes scope=dep/bound/installed value=sha256:b097566fcb246614d9ebe55642c2b5b2f8f0ca81b073efc9edef76a1de075008
548
+ bound-lock/1 about="the instrument head runs, as published" at=policy:head/bound-repin/0.2.8 by=target form=alphabet measure=digest needs=node_modules/@lapxo/bound role=reads scope=dep/bound shape=package value=sha256:2d024747c2d2eca6b20c32e6dc7e963b0133caac36db3c380626482944ec0a1b
478
549
  bound-lock/1 about="the instrument head starts as a process for every fold, sign and land; nothing of it is imported" at=policy:project by=target form=alphabet measure=id role=writes scope=runs value=@lapxo/bound
479
550
  bound-lock/1 about="the key a place head founds is rooted in: made in the keychain under the place-s name, never a file, never the owner-s" at=policy:head/founding by=target form=alphabet measure=id role=writes scope=founding/root value=keys/root
480
551
  bound-lock/1 about="the keychain entry a source-s secret is kept under, one per place and source; a line names it, never holds it" at=policy:head/access by=target form=alphabet measure=id role=writes scope=access/account value=place/{place}/api/{source}
@@ -486,7 +557,6 @@ bound-lock/1 about="the ledger a place-s history is said to come from, named by
486
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
487
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
488
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
489
- 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" at=witness:signing-key-refused-by-every-door by=target form=interval measure=source-lines role=writes scope=source/lines value=0..2733
490
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
491
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
492
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
@@ -495,10 +565,8 @@ bound-lock/1 about="the lines of the ahead region, together, read by head-s suit
495
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
496
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
497
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
498
- 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
499
- 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" at=witness:signing-key-refused-by-every-door by=target form=interval measure=doors-lines role=writes scope=doors/lines value=0..201
500
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
501
- bound-lock/1 about="the lines of the links 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=links-lines role=writes scope=links/lines value=0..60
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
502
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
503
571
  bound-lock/1 about="the lines of the places region, together: split from the places that also connected, never raised" at=policy:head/ceilings by=target form=interval measure=places-lines role=reads scope=places/lines value=0..90
504
572
  bound-lock/1 about="the lines of the sources region, together: split from the places that also founded, never raised" at=policy:head/ceilings by=target form=interval measure=sources-lines role=reads scope=sources/lines value=0..150
@@ -523,7 +591,6 @@ bound-lock/1 about="the measure a source-s region names its document by, by dige
523
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
524
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
525
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
526
- 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
527
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
528
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
529
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
@@ -663,14 +730,16 @@ bound-lock/1 about="where a place keeps its own walk context, laid beside its lo
663
730
  bound-lock/1 about="where a place keeps the standing of each world it adopts, laid beside its lock as fetched and checked against the pin, so bound admits the pin on bytes the place holds: a folder named for what it holds" at=policy:head/vocabulary/0.2.0 by=target form=alphabet measure=id role=writes scope=place/worlds value=worlds
664
731
  bound-lock/1 about="where an agent's statement is kept: an at whose class says an agent is its origin; head's own key signs it, since an agent has no key of its own" at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=id role=writes scope=claim/agent/at value=origin:agent
665
732
  bound-lock/1 about="where an origin publishes the catalog of its documents (RFC 9727), read with nothing attached" at=policy:head/use/0.1.1g by=target form=alphabet measure=id role=writes scope=use/catalog value=/.well-known/api-catalog
666
- bound-lock/1 about="where the bound package head pins is fetched from, verified by its digest" at=policy:head/pins/0.2.7 by=target form=alphabet measure=id role=writes scope=sources/bound value=https://registry.npmjs.org/@lapxo/bound/-/bound-0.2.7.tgz
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
667
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
668
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
669
- 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
670
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
671
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/**
672
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
673
- bound-lock/1 about="{\n \"manifest_version\": \"0.3\",\n \"name\": \"head\",\n \"display_name\": \"head\",\n \"version\": \"0.1.7\",\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.1.7 by=target form=alphabet measure=text role=writes scope=prose/en/bundle/manifest shape=manifest.json value=lock
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
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
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
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
674
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
675
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
676
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
@@ -801,6 +870,12 @@ bound-lock/1 at=policy:head/access/0.1.4 by=target form=alphabet measure=id role
801
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
802
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
803
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
804
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="
805
880
  bound-lock/1 at=policy:head/authority by=target form=alphabet measure=class role=writes scope=keys/owner value=authorize
806
881
  bound-lock/1 at=policy:head/authority by=target form=alphabet measure=coverage role=writes scope=keys/owner value=*
@@ -858,6 +933,17 @@ bound-lock/1 at=policy:head/bound by=target form=alphabet measure=id role=writes
858
933
  bound-lock/1 at=policy:head/bound by=target form=alphabet measure=id role=writes scope=bound/view value=--as
859
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
860
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
861
947
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/host value=0..0
862
948
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/key value=0..0
863
949
  bound-lock/1 at=policy:head/ceilings by=target form=interval measure=count role=reads scope=literal/org value=0..0
@@ -882,6 +968,25 @@ bound-lock/1 at=policy:head/claims/0.1.7-agent by=target form=alphabet measure=i
882
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
883
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
884
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
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/**
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/**
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
980
+ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=bound/authority/unit value=milliseconds
981
+ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-card/next value=none
982
+ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-card/state value=done
983
+ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-needed/next value=none
984
+ bound-lock/1 at=policy:head/configuration-preflight/0.2.0 by=target form=alphabet measure=id role=writes scope=said/authority-needed/state value=open
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
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
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
885
990
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/digest-algorithms value=sha256
886
991
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/era value=era1
887
992
  bound-lock/1 at=policy:head/cryptography by=target form=alphabet measure=id role=reads scope=wire/signature-algorithms value=ed25519:era1
@@ -895,6 +1000,8 @@ bound-lock/1 at=policy:head/doors/0.1.7-http by=target form=alphabet measure=id
895
1000
  bound-lock/1 at=policy:head/doors/0.1.7-http by=target form=alphabet measure=id role=writes scope=said/door-origin/state value=refused
896
1001
  bound-lock/1 at=policy:head/doors/0.1.7-http by=target form=alphabet measure=id role=writes scope=said/door-unasked/state value=refused
897
1002
  bound-lock/1 at=policy:head/doors/0.1.7-lines by=target form=alphabet measure=id role=writes scope=said/door-unread/state value=refused
1003
+ bound-lock/1 at=policy:head/first-minute/0.2.0 by=target form=alphabet measure=coordinates role=reads scope=region/first-minute value=samples/first-minute/**
1004
+ bound-lock/1 at=policy:head/first-minute/0.2.0 by=target form=interval measure=defects needs=samples/first-minute/yes/ role=demands scope=first-minute/installed value=0..0
898
1005
  bound-lock/1 at=policy:head/forge by=target form=alphabet measure=id role=writes scope=dep/runtime-prose-render shape=dist/regions/text.js value=sha256:67c56505dc51e1f7c0e9926df43d0e05d19a158edd4b1be1db95666d0bac8951
899
1006
  bound-lock/1 at=policy:head/forge by=target form=alphabet measure=id role=writes scope=sources/prose-render value=https://github.com/Lapxo/topos/releases/download/v0.1.13/907115916d64425dd23305fc74d91ea937f933de4949fb0c4dc94fb1106bd33e
900
1007
  bound-lock/1 at=policy:head/forge by=target form=alphabet measure=id role=writes scope=sources/runtime-prose-render value=https://github.com/Lapxo/topos/releases/download/v0.1.13/67c56505dc51e1f7c0e9926df43d0e05d19a158edd4b1be1db95666d0bac8951
@@ -908,6 +1015,9 @@ bound-lock/1 at=policy:head/kept/0.1.5 by=target form=alphabet measure=id role=w
908
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
909
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
910
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
911
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
912
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
913
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
@@ -921,13 +1031,68 @@ bound-lock/1 at=policy:head/marks/0.1.5 by=target form=alphabet measure=id role=
921
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
922
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
923
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
924
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
925
1077
  bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/blocks value=integrity|pins|cli|surface
926
- bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/category/cli value=cli/**|cost/act
927
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
928
- bound-lock/1 at=policy:head/release by=target form=alphabet measure=id role=writes scope=release/category/pins value=resolve-by-url|offline|the-stranger
929
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
930
- bound-lock/1 at=policy:head/release/0.1.7 by=target form=alphabet measure=id role=writes scope=version value=0.1.7
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
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
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
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
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
931
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
932
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
933
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
@@ -1057,8 +1222,44 @@ bound-lock/1 at=policy:head/shape/0.1.6 by=target form=alphabet measure=id role=
1057
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
1058
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
1059
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
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/**
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/**
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:
1234
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-empty/next value=none
1235
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-empty/state value=open
1236
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-inspected/next value=none
1237
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-inspected/state value=done
1238
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-needs/next value=none
1239
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-needs/state value=open
1240
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-refused/next value=none
1241
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-refused/state value=refused
1242
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-shared/next value=none
1243
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/birth-shared/state value=done
1244
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/reference-needs/next value=none
1245
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=said/reference-needs/state value=open
1246
+ bound-lock/1 at=policy:head/share-inspect/0.2.0 by=target form=alphabet measure=id role=writes scope=share/birth-file value=birth.topos
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
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
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
1060
1258
  bound-lock/1 at=policy:head/signer by=target form=interval measure=bytes role=writes scope=signer/response-bytes value=1048576..1048576
1061
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
1062
1263
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/access/required value=source
1063
1264
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/ask/required value=source|operation
1064
1265
  bound-lock/1 at=policy:head/surface by=target form=alphabet measure=id role=writes scope=prompt/can/required value=source|operation|times
@@ -1149,6 +1350,7 @@ bound-lock/1 at=policy:head/vocabulary by=target form=alphabet measure=id role=w
1149
1350
  bound-lock/1 at=policy:head/walk by=target form=alphabet measure=id role=writes scope=birth/wire/walk/metadata-fields value=at|by|condition|epoch|form|measure|role|scope|sig|value
1150
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
1151
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
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/**
1152
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
1153
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
1154
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
@@ -1162,10 +1364,14 @@ bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads s
1162
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
1163
1365
  bound-lock/1 at=policy:head/wire by=target form=alphabet measure=id role=reads scope=wire/states value=absent|present|unread|withdraw
1164
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
1165
1373
  bound-lock/1 at=policy:head/worlds by=target form=alphabet measure=id role=writes scope=world/shape value=dist/index.js
1166
- 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
1167
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
1168
- 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
1169
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
1170
1376
  bound-lock/1 at=policy:project by=target form=alphabet measure=coordinates role=reads scope=region/checks value=test/**|vectors/**|samples/**
1171
1377
  bound-lock/1 at=policy:project by=target form=alphabet measure=coordinates role=reads scope=region/project value=package.json|LICENSE