@lapxo/bound 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,8 +5,8 @@
5
5
  Declare what must hold. Read what does. Keep the evidence
6
6
 
7
7
  ```bash
8
- npx @lapxo/bound@0.1.1 fold --as help
9
- npx @lapxo/bound@0.1.1 fold
8
+ npx @lapxo/bound@0.1.2 fold --as help
9
+ npx @lapxo/bound@0.1.2 fold
10
10
  ```
11
11
 
12
12
  ## How Bound reads a project
@@ -49,11 +49,11 @@ lot_dir="$(mktemp -d)"
49
49
  Have the selected view produce a proposal at `$lot_dir/proposal.bound`, or prepare the project's permitted lines there for review. Unsigned proposals use `by=target`, without a preassigned epoch or `sig`. Lots stay outside the repository; the committed bound files are only `TARGET.bound` and `receipts.bound`.
50
50
 
51
51
  ```sh
52
- npx @lapxo/bound@0.1.1 sign "$lot_dir/proposal.bound" \
52
+ npx @lapxo/bound@0.1.2 sign "$lot_dir/proposal.bound" \
53
53
  --key "$BOUND_KEY_ID" --key-file "$BOUND_KEY_FILE" \
54
54
  > "$lot_dir/signed.bound" &&
55
- npx @lapxo/bound@0.1.1 land "$lot_dir/signed.bound" &&
56
- npx @lapxo/bound@0.1.1 fold
55
+ npx @lapxo/bound@0.1.2 land "$lot_dir/signed.bound" &&
56
+ npx @lapxo/bound@0.1.2 fold
57
57
  ```
58
58
 
59
59
  `sign` assigns the admitted epoch and writes the signed lot to stdout. `land` validates the whole lot before admission. A refusal is evidence to inspect; it is not success. Do not proceed after a failed signature or admission. The key file is a PKCS8 private key matching the admitted public key; do not put it in the lot, source tree, package or CI artifacts.
package/TARGET.bound CHANGED
@@ -1,4 +1,4 @@
1
- bound-lock/1 about="# @lapxo/bound\n\nDeclare what must hold. Read what does. Keep the evidence.\n\nBound reads a project's admitted statements, checks observations against its requirements, and produces the views its selected topos declares. It keeps conflicting evidence and its origins instead of choosing a convenient answer.\n\n`fold` reads. `sign` signs a proposed lot. `land` admits that lot under the place's authority. These acts work across domains: a selected topos supplies forms, units, readers and views.\n\n## Start in an admitted project\n\n```sh\nnpx @lapxo/bound@0.1.1 fold --as help\nnpx @lapxo/bound@0.1.1 fold\n```\n\nThe help view prints:\n\n```text\nverbs fold land sign\nflags --as --check --key --key-file --signer --place\n```\n\nThe default fold runs the project's declared views. Its authority and selected topos determine what can be admitted, read and shown.\n\nStart with the team's accepted TARGET, admitted authority and selected readers. [Full usage guide](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md).\n\n## A meeting everyone can understand\n\nAna is available from 10 to 14, Luis from 12 to 16, and the room from 10 to 13. Their common availability is 12 to 13. A boss available from 18 to 20 makes the encounter incompatible. Withdrawing that exact reading restores the overlap; Ana, Luis and the room remain.\n\nWith an interval form, those are object operations: observe independent claims, meet them, withdraw by id, and read the state. A narrower compatible meet is not a fork. Folding a file of declarations alone does not calculate meeting availability.\n\nThe same pattern applies to a delivery window, a sensor's allowed range, or an agreed performance budget. The chosen topos determines the units and how evidence is obtained. Bound does not supply a meeting-specific rule.\n\n## See how information holds together\n\n![Cells, travelling bounds and a local join](https://raw.githubusercontent.com/Lapxo/bound/2053bb6d6188f04538114eae6a0add5166944ed3/docs/readme-assets/atlas.svg)\n\nA travelling ceiling on B reaches C and G through their declared rest. A local join widens B alone. D is independent. The figure shows those relations; point size and camera distance do not measure information.\n\n| State | Meaning |\n| --- | --- |\n| REQUIRED | Compatible bounds, fewer than two independent origins. |\n| FREE | Independent origins meet and their encounter fits the bounds. |\n| CONFLICT | Bounds conflict, or eligible claims have no common encounter. |\n| FORBIDDEN | An inhabited encounter does not fit the bounds. |\n\nBounds are checked before origins and claims. A receipt is evidence of a reading, not another origin. Duplicating one does not add freedom.\n\n## Change a project without erasing evidence\n\nWork in the project's directory. Use an existing admitted key identifier and its matching private key stored outside every repository. The admitted key also names its signer with `keys/<who> measure=signer value=file`; `signer/timeout` and `signer/response-bytes` declare its limits. Your public key and coverage belong to the authority contract; possession of a private key alone does not authorize a scope.\n\n```sh\nexport BOUND_KEY_ID='your-admitted-key-id'\nexport BOUND_KEY_FILE=\"$HOME/Private/keys/your-device.pem\"\nlot_dir=\"$(mktemp -d)\"\n```\n\nHave the selected view produce a proposal at `$lot_dir/proposal.bound`, or prepare the project's permitted lines there for review. Unsigned proposals use `by=target`, without a preassigned epoch or `sig`. Lots stay outside the repository; the committed bound files are only `TARGET.bound` and `receipts.bound`.\n\n```sh\nnpx @lapxo/bound@0.1.1 sign \"$lot_dir/proposal.bound\" \\\n --key \"$BOUND_KEY_ID\" --key-file \"$BOUND_KEY_FILE\" \\\n > \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.1 land \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.1 fold\n```\n\n`sign` assigns the admitted epoch and writes the signed lot to stdout. `land` validates the whole lot before admission. A refusal is evidence to inspect; it is not success. Do not proceed after a failed signature or admission. The key file is a PKCS8 private key matching the admitted public key; do not put it in the lot, source tree, package or CI artifacts.\n\nFor typed object withdrawals, `takes` names the exact claim or mark id. Removing a local join leaves the travelling sign live. For untyped configuration, use the wire's exact withdrawal selectors; do not combine withdrawal and replacement with identical selectors in one lot. Wire alphabet updates supersede by epoch.\n\n[Authority, withdrawals, receipts and PR review](docs/usage.md).\n\n## Read a declared view and reuse its evidence\n\nWhen the project has admitted a cells view:\n\n```sh\nnpx @lapxo/bound@0.1.1 fold --as cells\n```\n\nThe installed interval scene printed this on an unchanged second reading:\n\n```text\nRECEIPTS 4 read · 0 opened · idle · provider 0\n```\n\nNative receipts identify the live semantic inputs, declared rest, selected topos, codecs and selected rendering implementation. They exclude delivery count, display paths and Bound's error wrapper. A local join changes its own cell's receipt. A travelling sign changes dependent cells. Missing or corrupt carried bytes cannot prove reuse.\n\nFor judgement:\n\n```sh\nnpx @lapxo/bound@0.1.1 fold --check\n```\n\nKeep stdout, stderr and the exit status. `--check` is not an install-and-build replacement. A source test passing does not pay an unread ceiling, prove a cold clone, or accept a release.\n\n## Select a topos by what it declares\n\n`sources/<name>` says where a world can be obtained. An admitted `uses/<name>` names the digest of that topos's folded standing: canonical live claims in wire byte order, excluding signature envelopes and host shape. Re-signing the same standing preserves the pin. A changed live form, class, view or offer changes it.\n\n`restsOn` closes artifact bytes separately. A capsule is one offer. Forms, classes and views need no capsule merely to be selected. Runtime and packing do not define standing identity. npm dependency ranges remain package metadata; they are not standing pins.\n\n| Responsibility | Owner |\n| --- | --- |\n| Meet, state, live acts and rest | Obligations |\n| Wire, forms, classes, views and offer contracts | Topos |\n| Admission, folding and evidence | Bound |\n| Domain measurement and representation | Selected topos |\n| Storage, transport and execution | Host |\n\nCell `restsOn` is the object's relation. Directory prefixes and file summaries are host coordinates, not object rest. Wire tokens are protocol constants, not organization, host, path or key literals.\n\n## Repository rules\n\nCommit `TARGET.bound`, `receipts.bound` and the outputs the forge reads. Ignore `.bound/` from the first line of `.gitignore`. Keep proposals, signed lots, keys, ledgers, caches and dependency blobs outside the published tree.\n\nThe lock is the project's own contract and pins. Read a dependency's declarations from its selected standing; do not copy its lines into your lock. README, package metadata and workflows must be renders of admitted declarations. A scan is an observation, not permission to lower a ceiling.\n\nA PR proposes lines and the leaf changes they render. The judge uses the team's accepted contract independently of the proposed revision. Preserve refusals, conflicting origins and unpaid demands. [Repository and contribution rules](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md#repository-and-pr-review).\n\n## An atlas you can question\n\nInformation can share a history without sharing a single presentation. The same admitted cells can support a compact status view, a spatial view of their relations, or a focused reading of one disagreement. Each view asks for a region and resolution; its selected topos determines the representation.\n\nThis makes changes inspectable. A local act can remain local, travelling bounds can reach dependent cells, and a receipt can name the inputs of the reading you saw. You can ask what changed and what depends on it without turning a drawing into the algebra.\n\nA pin names standing, not a download URL or runtime entry. Its declared artifact dependencies close the bytes needed for an offered operation. The boundary lets a form or view remain meaningful even when it has no executable capsule.\n\nUse Bound where independently attributed observations must be judged against an accepted contract: compatibility between components, operational limits, or a team's project requirements. The selected topos must supply the actual measurements; a digest identifies the evidence without declaring it true.\n\n[Contribute a counterexample or a proposed lot](CONTRIBUTING.md).\n" at=policy:bound/011-signing-docs by=target form=alphabet measure=text role=writes scope=prose/en/files/public-0 shape=README.md value=lock
1
+ bound-lock/1 about="# @lapxo/bound\n\nDeclare what must hold. Read what does. Keep the evidence.\n\nBound reads a project's admitted statements, checks observations against its requirements, and produces the views its selected topos declares. It keeps conflicting evidence and its origins instead of choosing a convenient answer.\n\n`fold` reads. `sign` signs a proposed lot. `land` admits that lot under the place's authority. These acts work across domains: a selected topos supplies forms, units, readers and views.\n\n## Start in an admitted project\n\n```sh\nnpx @lapxo/bound@0.1.2 fold --as help\nnpx @lapxo/bound@0.1.2 fold\n```\n\nThe help view prints:\n\n```text\nverbs fold land sign\nflags --as --check --key --key-file --signer --place\n```\n\nThe default fold runs the project's declared views. Its authority and selected topos determine what can be admitted, read and shown.\n\nStart with the team's accepted TARGET, admitted authority and selected readers. [Full usage guide](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md).\n\n## A meeting everyone can understand\n\nAna is available from 10 to 14, Luis from 12 to 16, and the room from 10 to 13. Their common availability is 12 to 13. A boss available from 18 to 20 makes the encounter incompatible. Withdrawing that exact reading restores the overlap; Ana, Luis and the room remain.\n\nWith an interval form, those are object operations: observe independent claims, meet them, withdraw by id, and read the state. A narrower compatible meet is not a fork. Folding a file of declarations alone does not calculate meeting availability.\n\nThe same pattern applies to a delivery window, a sensor's allowed range, or an agreed performance budget. The chosen topos determines the units and how evidence is obtained. Bound does not supply a meeting-specific rule.\n\n## See how information holds together\n\n![Cells, travelling bounds and a local join](https://raw.githubusercontent.com/Lapxo/bound/2053bb6d6188f04538114eae6a0add5166944ed3/docs/readme-assets/atlas.svg)\n\nA travelling ceiling on B reaches C and G through their declared rest. A local join widens B alone. D is independent. The figure shows those relations; point size and camera distance do not measure information.\n\n| State | Meaning |\n| --- | --- |\n| REQUIRED | Compatible bounds, fewer than two independent origins. |\n| FREE | Independent origins meet and their encounter fits the bounds. |\n| CONFLICT | Bounds conflict, or eligible claims have no common encounter. |\n| FORBIDDEN | An inhabited encounter does not fit the bounds. |\n\nBounds are checked before origins and claims. A receipt is evidence of a reading, not another origin. Duplicating one does not add freedom.\n\n## Change a project without erasing evidence\n\nWork in the project's directory. Use an existing admitted key identifier and its matching private key stored outside every repository. The admitted key also names its signer with `keys/<who> measure=signer value=file`; `signer/timeout` and `signer/response-bytes` declare its limits. Your public key and coverage belong to the authority contract; possession of a private key alone does not authorize a scope.\n\n```sh\nexport BOUND_KEY_ID='your-admitted-key-id'\nexport BOUND_KEY_FILE=\"$HOME/Private/keys/your-device.pem\"\nlot_dir=\"$(mktemp -d)\"\n```\n\nHave the selected view produce a proposal at `$lot_dir/proposal.bound`, or prepare the project's permitted lines there for review. Unsigned proposals use `by=target`, without a preassigned epoch or `sig`. Lots stay outside the repository; the committed bound files are only `TARGET.bound` and `receipts.bound`.\n\n```sh\nnpx @lapxo/bound@0.1.2 sign \"$lot_dir/proposal.bound\" \\\n --key \"$BOUND_KEY_ID\" --key-file \"$BOUND_KEY_FILE\" \\\n > \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.2 land \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.2 fold\n```\n\n`sign` assigns the admitted epoch and writes the signed lot to stdout. `land` validates the whole lot before admission. A refusal is evidence to inspect; it is not success. Do not proceed after a failed signature or admission. The key file is a PKCS8 private key matching the admitted public key; do not put it in the lot, source tree, package or CI artifacts.\n\nFor typed object withdrawals, `takes` names the exact claim or mark id. Removing a local join leaves the travelling sign live. For untyped configuration, use the wire's exact withdrawal selectors; do not combine withdrawal and replacement with identical selectors in one lot. Wire alphabet updates supersede by epoch.\n\n[Authority, withdrawals, receipts and PR review](docs/usage.md).\n\n## Read a declared view and reuse its evidence\n\nWhen the project has admitted a cells view:\n\n```sh\nnpx @lapxo/bound@0.1.2 fold --as cells\n```\n\nThe installed interval scene printed this on an unchanged second reading:\n\n```text\nRECEIPTS 4 read · 0 opened · idle · provider 0\n```\n\nNative receipts identify the live semantic inputs, declared rest, selected topos, codecs and selected rendering implementation. They exclude delivery count, display paths and Bound's error wrapper. A local join changes its own cell's receipt. A travelling sign changes dependent cells. Missing or corrupt carried bytes cannot prove reuse.\n\nFor judgement:\n\n```sh\nnpx @lapxo/bound@0.1.2 fold --check\n```\n\nKeep stdout, stderr and the exit status. `--check` is not an install-and-build replacement. A source test passing does not pay an unread ceiling, prove a cold clone, or accept a release.\n\n## Select a topos by what it declares\n\n`sources/<name>` says where a world can be obtained. An admitted `uses/<name>` names the digest of that topos's folded standing: canonical live claims in wire byte order, excluding signature envelopes and host shape. Re-signing the same standing preserves the pin. A changed live form, class, view or offer changes it.\n\n`restsOn` closes artifact bytes separately. A capsule is one offer. Forms, classes and views need no capsule merely to be selected. Runtime and packing do not define standing identity. npm dependency ranges remain package metadata; they are not standing pins.\n\n| Responsibility | Owner |\n| --- | --- |\n| Meet, state, live acts and rest | Obligations |\n| Wire, forms, classes, views and offer contracts | Topos |\n| Admission, folding and evidence | Bound |\n| Domain measurement and representation | Selected topos |\n| Storage, transport and execution | Host |\n\nCell `restsOn` is the object's relation. Directory prefixes and file summaries are host coordinates, not object rest. Wire tokens are protocol constants, not organization, host, path or key literals.\n\n## Repository rules\n\nCommit `TARGET.bound`, `receipts.bound` and the outputs the forge reads. Ignore `.bound/` from the first line of `.gitignore`. Keep proposals, signed lots, keys, ledgers, caches and dependency blobs outside the published tree.\n\nThe lock is the project's own contract and pins. Read a dependency's declarations from its selected standing; do not copy its lines into your lock. README, package metadata and workflows must be renders of admitted declarations. A scan is an observation, not permission to lower a ceiling.\n\nA PR proposes lines and the leaf changes they render. The judge uses the team's accepted contract independently of the proposed revision. Preserve refusals, conflicting origins and unpaid demands. [Repository and contribution rules](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md#repository-and-pr-review).\n\n## An atlas you can question\n\nInformation can share a history without sharing a single presentation. The same admitted cells can support a compact status view, a spatial view of their relations, or a focused reading of one disagreement. Each view asks for a region and resolution; its selected topos determines the representation.\n\nThis makes changes inspectable. A local act can remain local, travelling bounds can reach dependent cells, and a receipt can name the inputs of the reading you saw. You can ask what changed and what depends on it without turning a drawing into the algebra.\n\nA pin names standing, not a download URL or runtime entry. Its declared artifact dependencies close the bytes needed for an offered operation. The boundary lets a form or view remain meaningful even when it has no executable capsule.\n\nUse Bound where independently attributed observations must be judged against an accepted contract: compatibility between components, operational limits, or a team's project requirements. The selected topos must supply the actual measurements; a digest identifies the evidence without declaring it true.\n\n[Contribute a counterexample or a proposed lot](CONTRIBUTING.md).\n" at=witness:bound/012-cold-closure by=target form=alphabet measure=text role=writes scope=prose/en/files/public-0 shape=README.md value=lock
2
2
  bound-lock/1 about="# Contributing to Bound\n\nBring a counterexample, an observation or a proposed lot. Include the inputs and the output that led you to it. A signature establishes who was authorized to speak; it does not make their result true.\n\n## Set up a working copy\n\nClone the repository and use the Node version supported by package.json. If package-lock.json is present, run npm ci; otherwise use npm install --ignore-scripts --no-package-lock. Then run:\n\n```sh\nnpm run build\nnpm test\n```\n\nThese are development checks, not project acceptance. For a place with admitted trust context and native receipts, run the product judgement as well:\n\n```sh\nnpx @lapxo/bound@0.1.0 fold --check\n```\n\nPreserve a refusal and its exit status in your report. Do not borrow a neighbouring checkout's ledger or substitute local bytes for a named pin.\n\n## Make the smallest useful change\n\nBound owns admission, folding and evidence. Topos owns grammar, forms, classes, views and their contracts. A selected topos owns domain measurement. Obligations owns the algebra. Keep each change in its layer; do not put a domain decoder, path-based inference or a fallback for a missing pin into Bound.\n\nAn algebra change needs an independent oracle and a counterexample. A host change needs evidence for authentic bytes, failure propagation or reuse. A view change needs its declared region and implementation identity. A test should fail for a plausible incorrect implementation, not assert a source string or repeat the same expression on both sides.\n\nKeep regressions for changed signatures, unauthorized coverage, exact-id withdrawal, conflicting evidence, local versus travelling acts, corrupt content and duplicate delivery. Consolidate repeated setup and duplicate scenarios without removing distinct falsifiers.\n\n## Propose and admit\n\nKeep proposal and signed-lot files outside the repository. Use the current admitted wire, by=target, and no preassigned epoch or signature. The team's admitted key signs the lot; Bound admits it under scope coverage. The [usage guide](docs/usage.md) explains the transaction and external key-file requirements.\n\nSend the proposed lines with the leaf changes they render. A hand-edited render is evidence of the intended change, not an admitted contribution. Do not edit the accepted TARGET to make a test or ceiling pass. If a render disagrees with the lock, fix the proposed lines and re-render it.\n\nCommit only the project's TARGET.bound and native receipts.bound as bound files. The first .gitignore line excludes .bound/. Do not commit keys, stores, ledgers, caches, capsules, archives or vendored dependencies.\n\n## Submit a pull request\n\nExplain the concrete behavior before and after the change, the affected layer, and the checks you ran. Include stdout, stderr and exit status for a CLI case. State which reader and input bytes produced the evidence; a source harness is not an installed-package proof.\n\nPolicy changes receive explicit team review separately from measurements of the proposed source. Keep incompatible readings and their origins visible. Never remove a failing test or weaken a ceiling to obtain acceptance. Withdraw statements through their admitted history; do not rewrite prior signatures, tags or releases.\n\nDocumentation and workflows follow the same review: propose their lines and include the rendered changes.\n" at=policy:public-prose by=target form=alphabet measure=text role=writes scope=prose/en/files/public-1 shape=CONTRIBUTING.md value=lock
3
3
  bound-lock/1 about="# Using Bound\n\nThis guide covers the current CLI in a place whose wire and authority are already admitted. A fresh unsigned TARGET is a proposal, not a trusted project. The prepared repository is not yet a certified empty-clone bootstrap.\n\n## Before the first fold\n\nYou need the team's accepted TARGET and trust context, authentic bytes for each selected digest, and the readers/views that TARGET names. Do not borrow a neighbouring repository's ledger or copy node_modules to make a missing pin look available.\n\nThe published repository carries exactly TARGET.bound and receipts.bound as bound files. Local admission history lives in the ignored .bound/ store. Published standing excludes the signature envelope; owner public keys retain their signatures.\n\nStart by asking for help and folding the project. If a selected view is unavailable, use the named refusal and its fix; do not invent an output with a similar name.\n\n## Keys and coverage\n\nUse a named key already admitted by the project. The authority contract declares its public key, class and scope coverage. Signing uses a declared port. The lock names `keys/<who> measure=signer value=<name>`; `signer/timeout` and `signer/response-bytes` bound each invocation. The built-in `file` port reads a matching PKCS8 PEM outside the repository through `--key-file`. For a command port, the host supplies a `BOUND_SIGNERS` registry mapping that admitted name to `{ \"kind\": \"command\", \"executable\": \"...\", \"args\": [] }`. A repository declaration cannot authorize a program. `--signer <name>` must match the admitted selection.\n\nA new device must have its public key and coverage admitted by an authority that already covers the intended scope. The CLI does not currently certify silent key creation or tap-to-sign. This guide does not substitute a self-authorized fixture key for the team's authority.\n\nFor automation through the file port, supply the private key through the runner's secret storage to a temporary external file with restricted permissions. A command signer receives the lot once as canonical signed bytes, one line per record in order. It returns one canonical wire response per record, containing `by` and `sig`, in that same order. Bound verifies the entire reply against the admitted public key before any admission. Timeout, nonzero exit, missing or invalid replies refuse the whole lot; raw signer output is not logged. Hosts can keep private keys outside Bound through this port. Key generation, storage and rotation belong to the host. Do not print, commit or upload it. A source-control token and a Bound authority key have different purposes. Key rotation and revocation are changes to the admitted authority contract, not edits that erase prior signatures.\n\n## Proposal → signature → admission → reading\n\nPrepare the proposed lines outside the repository. Each line must use the current wire's fields, forms and required set. Configuration retains its legacy required fields, including `at`. Typed cells, claims and marks use their exact row grammar; `role=reads` or `at` cannot repair an incomplete typed record.\n\nA proposal names `by=target` and omits epoch/signature. The CLI assigns epoch from admitted history when signing. Never copy an epoch from an example or change a signed line's body.\n\nUse the signing and admission transaction in the README. Shell `&&` prevents a failed sign from being followed by land. Successful signing alone does not mean admission. Successful admission alone does not mean every requirement is paid. Fold after land and inspect its states, receipts and exit status.\n\nCLI sign authenticates wire inscriptions. It is different from the object's travelling ceiling sign. The selected Topos decodes spans and supplies origin/witness context; Bound must not guess those from by, widens or a path.\n\n## Reading and withdrawing\n\nAsk only for a view admitted by the project, such as cells. A local join widens that cell with a witness; it leaves the travelling ceiling live. A travelling require supplies a floor. Claims carry distinct origins; their signatures do not by themselves establish independent origins.\n\nFor typed histories, a negative record names the exact id in takes. Withdrawing a claim removes that live observation; withdrawing a join removes that local widening, not the sign. A fresh claim with the same content is a new identity, not resurrection of a withdrawn id. Re-delivery of the same signed bytes is idempotent.\n\nFor configuration, the negative line preserves the exact non-envelope selectors and changes value to withdraw. Do not withdraw and replace identical selectors in the same batch. Use a new epoch when superseding an alphabet declaration. Never withdraw evidence merely to obtain a green verdict.\n\n## Receipts and refusals\n\nreceipts.bound is native fold output. Do not write it by hand, use JSON from a test as a receipt, or copy receipts from another tree. Unchanged inputs can reuse verified region receipts; missing bytes require recomputation or a refusal. A duplicate receipt does not create another origin.\n\nREFUSE·wire means the current grammar does not admit the record. REFUSE·pin/release means named authentic content or its closure is unavailable or does not match. REFUSE·view means the requested view cannot be rendered under its contract. Authority refusal means the signer is not covered. Keep the line and the failed exit status; follow an explicit fix without changing the named digest or dropping a conflicting statement.\n\nrelease/blocks is policy read by the fold. Its admitted category links select existing obligations. The fold prints each missing reading or crossed ceiling as BLOCK; a blocked or incomplete policy is not READY. Read the captured verdict for the exact candidate instead of inferring acceptance from a successful render.\n\n## Repository and PR review\n\nThe accepted TARGET is independent of a contributor's scan. Commit native receipts and admitted renders, not local .bound/ state. A page disagreeing with TARGET must be re-rendered; a ceiling is not lowered to fit the page.\n\nA contribution is a proposed lot with the leaf changes rendered from it. Send that lot for admission by the team's coverage. Do not submit hand-edited lock output as already accepted. Check secrets, extra bound files, foreign vendoring and uncaptured page claims before review.\n\nA review includes the product fold, meaningful suites and verification of the rendered bytes. Preserve their actual output and exit status.\n" at=policy:bound/011-signing-docs by=target form=alphabet measure=text role=writes scope=prose/en/files/public-2 shape=docs/usage.md value=lock
4
4
  bound-lock/1 about=", & " at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/cite/and value=lock
@@ -14,7 +14,7 @@ bound-lock/1 about="A place selects its own worlds by standing digest; selection
14
14
  bound-lock/1 about="A second independent reader must agree. The fold rebuilds from the files alone, offline." at=witness:project-coordinates-are-relative by=target form=alphabet kind=axiom measure=status needs=samples/yes/verify-agrees.json|samples/no/verify-agrees.json role=demands scope=law/verify-agrees value=present
15
15
  bound-lock/1 about="Bind a package release with the pipeline views. Bind a page to its receipts with view/readme. Refuse a dependency drift with dep pins. Ask a second head that must agree." at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/learn value=present
16
16
  bound-lock/1 about="Bound is the application of that algebra: signed bounds, folded by one meet, refused when they fork." at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/paper value=present
17
- bound-lock/1 about="Bound reads a project's admitted statements and observations through its selected Topos, then renders the declared views and records their inputs in receipts. The example below explains the object; a file-fold alone does not calculate its intervals.\n\n## A meeting everyone can understand\n\nAna is available from 10 to 14, Luis from 12 to 16, and the room from 10 to 13. Their common availability is 12 to 13. A boss available from 18 to 20 makes the encounter incompatible. Withdrawing that exact reading restores the overlap; Ana, Luis and the room remain.\n\nWith an interval form, those are object operations: observe independent claims, meet them, withdraw by id, and read the state. A narrower compatible meet is not a fork. Folding a file of declarations alone does not calculate meeting availability.\n\nThe same pattern applies to a delivery window, a sensor's allowed range, or an agreed performance budget. The chosen topos determines the units and how evidence is obtained. Bound does not supply a meeting-specific rule.\n\n## See how information holds together\n\n![Cells, travelling bounds and a local join](https://raw.githubusercontent.com/Lapxo/bound/2053bb6d6188f04538114eae6a0add5166944ed3/docs/readme-assets/atlas.svg)\n\nA travelling ceiling on B reaches C and G through their declared rest. A local join widens B alone. D is independent. The figure shows those relations; point size and camera distance do not measure information.\n\n| State | Meaning |\n| --- | --- |\n| REQUIRED | Compatible bounds, fewer than two independent origins. |\n| FREE | Independent origins meet and their encounter fits the bounds. |\n| CONFLICT | Bounds conflict, or eligible claims have no common encounter. |\n| FORBIDDEN | An inhabited encounter does not fit the bounds. |\n\nBounds are checked before origins and claims. A receipt is evidence of a reading, not another origin. Duplicating one does not add freedom.\n\n## Change a project without erasing evidence\n\nWork in the project's directory. Use an existing admitted key identifier and its matching private key stored outside every repository. The admitted key also names its signer with `keys/<who> measure=signer value=file`; `signer/timeout` and `signer/response-bytes` declare its limits. Your public key and coverage belong to the authority contract; possession of a private key alone does not authorize a scope.\n\n```sh\nexport BOUND_KEY_ID='your-admitted-key-id'\nexport BOUND_KEY_FILE=\"$HOME/Private/keys/your-device.pem\"\nlot_dir=\"$(mktemp -d)\"\n```\n\nHave the selected view produce a proposal at `$lot_dir/proposal.bound`, or prepare the project's permitted lines there for review. Unsigned proposals use `by=target`, without a preassigned epoch or `sig`. Lots stay outside the repository; the committed bound files are only `TARGET.bound` and `receipts.bound`.\n\n```sh\nnpx @lapxo/bound@0.1.1 sign \"$lot_dir/proposal.bound\" \\\n --key \"$BOUND_KEY_ID\" --key-file \"$BOUND_KEY_FILE\" \\\n > \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.1 land \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.1 fold\n```\n\n`sign` assigns the admitted epoch and writes the signed lot to stdout. `land` validates the whole lot before admission. A refusal is evidence to inspect; it is not success. Do not proceed after a failed signature or admission. The key file is a PKCS8 private key matching the admitted public key; do not put it in the lot, source tree, package or CI artifacts.\n\nFor typed object withdrawals, `takes` names the exact claim or mark id. Removing a local join leaves the travelling sign live. For untyped configuration, use the wire's exact withdrawal selectors; do not combine withdrawal and replacement with identical selectors in one lot. Wire alphabet updates supersede by epoch.\n\n[Authority, withdrawals, receipts and PR review](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md).\n\n## Select a topos by what it declares\n\n`sources/<name>` says where a world can be obtained. An admitted `uses/<name>` names the digest of that topos's folded standing: canonical live claims in wire byte order, excluding signature envelopes and host shape. Re-signing the same standing preserves the pin. A changed live form, class, view or offer changes it.\n\n`restsOn` closes artifact bytes separately. A capsule is one offer. Forms, classes and views need no capsule merely to be selected. Runtime and packing do not define standing identity. npm dependency ranges remain package metadata; they are not standing pins.\n\n| Responsibility | Owner |\n| --- | --- |\n| Meet, state, live acts and rest | Obligations |\n| Wire, forms, classes, views and offer contracts | Topos |\n| Admission, folding and evidence | Bound |\n| Domain measurement and representation | Selected topos |\n| Storage, transport and execution | Host |\n\nCell `restsOn` is the object's relation. Directory prefixes and file summaries are host coordinates, not object rest. Wire tokens are protocol constants, not organization, host, path or key literals.\n\n## Repository rules\n\nCommit `TARGET.bound`, `receipts.bound` and the outputs the forge reads. Ignore `.bound/` from the first line of `.gitignore`. Keep proposals, signed lots, keys, ledgers, caches and dependency blobs outside the published tree.\n\nThe lock is the project's own contract and pins. Read a dependency's declarations from its selected standing; do not copy its lines into your lock. README, package metadata and workflows must be renders of admitted declarations. A scan is an observation, not permission to lower a ceiling.\n\nA PR proposes lines and the leaf changes they render. The judge uses the team's accepted contract independently of the proposed revision. Preserve refusals, conflicting origins and unpaid demands. [Repository and contribution rules](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md#repository-and-pr-review).\n\n## An atlas you can question\n\nInformation can share a history without sharing a single presentation. The same admitted cells can support a compact status view, a spatial view of their relations, or a focused reading of one disagreement. Each view asks for a region and resolution; its selected topos determines the representation.\n\nThis makes changes inspectable. A local act can remain local, travelling bounds can reach dependent cells, and a receipt can name the inputs of the reading you saw. You can ask what changed and what depends on it without turning a drawing into the algebra.\n\nA pin names standing, not a download URL or runtime entry. Its declared artifact dependencies close the bytes needed for an offered operation. The boundary lets a form or view remain meaningful even when it has no executable capsule.\n\nUse Bound where independently attributed observations must be judged against an accepted contract: compatibility between components, operational limits, or a team's project requirements. The selected topos must supply the actual measurements; a digest identifies the evidence without declaring it true.\n\n[Contribute a counterexample or a proposed lot](CONTRIBUTING.md)." at=policy:bound/011-signing-docs by=target form=alphabet measure=text role=writes scope=prose/en/idea value=present
17
+ bound-lock/1 about="Bound reads a project's admitted statements and observations through its selected Topos, then renders the declared views and records their inputs in receipts. The example below explains the object; a file-fold alone does not calculate its intervals.\n\n## A meeting everyone can understand\n\nAna is available from 10 to 14, Luis from 12 to 16, and the room from 10 to 13. Their common availability is 12 to 13. A boss available from 18 to 20 makes the encounter incompatible. Withdrawing that exact reading restores the overlap; Ana, Luis and the room remain.\n\nWith an interval form, those are object operations: observe independent claims, meet them, withdraw by id, and read the state. A narrower compatible meet is not a fork. Folding a file of declarations alone does not calculate meeting availability.\n\nThe same pattern applies to a delivery window, a sensor's allowed range, or an agreed performance budget. The chosen topos determines the units and how evidence is obtained. Bound does not supply a meeting-specific rule.\n\n## See how information holds together\n\n![Cells, travelling bounds and a local join](https://raw.githubusercontent.com/Lapxo/bound/2053bb6d6188f04538114eae6a0add5166944ed3/docs/readme-assets/atlas.svg)\n\nA travelling ceiling on B reaches C and G through their declared rest. A local join widens B alone. D is independent. The figure shows those relations; point size and camera distance do not measure information.\n\n| State | Meaning |\n| --- | --- |\n| REQUIRED | Compatible bounds, fewer than two independent origins. |\n| FREE | Independent origins meet and their encounter fits the bounds. |\n| CONFLICT | Bounds conflict, or eligible claims have no common encounter. |\n| FORBIDDEN | An inhabited encounter does not fit the bounds. |\n\nBounds are checked before origins and claims. A receipt is evidence of a reading, not another origin. Duplicating one does not add freedom.\n\n## Change a project without erasing evidence\n\nWork in the project's directory. Use an existing admitted key identifier and its matching private key stored outside every repository. The admitted key also names its signer with `keys/<who> measure=signer value=file`; `signer/timeout` and `signer/response-bytes` declare its limits. Your public key and coverage belong to the authority contract; possession of a private key alone does not authorize a scope.\n\n```sh\nexport BOUND_KEY_ID='your-admitted-key-id'\nexport BOUND_KEY_FILE=\"$HOME/Private/keys/your-device.pem\"\nlot_dir=\"$(mktemp -d)\"\n```\n\nHave the selected view produce a proposal at `$lot_dir/proposal.bound`, or prepare the project's permitted lines there for review. Unsigned proposals use `by=target`, without a preassigned epoch or `sig`. Lots stay outside the repository; the committed bound files are only `TARGET.bound` and `receipts.bound`.\n\n```sh\nnpx @lapxo/bound@0.1.2 sign \"$lot_dir/proposal.bound\" \\\n --key \"$BOUND_KEY_ID\" --key-file \"$BOUND_KEY_FILE\" \\\n > \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.2 land \"$lot_dir/signed.bound\" &&\nnpx @lapxo/bound@0.1.2 fold\n```\n\n`sign` assigns the admitted epoch and writes the signed lot to stdout. `land` validates the whole lot before admission. A refusal is evidence to inspect; it is not success. Do not proceed after a failed signature or admission. The key file is a PKCS8 private key matching the admitted public key; do not put it in the lot, source tree, package or CI artifacts.\n\nFor typed object withdrawals, `takes` names the exact claim or mark id. Removing a local join leaves the travelling sign live. For untyped configuration, use the wire's exact withdrawal selectors; do not combine withdrawal and replacement with identical selectors in one lot. Wire alphabet updates supersede by epoch.\n\n[Authority, withdrawals, receipts and PR review](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md).\n\n## Select a topos by what it declares\n\n`sources/<name>` says where a world can be obtained. An admitted `uses/<name>` names the digest of that topos's folded standing: canonical live claims in wire byte order, excluding signature envelopes and host shape. Re-signing the same standing preserves the pin. A changed live form, class, view or offer changes it.\n\n`restsOn` closes artifact bytes separately. A capsule is one offer. Forms, classes and views need no capsule merely to be selected. Runtime and packing do not define standing identity. npm dependency ranges remain package metadata; they are not standing pins.\n\n| Responsibility | Owner |\n| --- | --- |\n| Meet, state, live acts and rest | Obligations |\n| Wire, forms, classes, views and offer contracts | Topos |\n| Admission, folding and evidence | Bound |\n| Domain measurement and representation | Selected topos |\n| Storage, transport and execution | Host |\n\nCell `restsOn` is the object's relation. Directory prefixes and file summaries are host coordinates, not object rest. Wire tokens are protocol constants, not organization, host, path or key literals.\n\n## Repository rules\n\nCommit `TARGET.bound`, `receipts.bound` and the outputs the forge reads. Ignore `.bound/` from the first line of `.gitignore`. Keep proposals, signed lots, keys, ledgers, caches and dependency blobs outside the published tree.\n\nThe lock is the project's own contract and pins. Read a dependency's declarations from its selected standing; do not copy its lines into your lock. README, package metadata and workflows must be renders of admitted declarations. A scan is an observation, not permission to lower a ceiling.\n\nA PR proposes lines and the leaf changes they render. The judge uses the team's accepted contract independently of the proposed revision. Preserve refusals, conflicting origins and unpaid demands. [Repository and contribution rules](https://github.com/Lapxo/bound/blob/2053bb6d6188f04538114eae6a0add5166944ed3/docs/usage.md#repository-and-pr-review).\n\n## An atlas you can question\n\nInformation can share a history without sharing a single presentation. The same admitted cells can support a compact status view, a spatial view of their relations, or a focused reading of one disagreement. Each view asks for a region and resolution; its selected topos determines the representation.\n\nThis makes changes inspectable. A local act can remain local, travelling bounds can reach dependent cells, and a receipt can name the inputs of the reading you saw. You can ask what changed and what depends on it without turning a drawing into the algebra.\n\nA pin names standing, not a download URL or runtime entry. Its declared artifact dependencies close the bytes needed for an offered operation. The boundary lets a form or view remain meaningful even when it has no executable capsule.\n\nUse Bound where independently attributed observations must be judged against an accepted contract: compatibility between components, operational limits, or a team's project requirements. The selected topos must supply the actual measurements; a digest identifies the evidence without declaring it true.\n\n[Contribute a counterexample or a proposed lot](CONTRIBUTING.md)." at=witness:bound/012-cold-closure by=target form=alphabet measure=text role=writes scope=prose/en/idea value=present
18
18
  bound-lock/1 about="Cite it as {name}." at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/cff/name value=lock
19
19
  bound-lock/1 about="Cite it by the paper it rests on, Two-Sided Constraints on a Valued Lattice." at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/cff/paper value=lock
20
20
  bound-lock/1 about="Declare what must hold. Read what does. Keep the evidence." at=policy:bound/historical-prose by=target form=alphabet measure=text role=writes scope=docs/tagline value=present
@@ -118,7 +118,7 @@ bound-lock/1 about="lines, not a page: blobs, laid snapshots and answer caches n
118
118
  bound-lock/1 about="name: release\non:\n workflow_run:\n workflows: [tag]\n types: [completed]\n push:\n tags: ['v*']\njobs:\n release:\n if: github.event_name == 'push' || (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.version.outputs.tag }}\n asset: ${{ steps.archive.outputs.asset }}\n sha256: ${{ steps.archive.outputs.sha256 }}\n steps:\n - uses: actions/checkout@v4\n with:\n ref: ${{ github.event.workflow_run.head_sha || github.sha }}\n fetch-depth: 0\n - id: version\n env:\n EVENT_NAME: ${{ github.event_name }}\n REF_NAME: ${{ github.ref_name }}\n run: |\n version=\"v$(node -p \"require('./package.json').version\")\"\n if [ \"$EVENT_NAME\" = push ]; then\n test \"$REF_NAME\" = \"$version\"\n fi\n git rev-parse --verify \"refs/tags/$version\"\n echo \"tag=$version\" >> \"$GITHUB_OUTPUT\"\n git checkout --detach \"$version\"\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm ci\n - run: npm run build\n - run: npm test\n - run: node dist/cli/verb.js fold --check\n - id: archive\n env:\n GH_TOKEN: ${{ github.token }}\n run: |\n version=\"${{ steps.version.outputs.tag }}\"\n asset=\"$(npm pack --ignore-scripts --silent)\"\n echo \"asset=$asset\" >> \"$GITHUB_OUTPUT\"\n expected=\"$(sha256sum \"$asset\" | cut -d ' ' -f 1)\"\n echo \"sha256=$expected\" >> \"$GITHUB_OUTPUT\"\n if ! gh release view \"$version\" >/dev/null 2>&1; then\n gh release create \"$version\" \"$asset\" --title \"$version\" --notes \"$(git log -1 --format=%B)\"\n fi\n download_dir=\"$(mktemp -d)\"\n gh release download \"$version\" --pattern \"$asset\" --dir \"$download_dir\"\n actual=\"$(sha256sum \"$download_dir/$asset\" | cut -d ' ' -f 1)\"\n test \"$expected\" = \"$actual\"\n publish:\n needs: release\n environment: release\n runs-on: ubuntu-latest\n permissions:\n contents: read\n id-token: write\n steps:\n - uses: actions/checkout@v4\n with:\n ref: ${{ needs.release.outputs.tag }}\n - uses: actions/setup-node@v4\n with:\n node-version: 24\n - run: npm install --global npm@'12.1.0'\n - env:\n GH_TOKEN: ${{ github.token }}\n TAG: ${{ needs.release.outputs.tag }}\n ASSET: ${{ needs.release.outputs.asset }}\n EXPECTED: ${{ needs.release.outputs.sha256 }}\n run: |\n mkdir candidate\n gh release download \"$TAG\" --pattern \"$ASSET\" --dir candidate\n actual=\"$(sha256sum \"candidate/$ASSET\" | cut -d ' ' -f 1)\"\n test \"$EXPECTED\" = \"$actual\"\n npm stage publish \"./candidate/$ASSET\" --access public --ignore-scripts\n" at=policy:bound/011-port-release by=target form=alphabet measure=text role=writes scope=prose/en/files/workflow/release shape=.github/workflows/release.yml value=lock
119
119
  bound-lock/1 about="name: tag\non:\n workflow_run:\n workflows: [test]\n types: [completed]\njobs:\n tag:\n if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'push' && github.event.workflow_run.head_branch == 'main'\n runs-on: ubuntu-latest\n permissions:\n contents: write\n steps:\n - uses: actions/checkout@v4\n with:\n ref: ${{ github.event.workflow_run.head_sha }}\n fetch-depth: 0\n - run: |\n version=\"v$(node -p \"require('./package.json').version\")\"\n git tag --list \"$version\" | grep -q . && exit 0\n git tag \"$version\" && git push origin \"$version\"\n" at=policy:bound/pipeline by=target form=alphabet measure=text role=writes scope=prose/en/files/workflow/tag shape=.github/workflows/tag.yml value=lock
120
120
  bound-lock/1 about="name: test\non:\n push:\n branches: [main]\n pull_request:\njobs:\n test:\n strategy:\n fail-fast: false\n matrix:\n node: [22, 24]\n runs-on: ubuntu-latest\n permissions:\n contents: read\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-node@v4\n with:\n node-version: ${{ matrix.node }}\n - run: npm ci\n - run: npm run build\n - run: npm test\n - name: Verify native closure and receipt reuse\n run: |\n node dist/cli/verb.js fold --check > \"$RUNNER_TEMP/bound-check.log\" 2>&1 || { cat \"$RUNNER_TEMP/bound-check.log\"; exit 1; }\n cat \"$RUNNER_TEMP/bound-check.log\"\n grep -Eq '^PASS +closed' \"$RUNNER_TEMP/bound-check.log\"\n grep -Eq '^RECEIPTS [1-9][0-9]* read · 0 opened' \"$RUNNER_TEMP/bound-check.log\"\n - run: npm pack --silent\n" at=policy:bound/pipeline by=target form=alphabet measure=text role=writes scope=prose/en/files/workflow/test shape=.github/workflows/test.yml value=lock
121
- bound-lock/1 about="npx @lapxo/bound@0.1.1 fold --as help\nnpx @lapxo/bound@0.1.1 fold" at=policy:bound/011-port-release by=target form=alphabet measure=text role=writes scope=prose/en/commands value=lock
121
+ bound-lock/1 about="npx @lapxo/bound@0.1.2 fold --as help\nnpx @lapxo/bound@0.1.2 fold" at=witness:bound/012-cold-closure by=target form=alphabet measure=text role=writes scope=prose/en/commands value=lock
122
122
  bound-lock/1 about="obligations is the meet. topos is the line. Worlds outside bound read a calendar, a package, a page. Bound reads lines, folds them, lands what was signed, and signs." at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/rests/on value=present
123
123
  bound-lock/1 about="one origin is REQUIRED, two that meet inside every bound are FREE, two that meet outside a bound are FORBIDDEN, and two that do not meet are CONFLICT" at=policy:bound/010-states by=target form=alphabet measure=id role=writes scope=notation/states value="one origin=REQUIRED|claims that meet and fit the bounds=FREE|claims that meet outside the bounds=FORBIDDEN|bounds that cross=CONFLICT"
124
124
  bound-lock/1 about="take the package in" at=policy:bound/door by=target form=alphabet measure=id role=writes scope=install value=npx
@@ -126,7 +126,7 @@ bound-lock/1 about="the DOI prefix a cite is read through" at=policy:bound/010 b
126
126
  bound-lock/1 about="the TypeScript capsule nine places still pin, before source/longest became a maximum: named here until no uses line names it" at=policy:bound/capsules by=target form=alphabet measure=id role=writes scope=dep/topos-typescript-tree/pinned shape=dist/index.js value=sha256:8c29831ead1c231f8f444d49e64adb293bd4e0b854192b225a539c288a927ed6
127
127
  bound-lock/1 about="the TypeScript capsule readers: source/longest emitted under the measure longest, a maximum, and sibling refs as a count" at=policy:bound/capsules by=target form=alphabet measure=id role=writes scope=dep/topos-typescript-tree/readers shape=dist/index.js value=sha256:bf8a5a67c8a675ed04349e72c36a8f073a5c153646e98d2003b36a3fad34209e
128
128
  bound-lock/1 about="the algebra and the notation this place rests on" at=policy:bound/010 by=target form=alphabet measure=id role=writes scope=dependencies value=@lapxo/obligations|@lapxo/topos
129
- bound-lock/1 about="the algebra bound folds with, named by the digest of its release and read from bound-s own store, never from a sibling of the tree" at=witness:a-notation-that-asked-an-algebra-newer-than-the-one-laid by=target form=alphabet measure=id needs=node_modules/@lapxo/obligations role=reads scope=dep/obligations value=sha256:0a5bc5c61df28a3b7b2798869ab9aac74b98904856806a30d1755d26808f2254
129
+ bound-lock/1 about="the algebra bound folds with, named by the digest of its release and read from bound-s own store, never from a sibling of the tree" at=witness:public-artifact-closure by=target form=alphabet measure=id needs=node_modules/@lapxo/obligations role=reads scope=dep/obligations shape=package value=sha256:e4b48f480e86c2e1b9518b7a5dbe18e4b4dfa449961c781a291295fa85a3ec72
130
130
  bound-lock/1 about="the atoms of the door, in that order, each fed by a page/readme line or a receipt" at=policy:bound/readme by=target form=alphabet measure=id role=writes scope=page/readme value=group|say|term|count|cell|seq|exchange|set|ref
131
131
  bound-lock/1 about="the badge host a page wears" at=policy:bound/010 by=target form=alphabet measure=id role=writes scope=sources/badges value=https://img.shields.io/badge
132
132
  bound-lock/1 about="the boss is withdrawn; the meet is again the range every remaining origin allows" at=policy:bound/door by=target form=alphabet measure=text role=writes scope=prose/en/figure/fold/back value=lock
@@ -256,7 +256,7 @@ bound-lock/1 about="the typescript tree world after its released capsule: said,
256
256
  bound-lock/1 about="the vectors a place holds, a row per region, as the fold counts them from its receipts" at=policy:bound/regions by=target form=alphabet measure=receipts role=reads scope=region/vectors value=vector/**
257
257
  bound-lock/1 about="the vectors world saying its own description in its own lock: the regions of 2fb13c6f unchanged, its prose under its key; packed from releases only, topos 0.1.2 and the algebra release, each laid from its digest" at=policy:bound/capsules by=target form=alphabet measure=id role=writes scope=dep/topos-json/own-what shape=dist/index.js value=sha256:5ec73255e3f089e3b9c7bc1d6351a07b8aa302a346fe16ed44cbcb67293c7891
258
258
  bound-lock/1 about="the version the forge tags, read from the manifest" at=policy:bound/pipeline by=target form=alphabet measure=id role=writes scope=pipeline/version value="node -p \"require('./package.json').version\""
259
- bound-lock/1 about="the version this place is bound at" at=policy:bound/011-port-release by=target form=alphabet measure=id role=writes scope=version value=0.1.1
259
+ bound-lock/1 about="the version this place is bound at" at=witness:bound/012-cold-closure by=target form=alphabet measure=id role=writes scope=version value=0.1.2
260
260
  bound-lock/1 about="the writer that vouches each source at the digest a take judged it: a family the wire lists, which bound reads here and never spells" at=policy:bound/store by=target form=alphabet measure=id role=reads scope=store/vouches value=tree
261
261
  bound-lock/1 about="this place is a package: class defaults of package resolve here" at=policy:bound/place by=target form=alphabet measure=id role=writes scope=place/kind value=package
262
262
  bound-lock/1 about="topos-node with a thin manifest: no typesVersions, main or types, dev dependencies only where a line says so, and a bin field from the place bin/<name> lines" at=policy:bound/capsules by=target form=alphabet measure=id role=writes scope=dep/topos-node/thin-manifest shape=dist/index.js value=sha256:da1fd0bb74f72ae95bce5929055c50ccd150d8903ba5560d99df48bf236d8dc0
@@ -273,7 +273,7 @@ bound-lock/1 about="what the second head found, which leaves the place has writt
273
273
  bound-lock/1 about="when the apart claim is withdrawn" at=policy:bound/door by=target form=alphabet measure=id role=writes scope=form/style/fold/back value=2.2
274
274
  bound-lock/1 about="where a located world keeps each region file, by directory and extension, so the host loads the tree beside the pin" at=policy:bound/010 by=target form=alphabet measure=id role=writes scope=release/layout value=src/regions:.ts
275
275
  bound-lock/1 about="who signs this place" at=policy:bound/010 by=target form=alphabet measure=id role=writes scope=author value=Lapxo
276
- bound-lock/1 about="{\n \"name\": \"@lapxo/bound\",\n \"version\": \"0.1.1\",\n \"type\": \"module\",\n \"description\": \"Read the bounds you already wrote, fold them, and name the contradictions.\",\n \"main\": \"dist/cli/verb.js\",\n \"types\": \"dist/cli/verb.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/cli/verb.d.ts\",\n \"default\": \"./dist/cli/verb.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"test\": \"node --import ./test/setup.ts --test test/*.test.ts\",\n \"clean\": \"rm -rf dist .tsbuildinfo* tsconfig.tsbuildinfo\",\n \"build\": \"node tools/build.mjs\",\n \"prepack\": \"npm run build\"\n },\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CONTRIBUTING.md\",\n \"dist/**/*\",\n \"TARGET.bound\",\n \"receipts.bound\",\n \"docs/usage.md\",\n \"docs/readme-assets/atlas.svg\"\n ],\n \"author\": \"Lapxo\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@lapxo/obligations\": \"0.3.5\",\n \"@lapxo/topos\": \"0.1.8\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"typescript\": \"^5.0.0\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=22.15\"\n },\n \"bin\": {\n \"bound\": \"./dist/cli/verb.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Lapxo/bound.git\"\n },\n \"homepage\": \"https://github.com/Lapxo/bound#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/Lapxo/bound/issues\"\n },\n \"keywords\": [\n \"cli\",\n \"content-addressed\",\n \"provenance\",\n \"receipts\",\n \"constraints\",\n \"reproducible\"\n ]\n}" at=policy:bound/011-port-release by=target form=alphabet measure=text role=writes scope=prose/en/files/manifest shape=package.json value=lock
276
+ bound-lock/1 about="{\n \"name\": \"@lapxo/bound\",\n \"version\": \"0.1.2\",\n \"type\": \"module\",\n \"description\": \"Read the bounds you already wrote, fold them, and name the contradictions.\",\n \"main\": \"dist/cli/verb.js\",\n \"types\": \"dist/cli/verb.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/cli/verb.d.ts\",\n \"default\": \"./dist/cli/verb.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"test\": \"node --import ./test/setup.ts --test test/*.test.ts\",\n \"clean\": \"rm -rf dist .tsbuildinfo* tsconfig.tsbuildinfo\",\n \"build\": \"node tools/build.mjs\",\n \"prepack\": \"npm run build\"\n },\n \"files\": [\n \"LICENSE\",\n \"README.md\",\n \"CONTRIBUTING.md\",\n \"dist/**/*\",\n \"TARGET.bound\",\n \"receipts.bound\",\n \"docs/usage.md\",\n \"docs/readme-assets/atlas.svg\"\n ],\n \"author\": \"Lapxo\",\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@lapxo/obligations\": \"0.3.5\",\n \"@lapxo/topos\": \"0.1.8\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^20.0.0\",\n \"typescript\": \"^5.0.0\"\n },\n \"sideEffects\": false,\n \"engines\": {\n \"node\": \">=22.15\"\n },\n \"bin\": {\n \"bound\": \"./dist/cli/verb.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Lapxo/bound.git\"\n },\n \"homepage\": \"https://github.com/Lapxo/bound#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/Lapxo/bound/issues\"\n },\n \"keywords\": [\n \"cli\",\n \"content-addressed\",\n \"provenance\",\n \"receipts\",\n \"constraints\",\n \"reproducible\"\n ]\n}" at=witness:bound/012-cold-closure by=target form=alphabet measure=text role=writes scope=prose/en/files/manifest shape=package.json value=lock
277
277
  bound-lock/1 about="{count} hold" at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/badge/held value=lock
278
278
  bound-lock/1 about="{lo}..{hi} · {state}" at=policy:bound/readme by=target form=alphabet measure=text role=writes scope=prose/en/figure/fold/together value=present
279
279
  bound-lock/1 about="{title} (Version {version})" at=policy:bound/010 by=target form=alphabet measure=text role=writes scope=prose/en/cite/versioned value=lock
@@ -354,12 +354,14 @@ bound-lock/1 at=policy:project/local-journals by=target form=alphabet measure=cl
354
354
  bound-lock/1 at=policy:project/local-journals by=target form=alphabet measure=class role=writes scope=keys/reader value=read
355
355
  bound-lock/1 at=policy:prose/render-contract by=target form=alphabet measure=digest role=writes scope=uses/prose-render value=sha256:8b678e37f1fe656a5c456f09c0d57020e3aeddb8acec2b5ffc92054a3ce26c3b
356
356
  bound-lock/1 at=policy:prose/render-contract by=target form=alphabet measure=id role=writes scope=dep/prose-render shape=dist/regions/text.js value=sha256:a1c31a72a31eaf8ea7df0fb98235c4b465aee1d9575aebcc480f09b4bf64daf1
357
+ bound-lock/1 at=policy:public-artifact-source by=target form=alphabet measure=id role=writes scope=sources/obligations value=https://registry.npmjs.org/@lapxo/obligations/-/obligations-0.3.5.tgz
358
+ bound-lock/1 at=policy:public-artifact-source by=target form=alphabet measure=id role=writes scope=sources/topos value=https://registry.npmjs.org/@lapxo/topos/-/topos-0.1.8.tgz
359
+ bound-lock/1 at=policy:public-artifact-source by=target form=alphabet measure=id role=writes scope=sources/typescript value=https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz
357
360
  bound-lock/1 at=policy:release/process-captures by=target form=alphabet measure=coordinates role=reads scope=region/captures value=src/**|test/**|vectors/process/**|dist/**|package.json|TARGET.bound
358
361
  bound-lock/1 at=policy:release/process-inputs by=target form=alphabet measure=coordinates role=reads scope=region/vectors value=src/**|test/**|vectors/process/**|dist/**|package.json|TARGET.bound
359
362
  bound-lock/1 at=policy:rendering by=target form=alphabet measure=digest role=writes scope=uses/rendering value=sha256:0f7653b659f372fd7bc1b140d0103606ebd8814dee8ef3be30949c6647b482a3
360
363
  bound-lock/1 at=policy:selected-wire by=target form=alphabet measure=digest role=writes scope=uses/wire value=sha256:a717c60945add1facfd822b3ee2da73a8fa2f781dd0aa2de9be778e66b8f3591
361
364
  bound-lock/1 at=policy:source/coordinates by=target form=alphabet measure=coordinates role=reads scope=region/source value=src/**
362
- bound-lock/1 at=policy:source/parser by=target form=alphabet measure=digest needs=node_modules/typescript role=reads scope=dep/typescript value=sha256:9dc6ee1f8dec9598cbecff5e2fcf2b916d04294c0615588dd424448a5a3afce5
363
365
  bound-lock/1 at=witness:explicit-executable-candidate by=target form=alphabet measure=id role=writes scope=dep/topos-doc/born shape=dist/index.js value=sha256:2c507e7fe764e55d08fc27b01567d462060fe50d1896d19866f831a823852ae5
364
366
  bound-lock/1 at=witness:process-captures-reader by=target form=alphabet measure=digest role=writes scope=dep/process-readings shape=dist/regions/vectors.js value=sha256:b22d161e8ae7c96789c7fb038b1d755fa149203c7e035c6d2fa5f2a164fecb54
365
367
  bound-lock/1 at=witness:process-captures-selection by=target form=alphabet measure=digest role=writes scope=uses/process-readings value=sha256:a55f6849b39e77b6fcd89b2a2ba8fa286a7c8626193bbfe14aef30bef6b29458
@@ -376,5 +378,6 @@ bound-lock/1 at=witness:project-coordinates-are-relative by=target form=interval
376
378
  bound-lock/1 at=witness:project-coordinates-are-relative by=target form=interval measure=count needs=samples/literal/yes/key.json|samples/literal/no/key.json role=reads scope=literal/key value=0..0
377
379
  bound-lock/1 at=witness:project-coordinates-are-relative by=target form=interval measure=count needs=samples/literal/yes/org.json|samples/literal/no/org.json role=reads scope=literal/org value=0..0
378
380
  bound-lock/1 at=witness:project-coordinates-are-relative by=target form=interval measure=count needs=samples/literal/yes/path.json|samples/literal/no/path.json role=reads scope=literal/path value=0..0
381
+ bound-lock/1 at=witness:public-artifact-closure by=target form=alphabet measure=digest needs=node_modules/typescript role=reads scope=dep/typescript shape=package value=sha256:10e108c9cf7d5f2879053dff18515fb405abf2ccef63eaaf017d9c571687a1d3
379
382
  bound-lock/1 at=witness:source-reader by=target form=alphabet measure=digest role=writes scope=dep/source-readings shape=dist/regions/source.js value=sha256:5ccae33a9e99f6acba690d9664e22cfe818205841e4e9d3083d4b24fb68d7075
380
383
  bound-lock/1 at=witness:source-selection by=target form=alphabet measure=digest role=writes scope=uses/source-readings value=sha256:4129c469d3296a1fcda640f59e0d7c37f255b1e88c2f8e2447cd1359a514f356
package/dist/cli/verb.js CHANGED
@@ -387,8 +387,10 @@ function foldVerb(_root, rest) {
387
387
  }
388
388
  async function foldAt(root, under, argv) {
389
389
  const as = valueOf(argv, FLAGS.as);
390
- if (as !== NAMED_VIEWS.help && signedOwnerLines(storeOf(root)).length)
391
- await resolveSources(standingOf(root, under).standing);
390
+ // Public content is authenticated by its digest, independently of owner history.
391
+ // A named view does not request mounting every release of the instrument.
392
+ if (as !== NAMED_VIEWS.help && lockLines(storeOf(root)).length)
393
+ await resolveSources(standingOf(root, under).standing, as === undefined);
392
394
  if (as === OBJECT_VIEW) {
393
395
  const inputs = positionalsOf(argv).filter(one => existsSync(resolve(one)) && !lstatSync(resolve(one)).isDirectory());
394
396
  if (inputs.length > 1)
@@ -3,6 +3,7 @@ import { fieldOf, isConfig } from "./claims.js";
3
3
  import { isReaderLock } from "./observed.js";
4
4
  import { isRoleLock } from "./roles.js";
5
5
  import { isSignerLock } from "./signers.js";
6
+ import { isReleaseBinding } from "../host/release.js";
6
7
  function isEffectLock(line) {
7
8
  const got = parse(line);
8
9
  return got.kind === 'fact' && got.value.fields['measure'] === 'effect';
@@ -10,7 +11,7 @@ function isEffectLock(line) {
10
11
  /** A lock line the instrument itself consumes — an effect it runs, a reader it loads, a role it walks by, a signer it admits, the wire it reads by. */
11
12
  function configures(line) {
12
13
  const got = parse(line);
13
- return isEffectLock(line) || isReaderLock(line) || isRoleLock(line) || isSignerLock(line) || (got.kind === 'fact' && isWireClaim(got.value.fields));
14
+ return isReleaseBinding(line) || isEffectLock(line) || isReaderLock(line) || isRoleLock(line) || isSignerLock(line) || (got.kind === 'fact' && isWireClaim(got.value.fields));
14
15
  }
15
16
  /** Every reads line that configures nothing is a ceiling: a bound some reading has to meet. */
16
17
  export function isCeiling(line) {
package/dist/fold/kept.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import { createHash, dirname, existsSync, join, mkdirSync, readdirSync, renameSync, writeFileSync } from "../host/io.js";
2
2
  import { bytesDigest, coordinateDigest } from "./digests.js";
3
3
  import { viewsOf } from "./views.js";
4
- import { landMemo, ledgerLines, memoAt } from "../land/ledger.js";
5
- import { observeText } from "../observe/files.js";
4
+ import { landMemo, ledgerLines, memoAt, shardFile, writerFile } from "../land/ledger.js";
5
+ import { coordinatesUnder, observeFile, observeText } from "../observe/files.js";
6
6
  import { EXTENSION, fieldOf } from "./claims.js";
7
- import { keyFor, lockSigners } from "./keys.js";
7
+ import { keyFor, keyOf, lockSigners } from "./keys.js";
8
8
  import { sourceOf, vouching } from "../land/vouched.js";
9
9
  import { wordsOf } from "./wire.js";
10
10
  import { ownLock } from "../observe/runner.js";
@@ -45,6 +45,7 @@ export function foldPoints(store, standing, under, keeper, instrument = '', obse
45
45
  return [
46
46
  `place ${under ?? '.'}`,
47
47
  `instrument ${instrument}`,
48
+ `reading context ${readingContext(store)}`,
48
49
  ...written,
49
50
  ...lined,
50
51
  ...[...new Set(coordinates)].sort(),
@@ -93,6 +94,14 @@ export const foldsElsewhere = () => elsewhere.folds;
93
94
  const joined = (lines) => lines.join('\n');
94
95
  const split = (text) => (text === '' ? [] : text.split('\n'));
95
96
  const linesOf = (value) => value === undefined ? [] : typeof value === 'string' ? split(value) : value;
97
+ /** Operational reader history guards file-fold reuse, never cell-region identity. */
98
+ function readingContext(store) {
99
+ const speaker = keyOf(store, 'read');
100
+ const files = speaker === undefined ? [] : [writerFile(store, speaker), ...coordinatesUnder(dirname(shardFile(store, speaker, '')), store)
101
+ .filter(file => file.endsWith(EXTENSION)).map(file => join(store, file))];
102
+ return bytesDigest(store, text(files.filter(file => existsSync(file)).sort()
103
+ .map(file => bytesDigest(store, observeFile(file) ?? new Uint8Array())).join('\n')));
104
+ }
96
105
  export function keptPlace(store, under) {
97
106
  const key = observeText(memoAt(store, lastOf([`place ${under ?? '.'}`])))?.trim();
98
107
  if (key === undefined || key === '')
@@ -101,6 +110,8 @@ export function keptPlace(store, under) {
101
110
  if (held === undefined)
102
111
  return undefined;
103
112
  const blob = JSON.parse(held);
113
+ if (blob.readingContext !== readingContext(store))
114
+ return undefined;
104
115
  const fold = blob.fold;
105
116
  return {
106
117
  ...fold,
@@ -134,7 +145,7 @@ export function keepFold(store, key, fold, points, instrument = '') {
134
145
  signed: [...fold.signed],
135
146
  kept: false,
136
147
  };
137
- landMemo(store, `fold/${key}`, text(JSON.stringify({ fold: packed, points, instrument })));
148
+ landMemo(store, `fold/${key}`, text(JSON.stringify({ fold: packed, points, instrument, readingContext: readingContext(store) })));
138
149
  const at = memoAt(store, lastOf(points));
139
150
  mkdirSync(dirname(at), { recursive: true });
140
151
  writeFileSync(`${at}.${process.pid}.part`, `${key}\n`);
@@ -7,6 +7,11 @@ export declare const selectionLines: (fold: {
7
7
  readonly standing: readonly string[];
8
8
  readonly under?: string;
9
9
  }) => readonly string[];
10
+ export declare const projectionLines: (fold: {
11
+ readonly root: string;
12
+ readonly standing: readonly string[];
13
+ readonly under?: string;
14
+ }) => readonly string[];
10
15
  export declare function capsulesFor(standing: readonly string[], place: string, root?: string): readonly {
11
16
  readonly capsule: Capsule;
12
17
  readonly offer: string;
@@ -1,6 +1,6 @@
1
1
  import { selectedCapsules } from "../host/selected-capsules.js";
2
2
  import { basename } from "../host/io.js";
3
- import { matches } from '@lapxo/topos/wire';
3
+ import { canonical, matches, parse } from '@lapxo/topos/wire';
4
4
  import { fieldOf } from "./claims.js";
5
5
  import { spoken, worldsIn } from "./places.js";
6
6
  import { wordOf, wordsOf } from "./wire.js";
@@ -57,9 +57,27 @@ export const selectionLines = (fold) => {
57
57
  const qualified = fold.standing.filter((line) => fieldOf(line, 'scope').startsWith(`${fold.under ?? ''}uses/`));
58
58
  return [...new Set([...local, ...qualified])].filter((line) => fieldOf(line, 'value') !== 'withdraw');
59
59
  };
60
+ /** Host bindings belong to the selected place, never to another sibling's lock. */
61
+ const relativeProjections = (standing, prefix) => standing.filter(line => fieldOf(line, 'scope').startsWith(`${prefix}dep/`)).map(line => {
62
+ const got = parse(line, { preserveKeys: true });
63
+ if (got.kind !== 'fact')
64
+ throw Error(`REFUSE·wire ${got.why}`);
65
+ // An unsigned host projection of admitted fields, never a newly signed claim.
66
+ const { sig, by, epoch, expires, repo, ...fields } = got.value.fields;
67
+ return canonical({ ...fields, scope: fields.scope.slice(prefix.length) }, got.value.version);
68
+ });
69
+ export const projectionLines = (fold) => {
70
+ const place = fold.under?.replace(/\/$/, '') ?? '';
71
+ const prefix = place ? `${place}/` : '';
72
+ const local = ownLockOf(fold.root, place).filter(line => fieldOf(line, 'scope').startsWith('dep/'));
73
+ const qualified = relativeProjections(fold.standing, prefix);
74
+ return [...new Set([...ownLock(), ...local, ...qualified])];
75
+ };
60
76
  export function capsulesFor(standing, place, root) {
61
77
  const prefix = place ? `${place}/` : '';
62
78
  const pins = root === undefined ? standing.filter(line => fieldOf(line, 'scope').startsWith(`${prefix}uses/`) && fieldOf(line, 'value') !== 'withdraw')
63
79
  : selectionLines({ root, standing, ...(prefix ? { under: prefix } : {}) });
64
- return selectedCapsules(pins);
80
+ const host = root === undefined ? [...ownLock(), ...relativeProjections(standing, prefix)]
81
+ : projectionLines({ root, standing, ...(prefix ? { under: prefix } : {}) });
82
+ return selectedCapsules(pins, undefined, undefined, host);
65
83
  }
@@ -1,4 +1,6 @@
1
1
  export declare const laidAt: (store: string, digest: string) => string;
2
+ /** A host artifact binding, not a measured ceiling or an object act. */
3
+ export declare const isReleaseBinding: (line: string) => boolean;
2
4
  export declare const releasesOf: (lock: readonly string[]) => readonly string[];
3
5
  /**
4
6
  * What the host does before anything runs: each release the instrument's own lock names by digest is a snapshot of
@@ -2,12 +2,17 @@ import { createHash } from 'node:crypto';
2
2
  import { existsSync, lstatSync, mkdirSync, realpathSync, renameSync, rmSync, writeFileSync } from 'node:fs';
3
3
  import { dirname, join, sep } from 'node:path';
4
4
  import { canonical } from '@lapxo/topos/wire';
5
- import { fieldOf, isWire } from "../fold/claims.js";
5
+ import { fieldOf, isWire, isConfig } from "../fold/claims.js";
6
6
  import { archiveCoordinate, archiveDestination, members } from "./archive.js";
7
7
  import { blobAt, holdStore, landBlob, replaceWhole, storeAt } from "../land/ledger.js";
8
8
  import { coordinatesUnder, observeFile, observeText } from "../observe/files.js";
9
9
  export const laidAt = (store, digest) => storeAt(store, 'cas', 'laid', digest.replace(/^[^:]*:/, ''));
10
- export const releasesOf = (lock) => lock.filter((line) => fieldOf(line, 'scope').startsWith('dep/') && fieldOf(line, 'role') === 'reads' && fieldOf(line, 'value') !== 'withdraw');
10
+ /** A host artifact binding, not a measured ceiling or an object act. */
11
+ export const isReleaseBinding = (line) => isConfig(line)
12
+ && fieldOf(line, 'scope').startsWith('dep/') && fieldOf(line, 'role') === 'reads'
13
+ && fieldOf(line, 'value') !== 'withdraw'
14
+ && (fieldOf(line, 'measure') === 'digest' || /^[a-zA-Z][a-zA-Z0-9-]*:[a-f0-9]+$/.test(fieldOf(line, 'value')));
15
+ export const releasesOf = (lock) => lock.filter(isReleaseBinding);
11
16
  const laidMark = '.laid';
12
17
  const digestOf = (bytes) => `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
13
18
  const hashed = (digest, bytes) => createHash(digest.includes(':') ? digest.slice(0, digest.indexOf(':')) : 'sha256').update(bytes).digest('hex') === digest.replace(/^[^:]*:/, '');
@@ -119,6 +124,11 @@ function keepSnapshot(store, digest, bytes) {
119
124
  export function layReleases(store, own, lock, contentStore = own) {
120
125
  let laid = 0;
121
126
  for (const line of releasesOf(lock)) {
127
+ // A release catalog entry without a mount is materialized only when requested.
128
+ // Its absence must not block an unrelated place's fold.
129
+ const needs = fieldOf(line, 'needs');
130
+ if (!needs)
131
+ continue;
122
132
  const digest = fieldOf(line, 'value');
123
133
  const at = laidAt(store, digest);
124
134
  const dir = lstatSync(at, { throwIfNoEntry: false })?.isDirectory() ?? false;
@@ -134,9 +144,6 @@ export function layReleases(store, own, lock, contentStore = own) {
134
144
  throw new Error(`REFUSE·release snapshot for ${digest} omits or changes archive members; explicit rebuild required`);
135
145
  if (bytes === undefined && !dir && current === undefined)
136
146
  throw new Error(`REFUSE·release ${fieldOf(line, 'scope')} has no available archive or snapshot`);
137
- const needs = fieldOf(line, 'needs');
138
- if (!needs)
139
- continue;
140
147
  const root = fieldOf(line, 'shape');
141
148
  const place = join(own, archiveCoordinate(needs));
142
149
  const link = lstatSync(place, { throwIfNoEntry: false });
@@ -2,7 +2,7 @@ import { capsuleAt } from './capsule.ts';
2
2
  import type { Capsule } from './capsule.ts';
3
3
  import type { ToposResolver } from './selected-topos.ts';
4
4
  /** Only explicit capsule offers request execution. Forms/classes/views do not need an executable alias. */
5
- export declare function selectedCapsules(pins: readonly string[], resolve?: typeof capsuleAt, select?: ToposResolver): readonly {
5
+ export declare function selectedCapsules(pins: readonly string[], resolve?: typeof capsuleAt, select?: ToposResolver, host?: readonly string[]): readonly {
6
6
  readonly capsule: Capsule;
7
7
  readonly offer: string;
8
8
  }[];
@@ -4,13 +4,17 @@ import { selectedTopoi, toposAt } from "./selected-topos.js";
4
4
  import { canonical } from '@lapxo/topos/wire';
5
5
  import { fieldOf } from "../fold/claims.js";
6
6
  import { ownLock } from "../observe/runner.js";
7
+ import { archiveCoordinate } from "./archive.js";
7
8
  /** Only explicit capsule offers request execution. Forms/classes/views do not need an executable alias. */
8
- export function selectedCapsules(pins, resolve = capsuleAt, select = toposAt) {
9
+ export function selectedCapsules(pins, resolve = capsuleAt, select = toposAt, host = ownLock()) {
9
10
  return selectedTopoi(pins, select).flatMap(({ digest, topos }) => capsuleOffers(topos).map(offer => {
10
- const projections = ownLock().filter(line => fieldOf(line, 'scope').startsWith('dep/') && fieldOf(line, 'role') !== 'reads' && fieldOf(line, 'value') === offer.value);
11
- if (projections.length !== 1 || !fieldOf(projections[0], 'shape'))
11
+ const projections = host.filter(line => fieldOf(line, 'scope').startsWith('dep/') && fieldOf(line, 'role') === 'writes' && fieldOf(line, 'value') === offer.value);
12
+ if (!projections.length || projections.some(line => !fieldOf(line, 'shape')))
12
13
  throw Error(`REFUSE·pin ${digest} capsule ${offer.value} needs one host projection`);
13
- const projected = { ...offer, shape: fieldOf(projections[0], 'shape') };
14
+ const entries = [...new Set(projections.map(line => archiveCoordinate(fieldOf(line, 'shape'))))];
15
+ if (entries.length !== 1)
16
+ throw Error(`REFUSE·pin ${digest} capsule ${offer.value} has conflicting host projections`);
17
+ const projected = { ...offer, shape: entries[0] };
14
18
  const capsule = resolve(offer.value, projected.shape);
15
19
  if (capsule === undefined)
16
20
  throw Error(`REFUSE·pin ${digest} · ${offer.scope} · offered capsule ${offer.value} unavailable`);
@@ -7,4 +7,4 @@ export interface ContentPort {
7
7
  /** Transport uses declared locations; only the requested digest admits bytes into the cache. */
8
8
  export declare function resolveSelectedContent(lines: readonly string[], port: ContentPort): Promise<readonly string[]>;
9
9
  /** Exact resource URLs; no repository checkout or inferred release. */
10
- export declare function resolveSources(standing: readonly string[]): Promise<void>;
10
+ export declare function resolveSources(standing: readonly string[], materializeInstrument?: boolean): Promise<void>;
@@ -76,12 +76,19 @@ export async function resolveSelectedContent(lines, port) {
76
76
  return received;
77
77
  }
78
78
  /** Exact resource URLs; no repository checkout or inferred release. */
79
- export async function resolveSources(standing) {
79
+ export async function resolveSources(standing, materializeInstrument = false) {
80
80
  const instrument = ownLock().flatMap(line => { const p = parse(line); return p.kind === 'fact' ? [p.value.fields] : []; });
81
81
  const wire = wireAt(instrument, Number.MAX_SAFE_INTEGER);
82
82
  if (wire === null)
83
83
  throw Error('REFUSE·pin instrument has no admitted wire');
84
- const received = await resolveSelectedContent([...standing, ...ownLock().filter(line => { const p = parse(line); return p.kind === 'fact' && (p.value.fields.scope?.startsWith('dep/') || p.value.fields.scope?.startsWith('sources/')); })], {
84
+ const bindings = ownLock().filter(line => {
85
+ const p = parse(line);
86
+ if (p.kind !== 'fact')
87
+ return false;
88
+ const fields = p.value.fields;
89
+ return fields.scope?.startsWith('sources/') || (fields.scope?.startsWith('dep/') && (fields.role !== 'reads' || (materializeInstrument && !!fields.needs)));
90
+ });
91
+ const received = await resolveSelectedContent([...standing, ...bindings], {
85
92
  algorithms: wire.digests,
86
93
  read: digest => observeFile(blobAt(ownStore(), digest)),
87
94
  write: (digest, bytes) => { landBlob(ownStore(), digest, bytes); },
@@ -1,5 +1,5 @@
1
1
  import { selectedCapsules } from "../host/selected-capsules.js";
2
- import { selectionLines } from "../fold/reach.js";
2
+ import { selectionLines, projectionLines } from "../fold/reach.js";
3
3
  export { selectionLines } from "../fold/reach.js";
4
4
  import { createHash } from 'node:crypto';
5
5
  import { basename, dirname, join, relative } from 'node:path';
@@ -125,7 +125,7 @@ export function capsulesOf(fold) {
125
125
  const cached = heldCapsules.get(fold);
126
126
  if (cached !== undefined)
127
127
  return cached;
128
- const got = selectedCapsules(selectionLines(fold)).map(one => one.capsule);
128
+ const got = selectedCapsules(selectionLines(fold), undefined, undefined, projectionLines(fold)).map(one => one.capsule);
129
129
  heldCapsules.set(fold, got);
130
130
  return got;
131
131
  }
@@ -166,7 +166,8 @@ export function prerender(fold, views) {
166
166
  capsuleViews(fold, due.map((view) => ({ asking: view.regions.filter((asked) => REGIONS[asked.name] === undefined), shape: view.shape })));
167
167
  }
168
168
  export function viewOf(fold, view) {
169
- const live = !view.shape;
169
+ // Native receipts project current file bytes, not only the cached fold's observations.
170
+ const live = !view.shape || view.regions.some(asked => asked.name === 'receipts');
170
171
  const kept = !live && fold.key ? keptRender(fold.store, fold.key, view.name) : undefined;
171
172
  if (kept !== undefined)
172
173
  return kept;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lapxo/bound",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "type": "module",
5
5
  "description": "Read the bounds you already wrote, fold them, and name the contradictions.",
6
6
  "main": "dist/cli/verb.js",
package/receipts.bound CHANGED
@@ -1,92 +1,91 @@
1
- bound-lock/1 at=place:sha256:7c1117301f0b1ea3623a7e6ee08299c42d99d17337d90e0c24738cd2d4743700 by=reader:2c507e7fe764 form=alphabet measure=observed role=writes scope=./ value=7c1117301f0b1ea3
2
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=observed role=writes scope= value=bc7f74f65fd8c012
3
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:bbff6b8fc616 form=alphabet measure=observed role=writes scope= value=cf63a02f966dd484
4
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=alphabet measure=observed role=writes scope= value=cf63a02f966dd484
5
- bound-lock/1 at=place:sha256:7c1117301f0b1ea3623a7e6ee08299c42d99d17337d90e0c24738cd2d4743700 by=reader:2c507e7fe764 form=interval measure=unreceipted role=reads scope=door/unreceipted value=0..0
6
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/duplicate/src value=none
7
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/host value=none
8
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/key value=none
9
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/org value=none
10
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/path value=none
11
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/host value=0..0
12
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/key value=0..0
13
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/org value=0..0
14
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/path value=0..0
15
- bound-lock/1 at=place:sha256:bc7f74f65fd8c012cf50082e552a00ad775dd697ca35ddbf7b0b7f4ef5247c78 by=reader:0f5306d0e183 form=interval measure=duplicate-bodies role=reads scope=duplicate/src value=0..0
16
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:bbff6b8fc616 form=alphabet measure=text role=reads scope=capture/help value="clean-checkout: verbs fold land sign · flags --as --check --key --key-file --signer --place\n"
17
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:bbff6b8fc616 form=alphabet measure=text role=reads scope=capture/meeting value="INPUT [[\"Ana\",10,14],[\"Luis\",12,16],[\"room\",10,13],[\"boss\",18,20]]\nMEET {\"lo\":12,\"hi\":13}\nCONFLICT boss\nWITHDRAW boss {\"lo\":12,\"hi\":13}\n"
18
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=cli-exit-closed role=reads scope=cli/exit/closed value=0..0
19
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=cli-exit-refuse role=reads scope=cli/exit/refuse value=1..1
20
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=cli-exit-usage role=reads scope=cli/exit/usage value=2..2
21
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=cli-flags role=reads scope=cli/flags value=6..6
22
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=idempotent value=0..0
23
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=nothing-deleted value=0..0
24
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=offline value=0..0
25
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=one-writer value=0..0
26
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=resolve-by-url value=0..0
27
- bound-lock/1 at=place:sha256:cf63a02f966dd4844eedeb6209ba969e84b83c9921e55901105e81460b352bf7 by=reader:c448c64e0bac form=interval measure=count role=reads scope=the-stranger value=0..0
1
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:bbff6b8fc616 form=alphabet measure=observed role=writes scope= value=1e59e9487e0c7e29
2
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=alphabet measure=observed role=writes scope= value=1e59e9487e0c7e29
3
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=observed role=writes scope= value=82fe2a1cdfef232a
4
+ bound-lock/1 at=place:sha256:a01b65b584b8fca7fc21b082bb5382010eb7e39088e93eed9b62f848d1efe179 by=reader:2c507e7fe764 form=alphabet measure=observed role=writes scope=./ value=a01b65b584b8fca7
5
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:bbff6b8fc616 form=alphabet measure=text role=reads scope=capture/help value="admission-checkout: verbs fold land sign · flags --as --check --key --key-file --signer --place\n"
6
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:bbff6b8fc616 form=alphabet measure=text role=reads scope=capture/meeting value="INPUT [[\"Ana\",10,14],[\"Luis\",12,16],[\"room\",10,13],[\"boss\",18,20]]\nMEET {\"lo\":12,\"hi\":13}\nCONFLICT boss\nWITHDRAW boss {\"lo\":12,\"hi\":13}\n"
7
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=cli-exit-closed role=reads scope=cli/exit/closed value=0..0
8
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=cli-exit-refuse role=reads scope=cli/exit/refuse value=1..1
9
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=cli-exit-usage role=reads scope=cli/exit/usage value=2..2
10
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=cli-flags role=reads scope=cli/flags value=6..6
11
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=idempotent value=0..0
12
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=nothing-deleted value=0..0
13
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=offline value=0..0
14
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=one-writer value=0..0
15
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=resolve-by-url value=0..0
16
+ bound-lock/1 at=place:sha256:1e59e9487e0c7e29c11b4dff71aaa2ff5e2a331860f08cae8d834152a3177bfb by=reader:c448c64e0bac form=interval measure=count role=reads scope=the-stranger value=0..0
17
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/duplicate/src value=none
18
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/host value=none
19
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/key value=none
20
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/org value=none
21
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=alphabet measure=id role=reads scope=source/locations/literal/path value=none
22
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/host value=0..0
23
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/key value=0..0
24
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/org value=0..0
25
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=interval measure=count role=reads scope=literal/path value=0..0
26
+ bound-lock/1 at=place:sha256:82fe2a1cdfef232a395e34381b10b62de9ae82fdb81c440946f6e844933d0f05 by=reader:0f5306d0e183 form=interval measure=duplicate-bodies role=reads scope=duplicate/src value=0..0
27
+ bound-lock/1 at=place:sha256:a01b65b584b8fca7fc21b082bb5382010eb7e39088e93eed9b62f848d1efe179 by=reader:2c507e7fe764 form=interval measure=unreceipted role=reads scope=door/unreceipted value=0..0
28
+ bound-lock/1 at=cone:0abeb4d9e38dbbf12bf63c9e20e50b4066f7cae49b2a42a0b93e3ee6ea34aedb by=judge form=alphabet measure=status role=writes scope=law/a-fact-is-a-printed-line value=present
29
+ bound-lock/1 at=cone:0abeb4d9e38dbbf12bf63c9e20e50b4066f7cae49b2a42a0b93e3ee6ea34aedb by=judge form=alphabet measure=cone role=writes scope=law/a-fact-is-a-printed-line value=samples/yes/a-fact-is-a-printed-line.json|samples/no/a-fact-is-a-printed-line.json
30
+ bound-lock/1 at=cone:957f15a6bf76172db7ad6fc3ad985d3a2d29d53b0d7f26496278534a6b27eaa5 by=judge form=alphabet measure=status role=writes scope=law/a-refuse-plants value=present
31
+ bound-lock/1 at=cone:957f15a6bf76172db7ad6fc3ad985d3a2d29d53b0d7f26496278534a6b27eaa5 by=judge form=alphabet measure=cone role=writes scope=law/a-refuse-plants value=samples/yes/a-refuse-plants.json|samples/no/a-refuse-plants.json
32
+ bound-lock/1 at=cone:c4e8823785cb957bd016ff4f294f1fa5c89213b8cac249ffdc93b972288b8d48 by=judge form=alphabet measure=status role=writes scope=law/one-lot-one-place value=present
33
+ bound-lock/1 at=cone:c4e8823785cb957bd016ff4f294f1fa5c89213b8cac249ffdc93b972288b8d48 by=judge form=alphabet measure=cone role=writes scope=law/one-lot-one-place value=samples/yes/one-lot-one-place.json|samples/no/one-lot-one-place.json
34
+ bound-lock/1 at=cone:9b1915d477c82eba64f0b9a7928018db772788398ca8a13afd438831417ee43a by=judge form=alphabet measure=status role=writes scope=law/three-verbs value=present
35
+ bound-lock/1 at=cone:9b1915d477c82eba64f0b9a7928018db772788398ca8a13afd438831417ee43a by=judge form=alphabet measure=cone role=writes scope=law/three-verbs value=samples/yes/three-verbs.json|samples/no/three-verbs.json
36
+ bound-lock/1 at=cone:f4bf42894d608f16e39cb757609c9d0a82f50b31749b13599a4fc5ee303fcdf8 by=judge form=alphabet measure=status role=writes scope=law/verify-agrees value=present
37
+ bound-lock/1 at=cone:f4bf42894d608f16e39cb757609c9d0a82f50b31749b13599a4fc5ee303fcdf8 by=judge form=alphabet measure=cone role=writes scope=law/verify-agrees value=samples/yes/verify-agrees.json|samples/no/verify-agrees.json
28
38
  bound-lock/1 at=cone:4292d62653bf8b34ace44df7d63dd12682cce5eaea39c8512f48e147dca718e1 by=judge form=alphabet measure=id role=writes scope=view/citation-file value=cff
29
39
  bound-lock/1 at=cone:4292d62653bf8b34ace44df7d63dd12682cce5eaea39c8512f48e147dca718e1 by=judge form=alphabet measure=cone role=writes scope=view/citation-file value=CITATION.cff
30
- bound-lock/1 at=cone:ec781d88336155facc27fe7b493d2ed01688534446d44f400037a0f7385c9031 by=judge form=alphabet measure=id role=writes scope=view/explanation value=idea|what-holds|refuses
31
- bound-lock/1 at=cone:ec781d88336155facc27fe7b493d2ed01688534446d44f400037a0f7385c9031 by=judge form=alphabet measure=cone role=writes scope=view/explanation value=docs/why.md
32
- bound-lock/1 at=cone:d6a0e68127376ef71fe6c7b646b31765611cd14e0a65aa93f21908e4596cb80f by=judge form=alphabet measure=id role=writes scope=view/guide value=seq
33
- bound-lock/1 at=cone:d6a0e68127376ef71fe6c7b646b31765611cd14e0a65aa93f21908e4596cb80f by=judge form=alphabet measure=cone role=writes scope=view/guide value=docs/guide.md
40
+ bound-lock/1 at=cone:7a5a827c8ab936737b9da72412171bb04548dea9fdc94a746a5a5930e2211e8b by=judge form=alphabet measure=id role=writes scope=view/explanation value=idea|what-holds|refuses
41
+ bound-lock/1 at=cone:7a5a827c8ab936737b9da72412171bb04548dea9fdc94a746a5a5930e2211e8b by=judge form=alphabet measure=cone role=writes scope=view/explanation value=docs/why.md
42
+ bound-lock/1 at=cone:5af7aa019f81d75b150501e03cf4c96cce75f87d47ed0922c1f3179c14e5e67d by=judge form=alphabet measure=id role=writes scope=view/guide value=seq
43
+ bound-lock/1 at=cone:5af7aa019f81d75b150501e03cf4c96cce75f87d47ed0922c1f3179c14e5e67d by=judge form=alphabet measure=cone role=writes scope=view/guide value=docs/guide.md
34
44
  bound-lock/1 at=cone:067095e4453bdfa7289c8b77b509ec31a01ae659269fa58e5ce5bd044bb1f98f by=judge form=alphabet measure=id role=writes scope=view/manifest-render value=text@3
35
45
  bound-lock/1 at=cone:067095e4453bdfa7289c8b77b509ec31a01ae659269fa58e5ce5bd044bb1f98f by=judge form=alphabet measure=cone role=writes scope=view/manifest-render value=package.json
36
- bound-lock/1 at=cone:5c88adaa88cf2d08504c88d19da3a5d9ca79ab7daca95518d9148e8b999f017f by=judge form=alphabet measure=id role=writes scope=view/readme-historical value=hero@3|commands@3|idea@3|open@3
46
+ bound-lock/1 at=cone:5c88adaa88cf2d08504c88d19da3a5d9ca79ab7daca95518d9148e8b999f017f by=judge form=alphabet measure=id role=writes scope=view/readme-historical value=hero@3|commands@3|idea@3
37
47
  bound-lock/1 at=cone:5c88adaa88cf2d08504c88d19da3a5d9ca79ab7daca95518d9148e8b999f017f by=judge form=alphabet measure=cone role=writes scope=view/readme-historical value=README.md
38
- bound-lock/1 at=cone:03b387412c2548f73e11625dd659bc326f28bbdd17528ce42986fb167ac39f18 by=judge form=alphabet measure=id role=writes scope=view/reference value=term|set|ref
39
- bound-lock/1 at=cone:03b387412c2548f73e11625dd659bc326f28bbdd17528ce42986fb167ac39f18 by=judge form=alphabet measure=cone role=writes scope=view/reference value=docs/reference.md
48
+ bound-lock/1 at=cone:73e5f49f2c68ae68297168be62142f4c0310322535b892de92e7b5b71cbbd798 by=judge form=alphabet measure=id role=writes scope=view/reference value=term|set|ref
49
+ bound-lock/1 at=cone:73e5f49f2c68ae68297168be62142f4c0310322535b892de92e7b5b71cbbd798 by=judge form=alphabet measure=cone role=writes scope=view/reference value=docs/reference.md
40
50
  bound-lock/1 at=cone:83acd4200e0d85822ec7758f1425c8ece7e8ca0523660aa6bf2f17484642a79e by=judge form=alphabet measure=id role=writes scope=view/release-workflow-render value=text@3
41
51
  bound-lock/1 at=cone:83acd4200e0d85822ec7758f1425c8ece7e8ca0523660aa6bf2f17484642a79e by=judge form=alphabet measure=cone role=writes scope=view/release-workflow-render value=.github/workflows/release.yml
42
52
  bound-lock/1 at=cone:fd85558d34bab73004bfbaef02834284a34899a49d582069417ffb79be54e0a6 by=judge form=alphabet measure=id role=writes scope=view/usage-profile value=text@3
43
53
  bound-lock/1 at=cone:fd85558d34bab73004bfbaef02834284a34899a49d582069417ffb79be54e0a6 by=judge form=alphabet measure=cone role=writes scope=view/usage-profile value=docs/usage.md
44
- bound-lock/1 at=receipt:sha256:91fb702201feaa066f8b313957a0b48a65a1dab26154cbf38f2dcde06203c3b5 by=judge form=alphabet measure=status role=writes scope=law/a-refuse-plants value=present
45
- bound-lock/1 at=receipt:sha256:91fb702201feaa066f8b313957a0b48a65a1dab26154cbf38f2dcde06203c3b5 by=judge form=alphabet measure=cone role=writes scope=law/a-refuse-plants value=samples/no/a-refuse-plants.json|samples/yes/a-refuse-plants.json
46
- bound-lock/1 at=receipt:sha256:c5ff9ee255a2f5d34e1775b867e2de8bedcb8a010618465c466912e0b354c61d by=judge form=alphabet measure=status role=writes scope=law/a-fact-is-a-printed-line value=present
47
- bound-lock/1 at=receipt:sha256:c5ff9ee255a2f5d34e1775b867e2de8bedcb8a010618465c466912e0b354c61d by=judge form=alphabet measure=cone role=writes scope=law/a-fact-is-a-printed-line value=samples/no/a-fact-is-a-printed-line.json|samples/yes/a-fact-is-a-printed-line.json
48
- bound-lock/1 at=receipt:sha256:cdc30f156b5742558af939ed554215651f7f0cc5beef88424592973b7abc80f8 by=judge form=alphabet measure=status role=writes scope=law/verify-agrees value=present
49
- bound-lock/1 at=receipt:sha256:cdc30f156b5742558af939ed554215651f7f0cc5beef88424592973b7abc80f8 by=judge form=alphabet measure=cone role=writes scope=law/verify-agrees value=samples/no/verify-agrees.json|samples/yes/verify-agrees.json
50
- bound-lock/1 at=receipt:sha256:72109d540c9b48fd2ce4940f149a904bd11bb9f6ddf47b5896ef52907b65b17c by=judge form=alphabet measure=status role=writes scope=law/one-lot-one-place value=present
51
- bound-lock/1 at=receipt:sha256:72109d540c9b48fd2ce4940f149a904bd11bb9f6ddf47b5896ef52907b65b17c by=judge form=alphabet measure=cone role=writes scope=law/one-lot-one-place value=samples/no/one-lot-one-place.json|samples/yes/one-lot-one-place.json
52
- bound-lock/1 at=receipt:sha256:85dfabb6bfeefb75fa8aefc54ae0af616b94b49018715ac3161eb754c6cdd19a by=judge form=alphabet measure=status role=writes scope=law/three-verbs value=present
53
- bound-lock/1 at=receipt:sha256:85dfabb6bfeefb75fa8aefc54ae0af616b94b49018715ac3161eb754c6cdd19a by=judge form=alphabet measure=cone role=writes scope=law/three-verbs value=samples/no/three-verbs.json|samples/yes/three-verbs.json
54
- bound-lock/1 at=cone:5c88adaa88cf2d08504c88d19da3a5d9ca79ab7daca95518d9148e8b999f017f by=judge form=alphabet measure=id role=writes scope=view/readme-historical value=hero@3|commands@3|idea@3
55
- bound-lock/1 at=place:sha256:44ae5ba4c91d17e21fa68848a3795fedb40e2ae19a79d8c55960245d1d796c20 by=bound form=alphabet measure=digest role=writes scope=instrument/implementation value=sha256:44ae5ba4c91d17e21fa68848a3795fedb40e2ae19a79d8c55960245d1d796c20
54
+ bound-lock/1 at=place:sha256:1f51a966c0b5a4436f4794fdb49accc9ccb374be101875a84ce7706c74456585 by=bound form=alphabet measure=digest role=writes scope=instrument/implementation value=sha256:1f51a966c0b5a4436f4794fdb49accc9ccb374be101875a84ce7706c74456585
56
55
 
57
- bound-lock/1 at=place:sha256:644cb7f0a301de95343d23dd9ea66ae91bb3d06f3e5b3b8ee31709fa3b4bc3b2 by=bound form=alphabet measure=digest role=writes scope=receipts value=sha256:04e8e3efff9ff65c7b93d8e5475ac19c1d196701838cf632192d1b1c45a70506
56
+ bound-lock/1 at=place:sha256:38cffb32270b1fb2d20d20780d4067bab680143e644b45d11d469cd9e6afa09c by=bound form=alphabet measure=digest role=writes scope=receipts value=sha256:00a64627484a759e94ec545eb5a33cd36d014a5c30c6c2e4ac895e9c93dc87a9
58
57
 
59
- bound-lock/1 at=place:sha256:94030da0d84a6c91e1d171285b10a63072b7a24d71b2e32748157f50ac85149c by=bound form=interval measure=count role=writes scope=receipts/ value=2..2
60
- bound-lock/1 at=place:sha256:6c9512033a0e5631d7a84bbf999c10c52d9a263ca87021a0a8191a23c9710233 by=bound form=alphabet measure=bytes role=writes scope=receipts/ value=sha256:6c9512033a0e5631d7a84bbf999c10c52d9a263ca87021a0a8191a23c9710233
61
- bound-lock/1 at=place:sha256:21f2609c4392af50cd456e5d4118d80024ecc7131457973d3df93e1196098996 by=bound form=interval measure=count role=writes scope=receipts/. value=1..1
62
- bound-lock/1 at=place:sha256:6c9512033a0e5631d7a84bbf999c10c52d9a263ca87021a0a8191a23c9710233 by=bound form=alphabet measure=bytes role=writes scope=receipts/. value=sha256:6c9512033a0e5631d7a84bbf999c10c52d9a263ca87021a0a8191a23c9710233
63
- bound-lock/1 at=place:sha256:692ab612dedbc110a760f4741848af5f652dfc78ecfde2494068137217424d3e by=bound form=interval measure=count role=writes scope=receipts/capture value=2..2
64
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/capture value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
65
- bound-lock/1 at=place:sha256:3601c3fe8c72ae7cb44b0c222de1820464072d3381d3f02ae4b73350a691e01f by=bound form=interval measure=count role=writes scope=receipts/cli value=4..4
66
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/cli value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
67
- bound-lock/1 at=place:sha256:3410c80b2791ed2e384e75ba9fb9e793d0cf803240b5b9c8970b4fb4956e56ff by=bound form=interval measure=count role=writes scope=receipts/door value=1..1
68
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/door value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
69
- bound-lock/1 at=place:sha256:4b0af40eb9b9262ab6f85f95258b48e0fe7443eec9df2a427c64b37bf7f1baf3 by=bound form=interval measure=count role=writes scope=receipts/duplicate value=1..1
70
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/duplicate value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
71
- bound-lock/1 at=place:sha256:ed696ec2b59dd5dcd2697ea7c33abc97af6b10337d0db4de808e85a5c3c884c6 by=bound form=interval measure=count role=writes scope=receipts/idempotent value=1..1
72
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/idempotent value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
73
- bound-lock/1 at=place:sha256:8961733d781d249c0ecef3c9ce3deea5f2f77b5ca608d772457daa311c12b203 by=bound form=interval measure=count role=writes scope=receipts/instrument value=1..1
74
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/instrument value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
75
- bound-lock/1 at=place:sha256:53563ab619e2f2498bcee50f84f5dfebcaf65f44e3f52673520b4674b672d05b by=bound form=interval measure=count role=writes scope=receipts/law value=10..10
76
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/law value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
77
- bound-lock/1 at=place:sha256:be88067990999be2a9f64c6a8ce7821a5b059e01a77b623d180a1b4ef3af8ac5 by=bound form=interval measure=count role=writes scope=receipts/literal value=4..4
78
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/literal value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
79
- bound-lock/1 at=place:sha256:80508745fa8b478d4d534b07c7f31c5a5e020d6f07d086fe240f3cfb31d40c70 by=bound form=interval measure=count role=writes scope=receipts/nothing-deleted value=1..1
80
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/nothing-deleted value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
81
- bound-lock/1 at=place:sha256:84da879e348a8933984303561ad96c24a1255d3051e964d18f9a8ba62c58b1c3 by=bound form=interval measure=count role=writes scope=receipts/offline value=1..1
82
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/offline value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
83
- bound-lock/1 at=place:sha256:eb9eeb5aaf72da07c83f7a8d38f410b68ec4f899029ca2910b8e272ea9454ed4 by=bound form=interval measure=count role=writes scope=receipts/one-writer value=1..1
84
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/one-writer value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
85
- bound-lock/1 at=place:sha256:8776cff2b3219dab669ec849f40df450dfd7cc1ff573e30e280fd9d56db96376 by=bound form=interval measure=count role=writes scope=receipts/resolve-by-url value=1..1
86
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/resolve-by-url value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
87
- bound-lock/1 at=place:sha256:a05c9b0fc8f3a21066418a26cbc9c9c83bf8dacbe7bedd728a3972a0756f350f by=bound form=interval measure=count role=writes scope=receipts/source value=5..5
88
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/source value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
89
- bound-lock/1 at=place:sha256:81ab86378ee3ea130a9f05408a4eb983454b20ac4b69aaa39d74ed3670befc7c by=bound form=interval measure=count role=writes scope=receipts/the-stranger value=1..1
90
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/the-stranger value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
91
- bound-lock/1 at=place:sha256:f1218964c3874b0fde60dbc28725a87818457e633e9c420c6d13bc56412a015b by=bound form=interval measure=count role=writes scope=receipts/view value=17..17
92
- bound-lock/1 at=place:sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb by=bound form=alphabet measure=bytes role=writes scope=receipts/view value=sha256:2b57c1d5e39a81f601aa58e1214fb6e20d22d949107aebee509d341e1951a8cb
58
+ bound-lock/1 at=place:sha256:e4410fae0c1ed17811a8270307e03c0430454d2af3ecfc8f9c6ec3cc9d8c6400 by=bound form=interval measure=count role=writes scope=receipts/ value=2..2
59
+ bound-lock/1 at=place:sha256:12cdd83040b43da2dfc289a3ccaa3f0eee25999811e3dd3fc98b4144fb73b86b by=bound form=alphabet measure=bytes role=writes scope=receipts/ value=sha256:12cdd83040b43da2dfc289a3ccaa3f0eee25999811e3dd3fc98b4144fb73b86b
60
+ bound-lock/1 at=place:sha256:c139cc42748b2ece6d728ed12df20282e5aca9b6116ecfeed93cac1c6ebaf924 by=bound form=interval measure=count role=writes scope=receipts/. value=1..1
61
+ bound-lock/1 at=place:sha256:12cdd83040b43da2dfc289a3ccaa3f0eee25999811e3dd3fc98b4144fb73b86b by=bound form=alphabet measure=bytes role=writes scope=receipts/. value=sha256:12cdd83040b43da2dfc289a3ccaa3f0eee25999811e3dd3fc98b4144fb73b86b
62
+ bound-lock/1 at=place:sha256:83ac0ba7618e1c99a643cd3778a3a024e881baa2b6618a05d8b519f18427cad4 by=bound form=interval measure=count role=writes scope=receipts/capture value=2..2
63
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/capture value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
64
+ bound-lock/1 at=place:sha256:fee29d63168a9e603471291bf2d94220c40d8a4b0c7835dd6be32d4cc3858bbd by=bound form=interval measure=count role=writes scope=receipts/cli value=4..4
65
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/cli value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
66
+ bound-lock/1 at=place:sha256:f4491a96c7514fdaf076d7b428226db7c2004037054319d8db76826a97244deb by=bound form=interval measure=count role=writes scope=receipts/door value=1..1
67
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/door value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
68
+ bound-lock/1 at=place:sha256:3b2a62bab9f7087a5c6f9d65d2a6c8a3ea09bc0a47596a07e66cec075abc1fac by=bound form=interval measure=count role=writes scope=receipts/duplicate value=1..1
69
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/duplicate value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
70
+ bound-lock/1 at=place:sha256:e72a72f0c01f5a819e1d8e5545b7b98ed98203df92bb79553d90828d1006fcb8 by=bound form=interval measure=count role=writes scope=receipts/idempotent value=1..1
71
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/idempotent value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
72
+ bound-lock/1 at=place:sha256:92a8a2d334a4d8e1b93b4535f49362faed71c2b836a68012f49c4c0f56fa8724 by=bound form=interval measure=count role=writes scope=receipts/instrument value=1..1
73
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/instrument value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
74
+ bound-lock/1 at=place:sha256:24023fde10bc3f5ad0c60d2b04cca3907b111a5431c6d6f0fc1171a9c3a67c8c by=bound form=interval measure=count role=writes scope=receipts/law value=10..10
75
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/law value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
76
+ bound-lock/1 at=place:sha256:1a8833c3e1e9cfa9c89c437605c9a40e1ca1b41de188c918004afdd8008c317a by=bound form=interval measure=count role=writes scope=receipts/literal value=4..4
77
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/literal value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
78
+ bound-lock/1 at=place:sha256:96e1ec3e4e80102099785e608d7e9d34b387b69dda9c8d8f70bc5ff52f76bb8e by=bound form=interval measure=count role=writes scope=receipts/nothing-deleted value=1..1
79
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/nothing-deleted value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
80
+ bound-lock/1 at=place:sha256:a42ff6e261f257df1cf68a7d96c992e356818d34d293e7b094c22af2dd064e5d by=bound form=interval measure=count role=writes scope=receipts/offline value=1..1
81
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/offline value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
82
+ bound-lock/1 at=place:sha256:ba413473f8f9622fce61e80caf4c26ee74e2c8e847cb3c6a510e1d8e535e1ad7 by=bound form=interval measure=count role=writes scope=receipts/one-writer value=1..1
83
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/one-writer value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
84
+ bound-lock/1 at=place:sha256:a9b844716b2addcea27e2cecdce64fdb87df9e4d94aaf48f4a642ee0b760f1b5 by=bound form=interval measure=count role=writes scope=receipts/resolve-by-url value=1..1
85
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/resolve-by-url value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
86
+ bound-lock/1 at=place:sha256:0f6af9d527081810070aeb8e5df78e2e5ef56893fff2f995505f24ad845f3686 by=bound form=interval measure=count role=writes scope=receipts/source value=5..5
87
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/source value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
88
+ bound-lock/1 at=place:sha256:ba39ecd64ab6d52954a2c6509e98825092d6d52c719707dc33599bff85a3bfe3 by=bound form=interval measure=count role=writes scope=receipts/the-stranger value=1..1
89
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/the-stranger value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014
90
+ bound-lock/1 at=place:sha256:94cad2b845d4a89330040bc0d0e062260ecc114b8dc7a092b2b072ab1fa7dcad by=bound form=interval measure=count role=writes scope=receipts/view value=16..16
91
+ bound-lock/1 at=place:sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014 by=bound form=alphabet measure=bytes role=writes scope=receipts/view value=sha256:6a61a4c6fcdb2c128638dd568c351d41fa0fbd53ab82c2c021b0e1c992243014