@lapxo/bound 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -10
- package/TARGET.bound +59 -40
- package/dist/cli/accept.js +27 -18
- package/dist/cli/args.js +9 -2
- package/dist/cli/names.d.ts +1 -1
- package/dist/cli/names.js +2 -2
- package/dist/cli/verb.js +28 -20
- package/dist/fold/observed.js +5 -1
- package/dist/fold/readers.js +5 -1
- package/dist/fold/signed.js +5 -3
- package/dist/fold/wire.js +6 -1
- package/dist/host/ports/signing.d.ts +31 -0
- package/dist/host/ports/signing.js +74 -0
- package/dist/host/provide.d.ts +2 -2
- package/dist/host/provide.js +3 -3
- package/dist/host/release.d.ts +1 -1
- package/dist/host/release.js +21 -8
- package/dist/host/selected-topos.d.ts +4 -0
- package/dist/host/selected-topos.js +23 -0
- package/dist/host/signing.d.ts +3 -0
- package/dist/host/signing.js +42 -0
- package/dist/host/source-content.js +4 -1
- package/dist/land/sign.d.ts +9 -10
- package/dist/land/sign.js +31 -8
- package/dist/observe/runner.js +5 -2
- package/docs/usage.md +3 -3
- package/package.json +19 -3
- package/receipts.bound +90 -57
|
@@ -8,7 +8,10 @@ import { ownLock, ownStore } from "../observe/runner.js";
|
|
|
8
8
|
export async function resolveSelectedContent(lines, port) {
|
|
9
9
|
const fields = lines.flatMap(line => { const p = parse(line); return p.kind === 'fact' && p.value.fields.value !== 'withdraw' ? [p.value.fields] : []; });
|
|
10
10
|
const selectionIndex = (scope) => { const match = /(^|\/)uses\//.exec(scope); return match === null ? -1 : match.index + match[1].length; };
|
|
11
|
-
|
|
11
|
+
// A dependency constraint is not a content binding. Historical artifact records
|
|
12
|
+
// use measure=id; explicit digest records still validate even when malformed.
|
|
13
|
+
const bindings = fields.filter(f => selectionIndex(f.scope ?? '') >= 0 ||
|
|
14
|
+
(f.scope?.startsWith('dep/') && (f.measure === 'digest' || /^[a-zA-Z][a-zA-Z0-9-]*:[a-f0-9]+$/.test(f.value ?? ''))));
|
|
12
15
|
const locations = new Map();
|
|
13
16
|
for (const binding of bindings) {
|
|
14
17
|
const scope = binding.scope ?? '';
|
package/dist/land/sign.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
type
|
|
1
|
+
import type { SigningLot, SignatureRecord } from '../host/ports/signing.ts';
|
|
2
|
+
/** Prepare and verify a whole lot. No key material and no output/admission side effects. */
|
|
3
|
+
export declare function signConsentLot(lines: readonly string[], stamp: {
|
|
4
|
+
readonly epoch?: number;
|
|
5
|
+
readonly by: string;
|
|
6
|
+
readonly algorithm: string;
|
|
7
|
+
}, publicKey: string, admitted: readonly string[], invoke: (lot: SigningLot) => Promise<readonly SignatureRecord[]>): Promise<{
|
|
2
8
|
readonly kind: 'fact';
|
|
3
|
-
readonly
|
|
9
|
+
readonly lines: readonly string[];
|
|
4
10
|
} | {
|
|
5
11
|
readonly kind: 'refuse';
|
|
6
12
|
readonly why: string;
|
|
7
|
-
}
|
|
8
|
-
/** A consent line (by=target, no sig) becomes the owner's claim: stamped with its epoch, then signed over the canonical bytes. */
|
|
9
|
-
export declare function signConsentLine(line: string, privateKeyPem: string, stamp: {
|
|
10
|
-
readonly epoch?: number;
|
|
11
|
-
readonly by: string;
|
|
12
|
-
readonly algorithm: string;
|
|
13
|
-
}): Signed;
|
|
13
|
+
}>;
|
|
14
14
|
export declare function verifiesOwnerLine(line: string, publicKeyPem: string, admitted: readonly string[]): boolean;
|
|
15
15
|
export declare function verifiesFields(fields: Readonly<Record<string, string>>, publicKey: string, admitted: readonly string[]): boolean;
|
|
16
|
-
export {};
|
package/dist/land/sign.js
CHANGED
|
@@ -1,21 +1,44 @@
|
|
|
1
1
|
import { canonical, parse, parseForSigning, signedBytes, signedFieldsOf } from '@lapxo/topos/wire';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { verifyBytes } from "../host/adapters/keys/ed25519.js";
|
|
3
|
+
import { SigningFailure } from "../host/ports/signing.js";
|
|
4
|
+
function prepareConsentLine(line, stamp) {
|
|
5
5
|
const got = parseForSigning(line);
|
|
6
6
|
if (got.kind !== 'fact')
|
|
7
|
-
return { kind: 'refuse', why:
|
|
7
|
+
return { kind: 'refuse', why: 'REFUSE·accept not a claim line' };
|
|
8
8
|
const fields = got.value.fields;
|
|
9
9
|
const scope = fields['scope'] ?? '?';
|
|
10
10
|
if (fields['sig'] !== undefined)
|
|
11
11
|
return { kind: 'refuse', why: `REFUSE·accept ${scope} is already signed` };
|
|
12
|
-
if (fields['by'] !== 'target')
|
|
13
|
-
return { kind: 'refuse', why: `REFUSE·accept ${scope}
|
|
14
|
-
}
|
|
12
|
+
if (fields['by'] !== 'target')
|
|
13
|
+
return { kind: 'refuse', why: `REFUSE·accept ${scope} must be drafted by=target` };
|
|
15
14
|
const covered = signedFieldsOf(fields, stamp.by);
|
|
16
15
|
if (stamp.epoch !== undefined)
|
|
17
16
|
covered['epoch'] = String(stamp.epoch);
|
|
18
|
-
return { kind: 'fact',
|
|
17
|
+
return { kind: 'fact', fields: covered };
|
|
18
|
+
}
|
|
19
|
+
/** Prepare and verify a whole lot. No key material and no output/admission side effects. */
|
|
20
|
+
export async function signConsentLot(lines, stamp, publicKey, admitted, invoke) {
|
|
21
|
+
const fields = [];
|
|
22
|
+
for (const line of lines) {
|
|
23
|
+
const prepared = prepareConsentLine(line, stamp);
|
|
24
|
+
if (prepared.kind === 'refuse')
|
|
25
|
+
return prepared;
|
|
26
|
+
fields.push(prepared.fields);
|
|
27
|
+
}
|
|
28
|
+
if (!fields.length)
|
|
29
|
+
return { kind: 'refuse', why: `REFUSE·signer ${stamp.by} empty lot` };
|
|
30
|
+
let records;
|
|
31
|
+
try {
|
|
32
|
+
records = await invoke({ bytes: fields.map(f => signedBytes(f)), keyId: stamp.by, algorithm: stamp.algorithm });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return { kind: 'refuse', why: error instanceof SigningFailure ? error.message : `REFUSE·signer ${stamp.by} acquisition failed` };
|
|
36
|
+
}
|
|
37
|
+
if (records.length !== fields.length || records.some((record, i) => record.keyId !== stamp.by
|
|
38
|
+
|| !verifyBytes(signedBytes(fields[i]), publicKey, record.signature, admitted))) {
|
|
39
|
+
return { kind: 'refuse', why: `REFUSE·signer ${stamp.by} signature does not verify` };
|
|
40
|
+
}
|
|
41
|
+
return { kind: 'fact', lines: fields.map((f, i) => canonical({ ...f, sig: records[i].signature })) };
|
|
19
42
|
}
|
|
20
43
|
export function verifiesOwnerLine(line, publicKeyPem, admitted) {
|
|
21
44
|
const got = parse(line);
|
package/dist/observe/runner.js
CHANGED
|
@@ -21,7 +21,8 @@ const moduleAt = fromBlob() ? undefined : fileURLToPath(import.meta.url);
|
|
|
21
21
|
const runtimeAt = moduleAt === undefined ? '' : resolve(dirname(moduleAt), '..');
|
|
22
22
|
const runtimeExtension = moduleAt === undefined ? '' : extname(moduleAt);
|
|
23
23
|
export const ownRoot = () => (fromBlob() ? join(resolve(dirname(self()), '..', '..', '..'), 'bound') : resolve(runtimeAt, '..'));
|
|
24
|
-
export const ownStore = () => join(ownRoot(), '
|
|
24
|
+
export const ownStore = () => existsSync(join(ownRoot(), EXTENSION, 'ledger'))
|
|
25
|
+
? join(ownRoot(), EXTENSION) : join(ownRoot(), '..', EXTENSION);
|
|
25
26
|
/** The colocated public artifact is read without an unrelated parent's authority store. */
|
|
26
27
|
// An act is judged by the instrument it started with, even when that act changes its colocated lock.
|
|
27
28
|
let instrumentLock;
|
|
@@ -30,7 +31,9 @@ export const ownLock = () => {
|
|
|
30
31
|
return instrumentLock;
|
|
31
32
|
const lines = (observeText(join(ownRoot(), LOCK)) ?? '').split('\n').filter(isWire);
|
|
32
33
|
const published = publicLock(lines);
|
|
33
|
-
instrumentLock = published === undefined
|
|
34
|
+
instrumentLock = published === undefined
|
|
35
|
+
? dirname(ownStore()) === ownRoot() ? ownLockOf(ownRoot(), '', true) : ownLockOf(join(ownRoot(), '..'), basename(ownRoot()), true)
|
|
36
|
+
: foldClaims(published).standing;
|
|
34
37
|
return instrumentLock;
|
|
35
38
|
};
|
|
36
39
|
export const sourceOf = () => (fromBlob() ? join(ownRoot(), 'src', 'cli', 'verb.ts') : self());
|
package/docs/usage.md
CHANGED
|
@@ -12,11 +12,11 @@ Start by asking for help and folding the project. If a selected view is unavaila
|
|
|
12
12
|
|
|
13
13
|
## Keys and coverage
|
|
14
14
|
|
|
15
|
-
Use a named key already admitted by the project. The authority contract declares its public key, class and scope coverage. The
|
|
15
|
+
Use 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.
|
|
16
16
|
|
|
17
17
|
A 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.
|
|
18
18
|
|
|
19
|
-
For automation, supply the private key through the runner's secret storage to a temporary external file with restricted permissions. 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.
|
|
19
|
+
For 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.
|
|
20
20
|
|
|
21
21
|
## Proposal → signature → admission → reading
|
|
22
22
|
|
|
@@ -42,7 +42,7 @@ receipts.bound is native fold output. Do not write it by hand, use JSON from a t
|
|
|
42
42
|
|
|
43
43
|
REFUSE·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.
|
|
44
44
|
|
|
45
|
-
release/blocks is policy read by the fold.
|
|
45
|
+
release/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.
|
|
46
46
|
|
|
47
47
|
## Repository and PR review
|
|
48
48
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lapxo/bound",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
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",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"license": "MIT",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@lapxo/obligations": "0.3.5",
|
|
35
|
-
"@lapxo/topos": "0.1.
|
|
35
|
+
"@lapxo/topos": "0.1.8"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^20.0.0",
|
|
@@ -44,5 +44,21 @@
|
|
|
44
44
|
},
|
|
45
45
|
"bin": {
|
|
46
46
|
"bound": "./dist/cli/verb.js"
|
|
47
|
-
}
|
|
47
|
+
},
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "git+https://github.com/Lapxo/bound.git"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/Lapxo/bound#readme",
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/Lapxo/bound/issues"
|
|
55
|
+
},
|
|
56
|
+
"keywords": [
|
|
57
|
+
"cli",
|
|
58
|
+
"content-addressed",
|
|
59
|
+
"provenance",
|
|
60
|
+
"receipts",
|
|
61
|
+
"constraints",
|
|
62
|
+
"reproducible"
|
|
63
|
+
]
|
|
48
64
|
}
|
package/receipts.bound
CHANGED
|
@@ -1,59 +1,92 @@
|
|
|
1
|
-
bound-lock/1 at=place:sha256:
|
|
2
|
-
bound-lock/1 at=place:sha256:
|
|
3
|
-
bound-lock/1 at=place:sha256:
|
|
4
|
-
bound-lock/1 at=place:sha256:
|
|
5
|
-
bound-lock/1 at=place:sha256:
|
|
6
|
-
bound-lock/1 at=place:sha256:
|
|
7
|
-
bound-lock/1 at=place:sha256:
|
|
8
|
-
bound-lock/1 at=place:sha256:
|
|
9
|
-
bound-lock/1 at=place:sha256:
|
|
10
|
-
bound-lock/1 at=place:sha256:
|
|
11
|
-
bound-lock/1 at=place:sha256:
|
|
12
|
-
bound-lock/1 at=place:sha256:
|
|
13
|
-
bound-lock/1 at=place:sha256:
|
|
14
|
-
bound-lock/1 at=place:sha256:
|
|
15
|
-
bound-lock/1 at=place:sha256:
|
|
16
|
-
bound-lock/1 at=place:sha256:
|
|
17
|
-
bound-lock/1 at=place:sha256:
|
|
18
|
-
bound-lock/1 at=place:sha256:
|
|
19
|
-
bound-lock/1 at=place:sha256:
|
|
20
|
-
bound-lock/1 at=place:sha256:
|
|
21
|
-
bound-lock/1 at=place:sha256:
|
|
22
|
-
bound-lock/1 at=place:sha256:
|
|
23
|
-
bound-lock/1 at=place:sha256:
|
|
24
|
-
bound-lock/1 at=place:sha256:
|
|
25
|
-
bound-lock/1 at=place:sha256:
|
|
26
|
-
bound-lock/1 at=place:sha256:
|
|
27
|
-
bound-lock/1 at=place:sha256:
|
|
28
|
-
bound-lock/1 at=
|
|
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
|
|
28
|
+
bound-lock/1 at=cone:4292d62653bf8b34ace44df7d63dd12682cce5eaea39c8512f48e147dca718e1 by=judge form=alphabet measure=id role=writes scope=view/citation-file value=cff
|
|
29
|
+
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
|
|
34
|
+
bound-lock/1 at=cone:067095e4453bdfa7289c8b77b509ec31a01ae659269fa58e5ce5bd044bb1f98f by=judge form=alphabet measure=id role=writes scope=view/manifest-render value=text@3
|
|
35
|
+
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
|
|
37
|
+
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
|
|
40
|
+
bound-lock/1 at=cone:83acd4200e0d85822ec7758f1425c8ece7e8ca0523660aa6bf2f17484642a79e by=judge form=alphabet measure=id role=writes scope=view/release-workflow-render value=text@3
|
|
41
|
+
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
|
+
bound-lock/1 at=cone:fd85558d34bab73004bfbaef02834284a34899a49d582069417ffb79be54e0a6 by=judge form=alphabet measure=id role=writes scope=view/usage-profile value=text@3
|
|
43
|
+
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
|
|
29
56
|
|
|
30
|
-
bound-lock/1 at=place:sha256:
|
|
57
|
+
bound-lock/1 at=place:sha256:644cb7f0a301de95343d23dd9ea66ae91bb3d06f3e5b3b8ee31709fa3b4bc3b2 by=bound form=alphabet measure=digest role=writes scope=receipts value=sha256:04e8e3efff9ff65c7b93d8e5475ac19c1d196701838cf632192d1b1c45a70506
|
|
31
58
|
|
|
32
|
-
bound-lock/1 at=place:sha256:
|
|
33
|
-
bound-lock/1 at=place:sha256:
|
|
34
|
-
bound-lock/1 at=place:sha256:
|
|
35
|
-
bound-lock/1 at=place:sha256:
|
|
36
|
-
bound-lock/1 at=place:sha256:
|
|
37
|
-
bound-lock/1 at=place:sha256:
|
|
38
|
-
bound-lock/1 at=place:sha256:
|
|
39
|
-
bound-lock/1 at=place:sha256:
|
|
40
|
-
bound-lock/1 at=place:sha256:
|
|
41
|
-
bound-lock/1 at=place:sha256:
|
|
42
|
-
bound-lock/1 at=place:sha256:
|
|
43
|
-
bound-lock/1 at=place:sha256:
|
|
44
|
-
bound-lock/1 at=place:sha256:
|
|
45
|
-
bound-lock/1 at=place:sha256:
|
|
46
|
-
bound-lock/1 at=place:sha256:
|
|
47
|
-
bound-lock/1 at=place:sha256:
|
|
48
|
-
bound-lock/1 at=place:sha256:
|
|
49
|
-
bound-lock/1 at=place:sha256:
|
|
50
|
-
bound-lock/1 at=place:sha256:
|
|
51
|
-
bound-lock/1 at=place:sha256:
|
|
52
|
-
bound-lock/1 at=place:sha256:
|
|
53
|
-
bound-lock/1 at=place:sha256:
|
|
54
|
-
bound-lock/1 at=place:sha256:
|
|
55
|
-
bound-lock/1 at=place:sha256:
|
|
56
|
-
bound-lock/1 at=place:sha256:
|
|
57
|
-
bound-lock/1 at=place:sha256:
|
|
58
|
-
bound-lock/1 at=place:sha256:
|
|
59
|
-
bound-lock/1 at=place:sha256:
|
|
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
|