@lapxo/bound 0.2.1 → 0.2.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.
@@ -0,0 +1 @@
1
+ {"libraries":{"@lapxo/obligations/field":{"identity":"sha256:6cd93a688f1b0c5017a772cff1c27b29937d2844f4101f69a8dcc320e2fcb885","entry":"dist/field/field.js"},"@lapxo/obligations":{"identity":"sha256:6cd93a688f1b0c5017a772cff1c27b29937d2844f4101f69a8dcc320e2fcb885","entry":"dist/lattice/index.js"},"@lapxo/obligations/forms":{"identity":"sha256:6cd93a688f1b0c5017a772cff1c27b29937d2844f4101f69a8dcc320e2fcb885","entry":"dist/lattice/forms.js"},"@lapxo/obligations/views/field":{"identity":"sha256:6cd93a688f1b0c5017a772cff1c27b29937d2844f4101f69a8dcc320e2fcb885","entry":"dist/views/field.js"},"@lapxo/topos/wire":{"identity":"sha256:5a04d09a423c50fc18cefbd44bd50e2b6e5b2b5170de0a0935b7a275b0c4f1a7","entry":"dist/wire/index.js"}},"profile":"interval-min","inventory":"sha256:6f86e2a340e133c503594bb15c38916b5497aa6aa319cf1956f57a1d8c89d9ac","snapshots":[{"identity":"sha256:7ffa7c4e6258151785bf7af51455b51f2493a7802191e843ce512ba4ecfc0eb8","package":"@lapxo/bound","members":[{"coordinate":"dist/engine/encoding.js","digest":"sha256:cbce4fc176442aaeba9e22ff64694a79b200cae39231328b90b980de8baa84aa","source":"/** Shared, host-free UTF-8 encoding for protocol byte budgets. */\nexport const encodeUTF8 = (text) => new TextEncoder().encode(text);\n"},{"coordinate":"dist/engine/index.js","digest":"sha256:e9012fd46c05050ed611878d1ea5eb108097430a741e161d58cf1dc72238db60","source":"/**\n * Pure projection of already admitted typed-object records.\n * Input is the effective history already admitted by the host, preserving cell\n * declarations before uses within each epoch and a deterministic selected context.\n * This API performs no admission,\n * signature verification, storage, transport, clock selection or execution.\n * Object operations delegate to the existing Obligations implementation.\n */\nexport { objectFold } from \"./object.js\";\n// Optional host operations are explicit and injected; objectFold itself never invokes them.\nexport { readContent, retainContent, invokeSigningPort } from \"./ports.js\";\n"},{"coordinate":"dist/engine/object.js","digest":"sha256:1d8e2a37d187b4370ad2fb86383727dbc17a09351ab77799047213ce15f33dfc","source":"import { cell, sign, join, require as requireFloor, observe, mark, parts, state, live, restOf } from '@lapxo/obligations/views/field';\nimport { restCoordinates } from '@lapxo/topos/wire';\nexport function objectFold(records, context) {\n let world = new Map();\n const definitions = new Map(records.filter(r => r.record === 'cell').map(r => [r.fields.scope, r]));\n const codecs = new Map([...definitions].map(([name, c]) => [name, context.resolve(c)]));\n const ids = new Map(records.map(r => [r.fields.id, r]));\n for (const record of [...records].sort((a, b) => Number(a.fields.epoch) - Number(b.fields.epoch))) {\n const f = record.fields, name = f.scope, at = Number(f.epoch);\n if (record.record === 'cell') {\n world = new Map([...world, [name, cell(name, at, [], restCoordinates(f.restsOn))]]);\n continue;\n }\n const codec = codecs.get(name), L = codec.form.lattice(codec.params), held = world.get(name);\n if (record.record === 'claim') {\n const target = f.sign === '-1' ? ids.get(f.takes).fields : f;\n const changed = observe(held, { id: f.id, at, origin: target.origin, span: codec.form.parse(codec.params, target.value), ...(f.takes ? { takes: f.takes } : {}) }, f.sign === '-1' ? -1 : 1);\n const seen = [...changed.seen];\n seen[seen.length - 1] = { ...seen.at(-1), id: f.id };\n world = new Map([...world, [name, { ...changed, seen }]]);\n }\n else if (f.sign === '-1') {\n const target = ids.get(f.takes).fields;\n world = new Map([...world, [name, { ...held, marks: [...(held.marks ?? []), mark({ id: f.id, at, takes: f.takes, pole: target.pole, reach: 'local', span: codec.form.parse(codec.params, target.value) })] }]]);\n }\n else if (f.widens !== undefined) {\n const changed = join(L, held, codec.form.parse(codec.params, f.value), f.widens, at);\n const marks = [...(changed.marks ?? [])];\n marks[marks.length - 1] = { ...marks.at(-1), id: f.id };\n world = new Map([...world, [name, { ...changed, marks }]]);\n }\n else {\n const span = codec.form.parse(codec.params, f.value);\n world = f.pole === 'floor' ? requireFloor(L, world, name, span, { id: f.id, at }) : sign(L, world, name, span, { id: f.id, at });\n }\n }\n return [...world].map(([name, c]) => { const codec = codecs.get(name), L = codec.form.lattice(codec.params); return { cell: name, state: state(L, c, world), parts: parts(L, c, world), rest: restOf(c, world), ownMarks: live(c.marks ?? []).map(m => m.id), ownClaims: live(c.seen).map(s => ({ id: s.id, origin: s.origin })), marks: live(c.marks ?? []), claims: live(c.seen) }; });\n}\n"},{"coordinate":"dist/engine/ports.js","digest":"sha256:3f7162e409170fbda9be799a9058667d998b1308be9a46ca79c1a584693bb6a6","source":"import { signerRequestBytes, signerResponseBytes, signerResponseOf } from '@lapxo/topos/wire';\nimport { BoundRefusal } from \"../host/refusals.js\";\nimport { encodeUTF8 as encoded } from \"./encoding.js\";\nclass PortFault extends BoundRefusal {\n}\nconst fail = (code) => { throw new PortFault('host-port/' + code, 'REFUSE·host-port/' + code); };\nfunction limitsOf(limits) { if (!limits || !Number.isSafeInteger(limits.timeoutMs) || limits.timeoutMs < 1 || limits.timeoutMs > 2147483647 || !Number.isSafeInteger(limits.maxBytes) || limits.maxBytes < 1)\n fail('budget'); }\n/** The callback must cooperate with cancellation; JavaScript callbacks are not a sandbox. */\nasync function bounded(limits, signal, run) {\n limitsOf(limits);\n if (signal?.aborted)\n fail('cancelled');\n return new Promise((resolve, reject) => {\n const controller = new AbortController();\n let done = false;\n const finish = (code, value) => { if (done)\n return; done = true; clearTimeout(timer); signal?.removeEventListener('abort', abort); if (code) {\n controller.abort();\n reject(new BoundRefusal('host-port/' + code, 'REFUSE·host-port/' + code));\n }\n else\n resolve(value); };\n const abort = () => finish('cancelled'), timer = setTimeout(() => finish('timeout'), limits.timeoutMs);\n signal?.addEventListener('abort', abort, { once: true });\n if (signal?.aborted) {\n abort();\n return;\n }\n Promise.resolve().then(() => { if (done)\n fail('cancelled'); return run(controller.signal); }).then(value => finish(undefined, value), error => finish(error instanceof PortFault ? error.code.slice('host-port/'.length) : 'failed'));\n });\n}\nfunction owned(bytes, maxBytes) { if (!(bytes instanceof Uint8Array))\n fail('response'); if (bytes.byteLength > maxBytes)\n fail('budget'); if (typeof SharedArrayBuffer !== 'undefined' && bytes.buffer instanceof SharedArrayBuffer)\n fail('response'); return new Uint8Array(bytes); }\nconst identity = (digest) => { if (!/^sha256:[a-f0-9]{64}$/.test(digest))\n fail('integrity'); };\nexport async function readContent(source, digest, ports, limits, signal) {\n limitsOf(limits);\n identity(digest);\n return bounded(limits, signal, async (s) => { const bytes = owned(await ports.read(source, digest, s), limits.maxBytes); if (s.aborted)\n fail('cancelled'); if (await ports.digestBytes(new Uint8Array(bytes)) !== digest)\n fail('integrity'); if (s.aborted)\n fail('cancelled'); return bytes; });\n}\n/** Verify before invoking retention; no operation automatically writes the projected result. */\nexport async function retainContent(digest, bytes, ports, limits, signal) {\n limitsOf(limits);\n identity(digest);\n if (signal?.aborted)\n fail('cancelled');\n const copy = owned(bytes, limits.maxBytes);\n return bounded(limits, signal, async (s) => { if (await ports.digestBytes(new Uint8Array(copy)) !== digest)\n fail('integrity'); if (s.aborted)\n fail('cancelled'); const result = await ports.retain(digest, copy, s); if (result !== undefined)\n fail('response'); return Object.freeze({ digest, bytes: copy.byteLength }); });\n}\n/** Acquire protocol-shaped signatures only; the existing consent path verifies them and decides authority. */\nexport async function invokeSigningPort(lot, sign, limits, signal) {\n limitsOf(limits);\n if (!lot || !Array.isArray(lot.bytes))\n fail('budget');\n let size = 0;\n for (const bytes of lot.bytes) {\n if (typeof bytes !== 'string' || bytes.length > limits.maxBytes - size)\n fail('budget');\n size += encoded(bytes).length + 1;\n if (size > limits.maxBytes)\n fail('budget');\n }\n let request;\n try {\n request = signerRequestBytes(lot);\n }\n catch {\n return fail('response');\n }\n if (encoded(request).length > limits.maxBytes)\n fail('budget');\n const input = Object.freeze({ ...lot, bytes: Object.freeze([...lot.bytes]) });\n return bounded(limits, signal, async (s) => {\n const records = await sign(input, s);\n if (!Array.isArray(records) || records.length !== lot.bytes.length || records.some(r => !r || typeof r.signature !== 'string' || r.signature.length > limits.maxBytes))\n fail('response');\n let response;\n try {\n response = signerResponseBytes(records);\n }\n catch {\n return fail('response');\n }\n if (encoded(response).length > limits.maxBytes)\n fail('budget');\n try {\n return Object.freeze(signerResponseOf(response, lot).map(record => Object.freeze({ ...record })));\n }\n catch {\n return fail('response');\n }\n });\n}\n"},{"coordinate":"dist/host/refusals.js","digest":"sha256:c6254ec234fb4d04eeca0f126a2d5df728a8eb2f61c60736d1f81438311b0eea","source":"import { parse, canonical } from '@lapxo/topos/wire';\n/** Stable code assigned at the cause. Details are diagnostic, never parsed as policy. */\nexport class BoundRefusal extends Error {\n constructor(code, diagnostic) { super(diagnostic); this.name = 'BoundRefusal'; this.code = code; }\n}\n/** Pure machine contract reader. A catalog is data, never an authority grant. */\nexport function readRefusalCatalog(text) {\n const groups = new Map();\n let profile = false;\n for (const line of text.trimEnd().split('\\n')) {\n const parsed = parse(line);\n if (parsed.kind !== 'fact' || canonical(parsed.value.fields) !== line)\n throw new BoundRefusal('catalog/invalid', 'REFUSE·invalid refusal catalog line');\n const f = parsed.value.fields;\n if (f.scope === 'refusal/catalog' && f.measure === 'id' && f.value === 'bound-refusals@1' && f.role === 'writes' && f.form === 'alphabet' && !profile) {\n profile = true;\n continue;\n }\n if (f.role !== 'writes' || f.form !== 'alphabet' || !f.scope?.startsWith('refusal/') || !['code', 'class', 'next'].includes(f.measure ?? ''))\n throw new BoundRefusal('catalog/invalid', 'REFUSE·invalid refusal catalog record');\n const group = groups.get(f.scope) ?? new Map();\n if (group.has(f.measure))\n throw new BoundRefusal('catalog/invalid', 'REFUSE·duplicate refusal catalog field');\n group.set(f.measure, f);\n groups.set(f.scope, group);\n }\n const entries = [];\n for (const [scope, group] of groups) {\n const code = group.get('code')?.value, category = group.get('class')?.value, meaning = group.get('class')?.about, next = group.get('next')?.value;\n if (group.size !== 3 || !code || scope !== 'refusal/' + code || !category || !meaning || !next)\n throw new BoundRefusal('catalog/invalid', 'REFUSE·incomplete refusal catalog entry');\n entries.push(Object.freeze({ code, category, meaning, next }));\n }\n if (!profile || !entries.length)\n throw new BoundRefusal('catalog/invalid', 'REFUSE·missing refusal catalog profile');\n return Object.freeze(entries);\n}\nexport function describeRefusal(error, catalog) {\n const entry = catalog.find(row => row.code === error.code);\n if (!entry)\n throw new BoundRefusal('catalog/invalid', 'REFUSE·undeclared refusal code');\n return entry;\n}\n"}]},{"identity":"sha256:5a04d09a423c50fc18cefbd44bd50e2b6e5b2b5170de0a0935b7a275b0c4f1a7","package":"@lapxo/topos","members":[{"coordinate":"dist/authority/admit.js","digest":"sha256:eed858773ea11feeb518228aa6ba2a433245a3658257d6cc2fae4546faed01f3","source":"import { region, within } from '@lapxo/obligations/field';\n/** Segment boundary, not string prefix — `acme/user` must not bind `acme/userdata`. */\nexport function under(prefix, scope) {\n return prefix !== '' && within(region(scope, './'), region(prefix, './'));\n}\n"},{"coordinate":"dist/forms/alphabet.js","digest":"sha256:5d12162d8f5d58a6d2225780362386f5e8a98c11130257a4f42499fcedc977fe","source":"import { alphabetForm, WideMask } from '@lapxo/obligations';\nimport { alphabet } from \"../wire/grammar.js\";\nimport { refuseForm, wordsAt, written } from \"./form.js\";\nconst tokensOf = (params) => ({ tokens: wordsAt('alphabet', params, 'tokens') });\nexport const alphabetOfForm = {\n id: 'alphabet',\n lattice: (params) => alphabetForm.lattice(tokensOf(params)),\n parse(params, text) {\n const { tokens } = tokensOf(params);\n const read = alphabet(text);\n const stray = read.members.find((one) => !tokens.includes(one));\n if (stray !== undefined)\n refuseForm('alphabet', `\\`${stray}\\` is not one of its tokens`);\n return WideMask.fromTokens(tokens, new Set(read.polarity === 'forbid' ? tokens.filter((one) => !read.members.includes(one)) : read.members));\n },\n emit: (params, value) => written(value.members(tokensOf(params).tokens)),\n show: (params, value) => alphabetForm.lattice(tokensOf(params)).show(value),\n points: (params, seed, n) => alphabetForm.points(tokensOf(params), seed, n),\n};\n"},{"coordinate":"dist/forms/budget.js","digest":"sha256:8ee938a539fdab1d0d490c9713245b6b40a5d601987286e26654ad59661bb8a0","source":"import { continuousForm } from '@lapxo/obligations';\nimport { bandOf, bandText, numberAt } from \"./form.js\";\nconst span = (params) => ({ lo: numberAt('budget', params, 'lo'), hi: numberAt('budget', params, 'hi') });\nexport const budgetForm = {\n id: 'budget',\n lattice: (params) => continuousForm.lattice(span(params)),\n parse: (params, text) => bandOf('budget', span(params), text),\n emit: (_params, value) => bandText(value),\n show: (params, value) => continuousForm.lattice(span(params)).show(value),\n points: (params, seed, n) => continuousForm.points(span(params), seed, n),\n};\n"},{"coordinate":"dist/forms/configuration.js","digest":"sha256:b6693c3a172758c62ef2df67dc0b85ed0931247dfcc4853e30550c5bbfa3216c","source":"import { alphabetForm, alphabets, intervals } from '@lapxo/obligations/forms';\n/** Historical configuration adapters. Typed records use their selected form provider. */\nexport const INTERVALS = intervals(-Infinity, Infinity);\nexport const ALPHABETS = alphabets();\nconst UNIT = { K: 1e3, M: 1e6, G: 1e9 };\n/** An interval as the wire writes it: `lo..hi`, optional K/M/G, and `*` for an open end. */\nexport function spanOf(value) {\n const m = /^(-?\\d+(?:\\.\\d+)?)([KMG])?\\.\\.((-?\\d+(?:\\.\\d+)?)([KMG])?|\\*)$/.exec(value);\n if (!m)\n return null;\n const n = (num, u) => Number(num) * (u ? UNIT[u] : 1);\n return { lo: n(m[1], m[2]), hi: m[3] === '*' ? Infinity : n(m[4], m[5]) };\n}\n/** An alphabet as the wire writes it: `a|b`, `none`, or `not:a|b`. */\nexport function idsOf(value) {\n const forbid = value.startsWith('not:');\n return {\n polarity: forbid ? 'forbid' : 'permit',\n values: new Set((forbid ? value.slice(4) : value).split('|').filter((one) => one !== '' && one !== 'none')),\n };\n}\n/** Values of the historical configuration forms; no typed object projection or object valuation. */\nexport function configurationValues(values) {\n if (!values.length)\n return undefined;\n if (values[0].form === 'interval') {\n const read = values.map(one => spanOf(one.value));\n return read.every(one => one !== null) ? { L: INTERVALS, spans: read } : undefined;\n }\n if (values[0].form !== 'alphabet')\n return undefined;\n const rest = '\\u0000';\n const named = values.map(one => ({ forbid: one.value.startsWith('not:'), names: (one.value.startsWith('not:') ? one.value.slice(4) : one.value).split('|').filter(Boolean) }));\n const params = { tokens: [...new Set([rest, ...named.flatMap(one => one.names)])].sort() };\n return { L: alphabetForm.lattice(params), spans: named.map(one => alphabetForm.parse(params, { want: one.forbid ? params.tokens.filter(token => !one.names.includes(token)) : one.names })) };\n}\n"},{"coordinate":"dist/forms/declaration.js","digest":"sha256:3756504aa9af42b0bfde86d135c1b2e7872c816fed8aa2d567176a6a748f04e6","source":"import { alphabet, parse } from \"../wire/index.js\";\nconst unknown = (kind, why, distributive = null) => ({ kind, bits: null, premium: null, degenerate: null, why, distributive });\n/** Compare wire decimals without rounding distinct endpoints to the same floating-point number. */\nfunction compareDecimal(left, right) {\n const rational = (text) => {\n const [integer = '', fraction = ''] = text.split('.');\n return { numerator: BigInt(`${integer}${fraction}`), scale: 10n ** BigInt(fraction.length) };\n };\n const a = rational(left);\n const b = rational(right);\n const difference = a.numerator * b.scale - b.numerator * a.scale;\n return difference < 0n ? -1 : difference > 0n ? 1 : 0;\n}\n/**\n * A permitted alphabet is a subset lattice: n distinct tokens permit 2^n subsets, hence n bits. Its cardinality\n * valuation is modular, since |A|+|B| = |A union B|+|A intersection B|. The obligations premium therefore vanishes\n * for every declaration. Neither the powerset nor its order matrix needs to be materialized.\n *\n * An interval does not declare a discrete step. A non-singleton continuous band has no state count under the wire\n * contract, even when both endpoints happen to be integers; missing cardinality is not infinite measured freedom.\n */\nexport function declaredConfig(line) {\n const got = parse(line);\n if (got.kind !== 'fact')\n return unknown('invalid', got.why);\n const { form, value, type } = got.value.fields;\n if (type !== undefined)\n return unknown('unsupported', 'object freedom needs its selected valuation; a configuration estimate cannot measure it');\n if (form === undefined || value === undefined)\n return unknown('invalid', 'a declaration must name its form and value');\n if (value === 'withdraw')\n return unknown('inactive', 'a withdrawal declares no current freedom');\n if (form === 'alphabet') {\n let tokens;\n try {\n tokens = alphabet(value);\n }\n catch (error) {\n return unknown('invalid', error instanceof Error ? error.message : String(error));\n }\n if (tokens.polarity === 'forbid')\n return unknown('complement', 'the complement names exclusions but declares no universe to count');\n return { kind: 'finite', form, bits: new Set(tokens.members).size, premium: 0, degenerate: true, distributive: true };\n }\n if (form === 'interval') {\n const [lo = '', hi = ''] = value.split('..');\n if (lo === '*' || hi === '*')\n return unknown('unbounded', 'the interval has an open endpoint and declares no discrete state count', false);\n // The wire parser already validated decimal syntax. Equality and empty bands each leave no decision.\n const comparison = compareDecimal(lo, hi);\n if (comparison >= 0)\n return { kind: 'finite', form, bits: 0, premium: 0, degenerate: true, distributive: true };\n return unknown('continuous', 'the interval declares no discrete step or state count', false);\n }\n return unknown('unsupported', `freedom is not defined here for form ${form}`);\n}\n"},{"coordinate":"dist/forms/distribution.js","digest":"sha256:e3290d3ccbf4a54b5e2dcc44253077c87ee5c752d1278b89edb4c724f468814c","source":"import { latticeForm } from '@lapxo/obligations';\nimport { alphabet } from \"../wire/grammar.js\";\nimport { levelsOf, refuseForm, wordsAt, written } from \"./form.js\";\n/** A distribution is a product of levels by bucket: every tuple of one level per bucket, ordered bucket by bucket. */\nfunction product(params) {\n const buckets = wordsAt('distribution', params, 'buckets');\n const levels = wordsAt('distribution', params, 'levels');\n const tuples = buckets.reduce((held) => held.flatMap((tuple) => levels.map((level) => [...tuple, level])), [[]]);\n return { buckets, levels, tuples };\n}\nconst orderOver = (params) => {\n const { levels, tuples } = product(params);\n const at = (tuple) => tuple.map((level) => levels.findIndex((one) => one === level));\n return { levels: tuples.map((tuple) => JSON.stringify(tuple)), leq: tuples.map((low) => tuples.map((high) => at(low).every((rank, i) => rank <= (at(high)[i] ?? -1)))) };\n};\nexport const distributionForm = {\n id: 'distribution',\n lattice: (params) => latticeForm.lattice(orderOver(params)),\n parse(params, text) {\n const { buckets, levels } = product(params);\n const bucketOf = (part) => buckets.find((bucket) => !bucket.includes(':') && part.startsWith(`${bucket}:`));\n const members = alphabet(text).members;\n const said = new Map(members.flatMap((part) => ((bucket) => (bucket === undefined ? [] : [[bucket, part.slice(bucket.length + 1)]]))(bucketOf(part))));\n const stray = members.find((part) => bucketOf(part) === undefined) ?? buckets.find((bucket) => !said.has(bucket));\n if (stray !== undefined)\n refuseForm('distribution', `\\`${stray}\\` is not the bucket list it is given, every bucket named once`);\n const bands = buckets.map((bucket) => levelsOf('distribution', levels, said.get(bucket) ?? ''));\n return { subject: '', floor: JSON.stringify(bands.map((band) => band.floor)), ceiling: JSON.stringify(bands.map((band) => band.ceiling)) };\n },\n emit(params, value) {\n const [lows, highs] = [JSON.parse(value.floor), JSON.parse(value.ceiling)];\n return written(product(params).buckets.map((bucket, i) => (lows[i] === highs[i] ? `${bucket}:${lows[i]}` : `${bucket}:${lows[i]}..${highs[i]}`)));\n },\n show: (params, value) => latticeForm.lattice(orderOver(params)).show(value),\n points: (params, seed, n) => latticeForm.points(orderOver(params), seed, n),\n};\n"},{"coordinate":"dist/forms/form.js","digest":"sha256:3f76cda3af20741c99559449d9c7d8eba32f8e221b8dc7da3f324acad7d924e4","source":"import { violationsIn as lawsBrokenIn } from '@lapxo/obligations';\nimport { alphabet } from \"../wire/grammar.js\";\nimport { fromLine } from \"../wire/claimline.js\";\nimport { byBytes, canonical } from \"../wire/line.js\";\nimport { decimal } from \"../wire/values.js\";\nexport const violationsIn = (lattice, points) => lawsBrokenIn(lattice, points);\nexport const paramsOf = (params) => (params !== null && typeof params === 'object' ? params : {});\nexport function refuseForm(id, why) {\n throw new Error(`REFUSE·form ${id}: ${why}`);\n}\nexport function numberAt(id, params, name) {\n const held = paramsOf(params)[name];\n if (typeof held !== 'number' || !isFinite(held))\n refuseForm(id, `takes ${name} as a number, and a value it is not given is not invented`);\n return held;\n}\nexport function wordsAt(id, params, name) {\n const held = paramsOf(params)[name];\n if (!Array.isArray(held) || !held.length || held.some((one) => typeof one !== 'string'))\n refuseForm(id, `takes ${name} as a list of words`);\n return held;\n}\nexport const written = (words) => alphabet({ polarity: 'permit', members: [...new Set(words)].sort(byBytes) });\n/**\n * A band a line writes over an interval it is given: `lo..hi`, one end alone, `*` for an end left open, or `empty`.\n * Its ends are read by the wire's own interval form, the one a claim's value is read by, and one end alone is that end twice.\n */\nexport function bandOf(id, whole, text) {\n if (text === 'empty')\n return { lo: whole.hi, hi: whole.lo };\n const read = (value) => ((got) => (got.kind === 'fact' && got.value.bound.kind === 'interval' ? { lo: got.value.bound.lo ?? whole.lo, hi: got.value.bound.hi ?? whole.hi } : undefined))(fromLine(canonical({ form: 'interval', value }), null));\n return read(text) ?? read(`${text}..${text}`) ?? refuseForm(id, `\\`${text}\\` is not a band: lo..hi or one end, each a number or *`);\n}\nexport const bandText = (value) => ((end) => (value.lo > value.hi ? 'empty' : `${end(value.lo)}..${end(value.hi)}`))((n) => (isFinite(n) ? decimal(n) : '*'));\n/** A band a line writes over levels it is given, `lo..hi` or one level alone: the band of them whose written text it is. */\nexport function levelsOf(id, held, text) {\n if (held.some((level) => level.includes('..')))\n refuseForm(id, 'a level holds no band mark `..`');\n const band = held.flatMap((floor) => held.map((ceiling) => ({ subject: '', floor, ceiling }))).find(({ floor, ceiling }) => text === `${floor}..${ceiling}`)\n ?? (text.includes('..') ? undefined : held.filter((level) => level === text).map((level) => ({ subject: '', floor: level, ceiling: level }))[0]);\n return band ?? refuseForm(id, `\\`${text}\\` is not one of its levels, nor two of them as lo..hi`);\n}\n"},{"coordinate":"dist/forms/index.js","digest":"sha256:ab5ae549791c03be6e4746f7a7ef1a176e13a57de3aaf6830c3b30fa25f32f04","source":"import { alphabetOfForm } from \"./alphabet.js\";\nimport { budgetForm } from \"./budget.js\";\nimport { distributionForm } from \"./distribution.js\";\nimport { intervalForm } from \"./interval.js\";\nimport { ladderOfForm } from \"./ladder.js\";\nimport { latticeOfForm } from \"./lattice.js\";\nimport { phaseForm } from \"./phase.js\";\nimport { rankForm } from \"./rank.js\";\nimport { stretchForm } from \"./stretch.js\";\nexport { violationsIn } from \"./form.js\";\nexport { alphabetOfForm, budgetForm, distributionForm, intervalForm, ladderOfForm, latticeOfForm, phaseForm, rankForm, stretchForm };\nexport { ALPHABETS, INTERVALS, idsOf, spanOf, configurationValues } from \"./configuration.js\";\nexport { declaredConfig } from \"./declaration.js\";\n"},{"coordinate":"dist/forms/interval.js","digest":"sha256:16a7ba6019199fcebbc0555ae8ac9af83fcbba7be2bac167d488d8dc6bcf7364","source":"import { continuousForm } from '@lapxo/obligations';\nimport { bandOf, bandText, numberAt } from \"./form.js\";\nconst span = (params) => ({ lo: numberAt('interval', params, 'lo'), hi: numberAt('interval', params, 'hi') });\nexport const intervalForm = {\n id: 'interval',\n lattice: (params) => continuousForm.lattice(span(params)),\n parse: (params, text) => bandOf('interval', span(params), text),\n emit: (_params, value) => bandText(value),\n show: (params, value) => continuousForm.lattice(span(params)).show(value),\n points: (params, seed, n) => continuousForm.points(span(params), seed, n),\n};\n"},{"coordinate":"dist/forms/ladder.js","digest":"sha256:b31ddfd1baa9496e777a46eee181f78af46d90e8bf0875535bab08cf8188571d","source":"import { ladderForm } from '@lapxo/obligations';\nimport { levelsOf, wordsAt } from \"./form.js\";\nconst over = (params) => ({ levels: wordsAt('ladder', params, 'levels') });\nexport const ladderOfForm = {\n id: 'ladder',\n lattice: (params) => ladderForm.lattice(over(params)),\n parse: (params, text) => levelsOf('ladder', over(params).levels, text),\n emit: (_params, value) => (value.floor === value.ceiling ? value.floor : `${value.floor}..${value.ceiling}`),\n show: (params, value) => ladderForm.lattice(over(params)).show(value),\n points: (params, seed, n) => ladderForm.points(over(params), seed, n),\n};\n"},{"coordinate":"dist/forms/lattice.js","digest":"sha256:3542e51164f5452997728dbdcee4f6c5a9ff36f211679e595e9f4ae99dce2f9f","source":"import { latticeForm } from '@lapxo/obligations';\nimport { levelsOf, paramsOf, refuseForm, wordsAt } from \"./form.js\";\n/** An order a line names outright: its levels and, for each pair, whether the first lies under the second. */\nfunction orderOf(params) {\n const levels = wordsAt('lattice', params, 'levels');\n const leq = paramsOf(params)['leq'];\n if (!Array.isArray(leq) || leq.length !== levels.length || leq.some((row) => !Array.isArray(row) || row.length !== levels.length))\n refuseForm('lattice', 'takes leq as a square of truths over its levels');\n return { levels, leq: leq };\n}\nexport const latticeOfForm = {\n id: 'lattice',\n lattice: (params) => latticeForm.lattice(orderOf(params)),\n parse: (params, text) => levelsOf('lattice', orderOf(params).levels, text),\n emit: (_params, value) => (value.floor === value.ceiling ? value.floor : `${value.floor}..${value.ceiling}`),\n show: (params, value) => latticeForm.lattice(orderOf(params)).show(value),\n points: (params, seed, n) => latticeForm.points(orderOf(params), seed, n),\n};\n"},{"coordinate":"dist/forms/phase.js","digest":"sha256:5a0a880fe3d03543d6042e920548c276b3731216810e8791b0d2188fa80dd1ee","source":"import { continuousForm } from '@lapxo/obligations';\nimport { bandOf, bandText, numberAt } from \"./form.js\";\nconst span = (params) => ({ lo: numberAt('phase', params, 'lo'), hi: numberAt('phase', params, 'hi') });\nexport const phaseForm = {\n id: 'phase',\n lattice: (params) => continuousForm.lattice(span(params)),\n parse: (params, text) => bandOf('phase', span(params), text),\n emit: (_params, value) => bandText(value),\n show: (params, value) => continuousForm.lattice(span(params)).show(value),\n points: (params, seed, n) => continuousForm.points(span(params), seed, n),\n};\n"},{"coordinate":"dist/forms/rank.js","digest":"sha256:9f851ab5018d6b01b16b07ea9eb81f1ef197cc7c7dc3336d512c5b5154877c0b","source":"import { continuousForm } from '@lapxo/obligations';\nimport { bandOf, bandText, numberAt } from \"./form.js\";\nconst span = (params) => ({ lo: 0, hi: numberAt('rank', params, 'n') });\nexport const rankForm = {\n id: 'rank',\n lattice: (params) => continuousForm.lattice(span(params)),\n parse: (params, text) => bandOf('rank', span(params), text),\n emit: (_params, value) => bandText(value),\n show: (params, value) => continuousForm.lattice(span(params)).show(value),\n points: (params, seed, n) => continuousForm.points(span(params), seed, n),\n};\n"},{"coordinate":"dist/forms/stretch.js","digest":"sha256:1ecbd9c9d26c5203b560826702bfc93a6d9f534f38814b357681169a07373413","source":"import { continuousForm } from '@lapxo/obligations';\nimport { bandOf, bandText, numberAt } from \"./form.js\";\nconst span = (params) => ({ lo: numberAt('stretch', params, 'lo'), hi: numberAt('stretch', params, 'hi') });\nexport const stretchForm = {\n id: 'stretch',\n lattice: (params) => continuousForm.lattice(span(params)),\n parse: (params, text) => bandOf('stretch', span(params), text),\n emit: (_params, value) => bandText(value),\n show: (params, value) => continuousForm.lattice(span(params)).show(value),\n points: (params, seed, n) => continuousForm.points(span(params), seed, n),\n};\n"},{"coordinate":"dist/wire/act-result.js","digest":"sha256:ad887d08993ca71741cb3333ca67251ef64c24da5248a0abdad92ccc448108da","source":"import { byBytes, canonical, parse, signedBytes } from \"./line.js\";\nimport { parseSignature } from \"./sig.js\";\nconst refuse = (why) => { throw new Error(`REFUSE·act ${why}`); };\nconst fieldsOf = (line, signed = true) => {\n const got = parse(line);\n if (got.kind !== 'fact' || canonical(got.value.fields) !== line)\n return refuse('noncanonical record');\n const fields = got.value.fields;\n if (!fields['by'] || (signed && !parseSignature(fields['sig'] ?? ''))\n || (fields['sig'] !== undefined && !parseSignature(fields['sig'])))\n return refuse('unsigned or invalid record');\n return fields;\n};\nconst epochOf = (fields) => {\n const text = fields['epoch'] ?? '';\n const epoch = Number(text);\n if (!/^(0|[1-9][0-9]*)$/.test(text) || !Number.isSafeInteger(epoch))\n return refuse('invalid local epoch');\n return epoch;\n};\n/** An act is ordered signed payload, not a standing or an unordered set.\n * Only sig is excluded; by, epoch and every signed field remain covered.\n * Re-delivery does not add a record; duplicate payloads inside a lot refuse.\n */\nexport function actBytes(records) {\n if (!records.length)\n return refuse('empty lot');\n const payloads = records.map(line => signedBytes(fieldsOf(line)));\n if (new Set(payloads).size !== payloads.length)\n return refuse('duplicate record');\n for (const line of records)\n epochOf(fieldsOf(line));\n return payloads.join('\\n') + '\\n';\n}\n/** The declared receiving coordinate/context separates deliveries of the same\n * payload to different places. This header is identity framing, not an admitted\n * claim or a receipt. It contains logical coordinates, never display paths.\n */\nexport function actIdentity(records, contract) {\n if (!contract.scope || !contract.context)\n return refuse('missing receipt contract');\n const payload = actBytes(records);\n const placements = contract.placements;\n let routing = '';\n if (placements !== undefined) {\n const assigned = new Set(), places = new Set(), all = new Set(records);\n for (const placement of placements) {\n if (!placement.place || places.has(placement.place)\n || (placement.place !== '.' && (placement.place.startsWith('/') || placement.place.split('/').some(step => !step || step === '.' || step === '..'))))\n return refuse('invalid receiving coordinate');\n places.add(placement.place);\n for (const record of placement.records) {\n if (!all.has(record))\n return refuse('placement contains an uncommitted record');\n assigned.add(record);\n }\n }\n if (assigned.size !== all.size)\n return refuse('unassigned committed record');\n routing = [...placements].sort((a, b) => byBytes(a.place, b.place)).map(placement => canonical({\n scope: placement.place, role: 'writes', form: 'alphabet', measure: 'digest',\n value: contract.digest(actBytes(placement.records)), at: contract.context, by: 'target',\n })).join('\\n') + '\\n';\n }\n if (contract.localEpoch !== undefined && (!Number.isSafeInteger(contract.localEpoch) || contract.localEpoch < 0))\n return refuse('invalid commit epoch');\n return contract.digest(canonical({ scope: contract.scope, at: contract.context, ...(contract.localEpoch === undefined ? {} : { epoch: String(contract.localEpoch) }) }) + '\\n' + payload + routing);\n}\n/** Authenticate the public projection of a committed local act, using the\n * existing native digest receipt. This neither commits storage nor proves\n * conformance; the host publishes the records and receipt atomically.\n * Foreign history belongs to ingress and keeps its separate clock.\n */\nexport function actResultOf(records, receipt, contract) {\n const identity = actIdentity(records, contract);\n const fields = fieldsOf(receipt, false);\n const epoch = epochOf(fields);\n if (fields['scope'] !== contract.scope || fields['at'] !== contract.context\n || fields['role'] !== 'writes' || fields['form'] !== 'alphabet'\n || fields['measure'] !== 'digest' || fields['value'] !== identity)\n return refuse('receipt does not bind this act');\n // The receipt carries the local commit clock. Record clocks remain signed,\n // immutable inputs; admission checks their kind under that local clock.\n for (const line of records)\n if (contract.admitsRecord(line, epoch) !== true)\n return refuse('record not admitted');\n if (contract.verifiesReceipt(receipt) !== true)\n return refuse('receipt does not verify');\n return { identity, epoch, records: [...records], receipt };\n}\n/** Select only an explicitly admitted native result profile. Historical locks\n * without this selector retain their existing publication contract. */\nexport function actResultProfile(lines) {\n const value = (scope) => {\n const values = [...new Set(lines.flatMap(line => { const p = parse(line); return p.kind === 'fact' && p.value.fields['scope'] === scope && p.value.fields['role'] === 'writes' && p.value.fields['value'] !== 'withdraw' ? [p.value.fields['value']] : []; }))];\n if (values.length > 1)\n return refuse('conflicting ' + scope);\n return values[0];\n };\n const profile = value('wire/act-result');\n if (profile === undefined)\n return undefined;\n if (profile !== 'local-act@1')\n return refuse('unsupported result profile');\n const scope = value('wire/act-result-scope'), context = value('wire/act-result-context');\n if (!scope || !context)\n return refuse('incomplete result profile');\n return { scope, context };\n}\n"},{"coordinate":"dist/wire/claimline.js","digest":"sha256:aadc3029a57954d3cce9ebc01d13e29887a7bc77fb4c55ad3644406ec520028b","source":"/**\n * The wire reads itself: a claim is read by the lock of the wire that stood when it was signed. Its fields, their\n * alphabets and forms, and the algorithms its digests and signatures name, are lines of that lock with an epoch —\n * never a grammar compiled here and never a file this reads. What stays compiled is the line and the forms of the\n * algebra; every name the wire admits arrives as a claim. The fields that say who signed and when, its envelope, never\n * make two claims different claims.\n */\nimport { intervals } from '@lapxo/obligations';\nimport { objectFromFields } from \"./object-record.js\";\nimport { parse as parseLine } from \"./line.js\";\nimport { abstain, fact, refuse } from \"./outcome.js\";\nimport { unpipe, boundOf, REF_RELATIONS, BOUND_FORMS } from \"./values.js\";\nimport { outranks, passes, region, resolution, within } from '@lapxo/obligations/field';\nimport { parseSignature } from \"./sig.js\";\nimport { under } from \"../authority/admit.js\";\nexport const ENVELOPE = new Set(['sig', 'expires', 'repo', 'by', 'epoch']);\nconst WITHDRAW = 'withdraw';\nconst WIRE = 'wire/';\nconst WAS = 'audit/wire/';\nexport function isWireClaim(fields) {\n const scope = fields['scope'] ?? '';\n return scope.startsWith(WIRE) || scope.startsWith(WAS);\n}\nfunction listOf(scope) {\n if (scope.startsWith(WAS))\n return scope.slice(WAS.length);\n if (scope.startsWith(WIRE))\n return scope.slice(WIRE.length);\n return undefined;\n}\nfunction epochOf(fields) {\n const value = fields['epoch'] ?? '';\n return /^\\d+$/.test(value) ? Number(value) : 0;\n}\nfunction names(withdraw, line) {\n return Object.keys(withdraw).filter((k) => k !== 'value' && !ENVELOPE.has(k)).every((k) => line[k] === withdraw[k]);\n}\nexport function wireAt(lines, epoch) {\n const mine = lines.filter((f) => listOf(f['scope'] ?? '') !== undefined && epochOf(f) <= epoch);\n const withdrawals = mine.filter((f) => f['value'] === WITHDRAW);\n // A writer can revise its own alphabet at a newer epoch. Independent live\n // declarations must agree; a tie is disagreement, never an empty alphabet.\n const candidates = new Map();\n for (const f of mine) {\n if (f['value'] === WITHDRAW || withdrawals.some(w => names(w, f)))\n continue;\n const key = (listOf(f['scope'] ?? '') ?? '') + '\\0' + (f['by'] ?? '');\n const held = candidates.get(key) ?? [];\n const newest = held.length ? epochOf(held[0]) : -1;\n if (epochOf(f) > newest)\n candidates.set(key, [f]);\n else if (epochOf(f) === newest)\n candidates.set(key, [...held, f]);\n }\n const live = [...candidates.values()].flatMap(rows => rows.some(f => (f['scope'] ?? '').startsWith(WIRE)) ? rows.filter(f => (f['scope'] ?? '').startsWith(WIRE)) : rows);\n const values = new Map();\n for (const f of live) {\n const key = listOf(f['scope'] ?? '') ?? '', prior = values.get(key);\n if (prior !== undefined && prior !== f['value'])\n throw Error(`REFUSE·wire wire/${key} has conflicting live declarations`);\n values.set(key, f['value'] ?? '');\n }\n const standing = new Map();\n for (const f of mine) {\n const key = listOf(f['scope'] ?? '') ?? '';\n if (f['value'] === WITHDRAW || withdrawals.some((w) => names(w, f)))\n continue;\n const held = standing.get(key);\n const newer = held === undefined || epochOf(f) > epochOf(held)\n || (epochOf(f) === epochOf(held) && (f['scope'] ?? '').startsWith(WIRE) && (held['scope'] ?? '').startsWith(WAS));\n if (newer)\n standing.set(key, f);\n }\n if (!standing.size)\n return null;\n const ids = (name) => new Set((standing.get(name)?.['value'] ?? '').split('|').filter(Boolean));\n const formOf = new Map([...standing]\n .filter(([name]) => name.startsWith('form/'))\n .map(([name, f]) => [name.slice('form/'.length), f['value'] ?? '']));\n const lists = new Map([...standing.keys()]\n .filter((name) => !name.includes('/'))\n .map((name) => [name, ids(name)]));\n return {\n epoch,\n ...(standing.has('object/types') ? { object: {\n activation: epochOf(standing.get('object/types')),\n types: ids('object/types'), common: ids('object/common'), reserved: ids('object/reserved'), configuration: ids('object/allowed/config'),\n required: new Map([...standing.keys()].filter(k => k.startsWith('object/required/')).map(k => [k.slice('object/required/'.length), ids(k)])),\n allowed: new Map([...standing.keys()].filter(k => k.startsWith('object/allowed/')).map(k => [k.slice('object/allowed/'.length), ids(k)])),\n } } : {}),\n fields: ids('fields'),\n required: ids('required'),\n roles: ids('roles'),\n forms: ids('forms'),\n classes: ids('at-classes'),\n digests: new Set([...ids('digest-algorithms')].map((one) => one.split(':')[0])),\n signatures: ids('signature-algorithms'),\n formOf,\n lists,\n };\n}\nfunction admittedDigest(value, wire) {\n const colon = value.indexOf(':');\n return colon > 0 && wire.digests.has(value.slice(0, colon)) && /^[0-9a-f]+$/i.test(value.slice(colon + 1));\n}\nfunction isRegion(need) {\n if (need.startsWith('/') || /[\\s\\\\]/.test(need))\n return false;\n const steps = need.split('/').filter((step) => step !== '');\n return steps.length > 0 && steps.every((step, i) => step !== '.' && step !== '..' && (!step.includes('*') || i === steps.length - 1));\n}\nconst FIELD_FORMS = {\n region: (value) => value.split('|').filter(Boolean).every(isRegion),\n class: (value, wire) => {\n const colon = value.indexOf(':');\n if (colon <= 0 || !wire.classes.has(value.slice(0, colon)))\n return false;\n const rest = value.slice(colon + 1);\n return !/^[a-z0-9-]+:[0-9a-f]{16,}$/i.test(rest) || admittedDigest(rest, wire);\n },\n signature: (value, wire) => {\n const got = parseSignature(value);\n if (got === null || !wire.signatures.has(got.algorithm))\n return false;\n const era = got.algorithm.slice(got.algorithm.lastIndexOf(':') + 1);\n return admittedDigest(got.algorithm, wire) || (got.algorithm.includes(':') && (wire.lists.get('era')?.has(era) ?? false));\n },\n count: (value) => /^\\d+$/.test(value),\n};\nfunction debit(field, why) {\n return refuse(why, field);\n}\nexport function fromLine(text, wire, grammars) {\n const line = parseLine(text, { preserveKeys: true });\n if (line.kind !== 'fact') {\n return line.kind === 'abstain' ? abstain(line.why) : refuse(line.why, line.named);\n }\n const f = line.value.fields;\n const keys = line.value.keys;\n if (keys.includes('type')) {\n if (!wire?.object)\n return refuse('typed object grammar is not admitted at this epoch', 'type');\n if (!wire.object.configuration.size || !wire.object.reserved.size || [...wire.object.reserved].some(k => wire.object.configuration.has(k)))\n return refuse('typed wire has no closed configuration/object field contract', 'type');\n const got = objectFromFields(f, keys, wire.object, wire.fields, wire.forms);\n if (got.kind !== 'fact')\n return got;\n if (!FIELD_FORMS.signature(f.sig, wire))\n return refuse('object signature grammar is not admitted', 'sig');\n if (got.value.record === 'cell' && !admittedDigest(f.topos, wire))\n return refuse('cell topos is not an admitted digest', 'topos');\n if (got.value.record === 'cell' && (f.restsOn ?? '').split('|').some(name => admittedDigest(name, wire)))\n return refuse('cell restsOn names coordinates, not byte digests', 'restsOn');\n return got;\n }\n if (wire) {\n if (wire.object) {\n if (!wire.object.configuration.size || !wire.object.reserved.size || [...wire.object.reserved].some(k => wire.object.configuration.has(k)))\n return refuse('typed wire has no closed configuration/object field contract', 'type');\n const reserved = keys.find(k => wire.object.reserved.has(k) || !wire.object.configuration.has(k));\n if (reserved)\n return refuse(`\\`${reserved}=\\` is an object-only field: untyped configuration cannot carry it`, reserved);\n }\n for (const k of Object.keys(f))\n if (!wire.fields.has(k))\n return debit(k, `\\`${k}=\\` is not a field of the wire at epoch ${wire.epoch}`);\n for (const k of wire.required)\n if (f[k] === undefined)\n return debit(k, `a claim with no \\`${k}\\``);\n for (const [k, form] of wire.formOf) {\n const v = f[k];\n if (v === undefined)\n continue;\n const ids = wire.lists.get(form);\n const reads = FIELD_FORMS[form] ?? (ids ? (value) => ids.has(value) : undefined);\n if (!reads)\n return abstain(`\\`${k}\\` takes the form ${form}, which this reader does not know`);\n if (!reads(v, wire))\n return debit(k, `\\`${k}=${v}\\` is not a ${form} of the wire at epoch ${wire.epoch}`);\n }\n if (f.role !== undefined && !wire.roles.has(f.role))\n return abstain(`\\`role=${f.role}\\` is a role this wire does not name`);\n if (!wire.forms.has(f.form ?? ''))\n return abstain(`\\`form=${f.form}\\` is a form this wire does not name`);\n }\n const listed = Array.isArray(grammars) ? grammars : undefined;\n const bound = f.value === WITHDRAW ? { kind: 'enumerated', values: [WITHDRAW] } : boundOf(f.form ?? '', f.value ?? '', listed);\n if (bound === null) {\n const mine = BOUND_FORMS.includes(f.form ?? '') || (listed?.some((g) => g.form === f.form) ?? false);\n return mine\n ? debit('value', `\\`${f.value}\\` is not a ${f.form}`)\n : abstain(`\\`form=${f.form}\\` is a form this reader does not know`);\n }\n const role = f.role === 'writes' ? 'writes' : f.role === 'demands' ? 'demands' : 'reads';\n const extra = {};\n for (const [k, v] of Object.entries(f)) {\n if (['scope', 'measure', 'form', 'value', 'by', 'at', 'role', 'unit', 'multiplicity', 'epoch', 'ref', 'to', 'ref_by'].includes(k))\n continue;\n extra[k] = v;\n }\n const rel = f.ref;\n const to = f.to === undefined ? null : unpipe(f.to);\n const reference = rel && to && REF_RELATIONS.includes(rel)\n ? { rel, to, by: f.ref_by === 'declared' ? 'declared' : 'inferred' }\n : null;\n return fact({\n scope: f.scope ?? '',\n measure: f.measure ?? '',\n bound,\n role,\n by: f.by ?? '',\n at: f.at ?? '',\n ...(f.unit !== undefined ? { unit: f.unit } : {}),\n ...(f.multiplicity === 'one' || f.multiplicity === 'many' || f.multiplicity === 'unknown'\n ? { multiplicity: f.multiplicity }\n : {}),\n ...(f.epoch !== undefined ? { epoch: f.epoch } : {}),\n ...(reference ? { reference } : {}),\n extra,\n });\n}\nconst KEYS = 'keys';\nexport function isKeyClaim(fields) {\n const scope = fields['scope'] ?? '';\n return scope === KEYS || scope.startsWith(`${KEYS}/`);\n}\nfunction depthWindow(value) {\n const m = /^(\\d+)\\.\\.(\\d+)$/.exec(value);\n return m ? { lo: Number(m[1]), hi: Number(m[2]) } : null;\n}\nconst EPOCHS = intervals(-Infinity, Infinity);\nconst QUORUMS = intervals(1, Infinity);\nfunction windowOf(signer) {\n return signer.epoch ?? { start: 0, close: null };\n}\nexport function windowAt(signer, epoch) {\n const now = windowOf(signer);\n const standing = (signer.windows ?? []).filter((w) => epoch >= w.from && (w.to === null || epoch < w.to));\n return standing.length ? { start: now.start, close: standing.reduce((held, w) => EPOCHS.meet(held, w), EPOCHS.top).hi } : now;\n}\nfunction inside(signer, epoch) {\n const w = windowAt(signer, epoch);\n return epoch >= w.start && (w.close === null || epoch <= w.close);\n}\nfunction standsUntil(said) {\n const claim = (f) => [f['role'], f['form'], f['at']].join(' ');\n const withdrawn = new Map();\n for (const f of said)\n if (f['value'] === 'withdraw')\n withdrawn.set(claim(f), EPOCHS.meet(withdrawn.get(claim(f)) ?? EPOCHS.top, { lo: -Infinity, hi: epochOf(f) }));\n return (f) => withdrawn.get(claim(f))?.hi ?? null;\n}\n/**\n * What a key covers, and when it may sign, line by line: each coverage or epoch line stands from the epoch it was signed\n * at until a withdraw of the same claim, named by its at, lands; what it allowed before stays allowed for what was signed\n * then, and nothing signed after is allowed by it. Windows standing together close at the nearer, so only a withdraw\n * widens, and never for a line signed before it. A withdrawn line is never counted again.\n */\nfunction coverageOver(said) {\n const until = standsUntil(said);\n const spans = said.filter((f) => f['value'] !== 'withdraw').map((f) => ({ globs: (f['value'] ?? '').split('|').filter(Boolean), from: epochOf(f), to: until(f) }))\n .filter((span) => span.to === null || span.from < span.to);\n return { coverage: [...new Set(spans.filter((span) => span.to === null).flatMap((span) => span.globs))], spans };\n}\nfunction windowsOver(said) {\n const until = standsUntil(said);\n return said.filter((f) => f['value'] !== 'withdraw').flatMap((f) => ((w) => (w === null ? [] : [{ ...w, from: epochOf(f), to: until(f) }]))(depthWindow(f['value'] ?? '')))\n .filter((w) => w.to === null || w.from < w.to);\n}\nexport function signersOf(lines, root, verify) {\n const quorumLines = lines\n .filter((f) => f['scope'] === KEYS && f['measure'] === 'quorum' && f['by'] === root.id && verify(f, root.publicKey))\n .sort((a, b) => epochOf(a) - epochOf(b));\n const quorumAt = (epoch) => {\n const standing = quorumLines.filter((f) => epochOf(f) <= epoch).pop();\n return QUORUMS.meet(QUORUMS.top, depthWindow(standing?.['value'] ?? '') ?? QUORUMS.top).lo;\n };\n const ids = [...new Set(lines\n // Only authority declarations introduce candidates; host transport metadata does not.\n .filter(f => ['class', 'public-key', 'coverage', 'epoch'].includes(f['measure'] ?? ''))\n .map((f) => f['scope'] ?? '')\n .filter((scope) => scope.startsWith(`${KEYS}/`))\n .map((scope) => scope.slice(KEYS.length + 1)))];\n const closedAt = (signer, closes) => {\n const close = closes.get(signer.id);\n return close === undefined ? signer : { ...signer, epoch: { start: windowOf(signer).start, close } };\n };\n const claimsOn = (admitted, id, measure) => lines.filter((f) => {\n const admitter = admitted.get(f['by'] ?? '');\n return f['scope'] === `${KEYS}/${id}` && f['measure'] === measure && admitter !== undefined\n && admitter.keyClass === 'authorize' && inside(admitter, epochOf(f)) && verify(f, admitter.publicKey);\n });\n const admitUnder = (closes) => {\n const admitted = new Map([[root.id, closedAt(root, closes)]]);\n for (let grew = true; grew;) {\n grew = false;\n for (const id of ids) {\n if (admitted.has(id))\n continue;\n const classLines = claimsOn(admitted, id, 'class');\n const withdrawn = new Set(classLines.filter((f) => f['value'] === 'withdraw').map((f) => `${f['by'] ?? ''} ${f['at'] ?? ''}`));\n const counted = classLines\n .filter((f) => f['value'] !== 'withdraw' && !withdrawn.has(`${f['by'] ?? ''} ${f['at'] ?? ''}`))\n .sort((a, b) => epochOf(a) - epochOf(b));\n const history = classLines.filter((f) => f['value'] !== 'withdraw').sort((a, b) => epochOf(a) - epochOf(b));\n const admitters = [];\n let start = null;\n for (const f of history) {\n const by = f['by'] ?? '';\n if (!admitters.includes(by))\n admitters.push(by);\n if (admitters.length >= quorumAt(epochOf(f))) {\n start = epochOf(f);\n break;\n }\n }\n const publicKey = claimsOn(admitted, id, 'public-key')[0]?.['value'] ?? '';\n if (start === null || !counted.length || !publicKey)\n continue;\n const born = lines.some((f) => (f['by'] ?? '') === id && epochOf(f) === 1 && !(f['scope'] ?? '').startsWith(`${KEYS}/`));\n const covered = coverageOver(claimsOn(admitted, id, 'coverage'));\n admitted.set(id, closedAt({\n id,\n keyClass: counted.every((f) => f['value'] === 'authorize') ? 'authorize' : 'attest',\n publicKey,\n coverage: covered.coverage,\n spans: born ? covered.spans.map((span) => ({ ...span, from: Math.min(span.from, 1) })) : covered.spans,\n windows: windowsOver(claimsOn(admitted, id, 'epoch')),\n depth: depthWindow(claimsOn(admitted, id, 'resolution')[0]?.['value'] ?? '') ?? { lo: 1, hi: 1 },\n admittedBy: admitters,\n epoch: { start: born ? Math.min(start, 1) : start, close: null },\n }, closes));\n grew = true;\n }\n }\n return admitted;\n };\n let closes = new Map();\n for (let round = 0; round <= ids.length + 1; round++) {\n const admitted = admitUnder(closes);\n const next = new Map();\n for (const id of admitted.keys()) {\n const standing = windowsOver(claimsOn(admitted, id, 'epoch')).filter((w) => w.to === null);\n if (standing.length)\n next.set(id, standing.reduce((held, w) => EPOCHS.meet(held, w), EPOCHS.top).hi);\n }\n const moved = next.size !== closes.size || [...next].some(([id, close]) => closes.get(id) !== close);\n if (!moved)\n return { admitted: [...admitted.values()], potential: ids.filter((id) => !admitted.has(id)) };\n closes = next;\n }\n const admitted = admitUnder(closes);\n return { admitted: [...admitted.values()], potential: ids.filter((id) => !admitted.has(id)) };\n}\n/**\n * Who stands behind a line. In a lock read as a release, a target line carries no signature: the pin that names the\n * release's digest is its signature, so it stands only where one does, and a line signed by a key the release does not\n * carry is refused.\n */\nexport function authorityOf(fields, signers, verify, published) {\n const by = fields['by'] ?? '';\n if (published !== undefined && !fields['sig'] && by === 'target') {\n return published.pins.includes(published.digest) ? { kind: 'admitted', signer: by } : { kind: 'grey', why: `unpinned: no sources/ or uses/ line names ${published.digest}` };\n }\n if (published !== undefined && fields['sig'] && !signers.some((s) => s.id === by)) {\n return { kind: 'refuse', why: `REFUSE·authority ${by || '∅'} is no key this release carries`, named: by };\n }\n if (!fields['sig'])\n return { kind: 'grey', why: 'unsigned' };\n const signer = signers.find((s) => s.id === by);\n if (!signer)\n return { kind: 'grey', why: `signer ${by || '∅'} is not admitted` };\n if (!verify(fields, signer.publicKey))\n return { kind: 'grey', why: `the signature does not hold for ${by}` };\n return authorityAtEpoch(fields, signer, epochOf(fields));\n}\n/** Pure eligibility of an already authenticated record/signer at the supplied\n * authority ledger epoch. Authentication and context admission remain caller\n * work. authorityOf uses the ORIGINAL record epoch, retaining its exact legacy\n * verdicts; an explicit new context may use a distinct root authority epoch. */\nexport function authorityAtEpoch(fields, signer, epoch, coverageScope = fields['scope'] ?? '', clockKind = 'record') {\n const by = fields['by'] ?? '';\n if (clockKind === 'authority' && (!Number.isSafeInteger(epoch) || epoch < 0))\n return { kind: 'refuse', why: `REFUSE·authority ${by || '∅'} has unknown or invalid authority epoch`, named: by };\n const clockDescription = clockKind === 'authority' ? 'authority evaluated at epoch' : 'signed at epoch';\n const window = windowAt(signer, epoch);\n if (window.close !== null && epoch > window.close) {\n return { kind: 'refuse', why: `REFUSE·authority ${by} ${clockDescription} ${epoch}, after its epoch closed at ${window.close}`, named: by };\n }\n if (epoch < window.start)\n return { kind: 'grey', why: `${clockDescription} ${epoch}, before ${by} was admitted at ${window.start}` };\n const scope = coverageScope;\n const covering = signer.spans === undefined ? signer.coverage : signer.spans.filter((span) => epoch >= span.from && (span.to === null || epoch < span.to)).flatMap((span) => span.globs);\n if (!covering.some((prefix) => prefix === '*' || under(prefix, scope))) {\n return { kind: 'refuse', why: `REFUSE·authority ${by} does not cover ${scope}`, named: by };\n }\n const depth = resolution(region(fields['scope'] ?? ''));\n if (depth < signer.depth.lo || depth > signer.depth.hi) {\n return { kind: 'refuse', why: `REFUSE·authority ${by} may not sign at depth ${depth}`, named: by };\n }\n if (within(region(fields['scope'] ?? ''), region(KEYS)) && signer.keyClass !== 'authorize') {\n return { kind: 'refuse', why: `REFUSE·authority ${by} is attest and cannot admit signers`, named: by };\n }\n return { kind: 'admitted', signer: by };\n}\nconst COORDINATE_ROLES = ['source', 'derived', 'observed', 'foreign'];\nconst ROLE_PREFIXES = ['coordinate-role/', 'leaf-role/'];\nconst OUTRANKS = ['foreign', 'derived', 'observed'];\n/** What a region's role makes of the paths it names: a source is written by hand, a render and a receipt by the fold. */\nconst REGIONED = new Map([['source', 'source'], ['render', 'derived'], ['receipt', 'derived']]);\nexport function roleClaimsOf(lines) {\n return lines.flatMap((f) => {\n const scope = f['scope'] ?? '';\n const role = f['value'] ?? '';\n const regioned = REGIONED.get(f['role'] ?? '');\n if (scope.startsWith('region/') && f['measure'] === 'paths' && regioned !== undefined && role !== 'withdraw')\n return role.split('|').filter(Boolean).map((name) => ({ name, role: regioned }));\n const prefix = ROLE_PREFIXES.find((one) => scope.startsWith(one));\n if (prefix === undefined || f['measure'] !== 'role' || !COORDINATE_ROLES.includes(role))\n return [];\n return [{ name: scope.slice(prefix.length), role: role }];\n });\n}\nexport function namesAt(at, name) {\n return passes(region(at), name);\n}\nexport function roleAt(at, claims) {\n const place = { at: region(at).at, epoch: 0, seen: [] };\n return outranks([place], claims.map((c) => [c.name, c.role]), OUTRANKS) ?? 'source';\n}\n"},{"coordinate":"dist/wire/classes.js","digest":"sha256:759f669029f1da8c35dc71baa6aa08282cdd70731f5b15b30e5eb31234a0ec0a","source":"function matchStar(pat, seg) {\n if (!pat.includes('*'))\n return pat === seg;\n const bits = pat.split('*');\n if (!seg.startsWith(bits[0]))\n return false;\n let i = bits[0].length;\n for (let b = 1; b < bits.length; b++) {\n const bit = bits[b];\n if (bit === '')\n return b === bits.length - 1 || matchStar(bits.slice(b).join('*'), seg.slice(i));\n const hit = seg.indexOf(bit, i);\n if (hit < 0)\n return false;\n i = hit + bit.length;\n }\n return i === seg.length || pat.endsWith('*');\n}\nfunction matchParts(g, gi, p, pi) {\n if (gi === g.length)\n return pi === p.length;\n if (g[gi] === '**') {\n if (gi + 1 === g.length)\n return true;\n for (let k = pi; k <= p.length; k++) {\n if (matchParts(g, gi + 1, p, k))\n return true;\n }\n return false;\n }\n if (pi === p.length)\n return false;\n if (!matchStar(g[gi], p[pi]))\n return false;\n return matchParts(g, gi + 1, p, pi + 1);\n}\nexport function matches(glob, place) {\n return matchParts(glob.split('/'), 0, place.split('/'), 0);\n}\n"},{"coordinate":"dist/wire/evidence.js","digest":"sha256:fcf6c66b4625b78a3225a97ed06cee84f152f2c2886b113b5a09ee9f3e21a80e","source":"/** How a claim knows what it says is the algebra's order of evidence; the wire speaks it and does not keep a copy. */\nexport { weakest } from '@lapxo/obligations';\n"},{"coordinate":"dist/wire/grammar.js","digest":"sha256:a78171bb011eeb35b22ef9e463e010ede76fa1a716088657d50117d1ebb62e53","source":"import { unpipe } from \"./values.js\";\nconst [FORBID, EMPTY, MEMBER, PAIR, STEP, AT, EVERY, ESCAPE] = ['not:', 'none', '|', '=', '/', '@', '*', '\\\\'];\nconst refuse = (grammar, why) => {\n throw new Error(`REFUSE·wire ${grammar}: ${why}`);\n};\nconst digits = (text) => text !== '' && [...text].every((one) => one >= '0' && one <= '9');\nexport function alphabet(given) {\n if (typeof given !== 'string') {\n const written = given.members.map((one) => one.split(ESCAPE).join(ESCAPE + ESCAPE).split(MEMBER).join(ESCAPE + MEMBER)).join(MEMBER);\n if (given.polarity === 'forbid')\n return FORBID + written;\n return written.startsWith(FORBID) || written === EMPTY ? refuse('alphabet', 'a permitted alphabet neither begins with not: nor is the one word none') : written || EMPTY;\n }\n const forbid = given.startsWith(FORBID);\n const body = forbid ? given.slice(FORBID.length) : given;\n const members = !forbid && body === EMPTY ? [] : unpipe(body) ?? refuse('alphabet', 'a backslash escapes only a pipe or itself');\n return { polarity: forbid ? 'forbid' : 'permit', members: members.filter((one) => one !== '') };\n}\nexport function fields(given) {\n if (typeof given !== 'string')\n return alphabet({ polarity: 'permit', members: given.map(([key, value]) => key + PAIR + value) });\n const read = alphabet(given);\n if (read.polarity === 'forbid')\n refuse('fields', 'fields carry no polarity');\n return read.members.map((one) => (one.indexOf(PAIR) > 0 ? [one.slice(0, one.indexOf(PAIR)), one.slice(one.indexOf(PAIR) + 1)] : refuse('fields', `\\`${one}\\` is not key=value`)));\n}\nexport function steps(given) {\n if (typeof given === 'string')\n return given.split(STEP);\n return given.some((one) => one.includes(STEP)) ? refuse('steps', 'a step holds no slash') : given.join(STEP);\n}\nexport function atResolution(given) {\n if (typeof given !== 'string')\n return given.at === undefined ? given.name : given.name + AT + String(given.at);\n const at = given.lastIndexOf(AT);\n if (at < 0)\n return { name: given };\n const [name, said] = [given.slice(0, at), given.slice(at + 1)];\n if (name === '' || (said !== EVERY && !digits(said)))\n refuse('atResolution', `\\`${given}\\` is not name@digits or name@*`);\n return { name, at: said === EVERY ? EVERY : Number(said) };\n}\nexport function requirement(given) {\n if (typeof given !== 'string')\n return given.name === '' || given.range === '' || given.range.includes(AT) ? refuse('requirement', 'a requirement names what it requires and a range, with no at sign') : given.name + AT + given.range;\n const at = given.lastIndexOf(AT);\n return at > 0 && at < given.length - 1 ? { name: given.slice(0, at), range: given.slice(at + 1) } : refuse('requirement', `\\`${given}\\` is not name@range`);\n}\n"},{"coordinate":"dist/wire/index.js","digest":"sha256:db223756dbd45beea450fc175b2c7fc44a41625a4931df4bec18229c436b086e","source":"/** It answers the line, the forms' encodings, the names — how is a fact written? */\nexport { PROTOCOL } from \"./types.js\";\nexport { byBytes, canonical, parse, parseForSigning, signedBytes } from \"./line.js\";\nexport { alphabet, atResolution, fields, requirement, steps } from \"./grammar.js\";\nexport { fromLine, signersOf, authorityOf, authorityAtEpoch, windowAt, roleClaimsOf, roleAt, namesAt, isKeyClaim, isWireClaim, wireAt, ENVELOPE } from \"./claimline.js\";\nexport { matches } from \"./classes.js\";\nexport { CAPSULE, EXTENSION, LOCK, RECEIPTS } from \"./names.js\";\nexport { decimal } from \"./values.js\";\nexport { combine } from \"./measures.js\";\nexport { weakest } from \"./evidence.js\";\nexport { formatSignature, parseSignature, signedFieldsOf } from \"./sig.js\";\nexport { validateObjectContext } from \"./object-context.js\";\nexport { recordKind } from \"./record-kind.js\";\nexport { objectHistory } from \"./object-history.js\";\nexport { restCoordinates } from \"./object-record.js\";\nexport const OBJECT_VIEW = 'object';\nexport { publicationOf, publicLock } from \"./publication.js\";\nexport { requestBytes as signerRequestBytes, responseBytes as signerResponseBytes, responseOf as signerResponseOf, signerSelection } from \"./signing-port.js\";\nexport { readerLifetime } from \"./reader-lifetime.js\";\nexport { readerAllowsEmpty, assertReaderInputs } from \"./reader-lifetime.js\";\nexport { transportSelection, contentRequest } from \"./transport-port.js\";\nexport { actBytes, actIdentity, actResultOf, actResultProfile } from \"./act-result.js\";\n/** Opt-in clock context; local-act@1 and authority eligibility retain legacy meaning. */\nexport { PLACE_ACT_CONTEXT, placeActContextBytes, readPlaceActContext, originContextBytes, verifyOriginalAtAuthorityContext, verifyPlaceActContext, placeReceiptBytes, placeActReceiptsOf } from \"./place-act-context.js\";\n"},{"coordinate":"dist/wire/line.js","digest":"sha256:d683feba756bcd4153ed1860f5094972687db795f394ef3ec17924bc367c96ac","source":"import { abstain, fact, refuse } from \"./outcome.js\";\nimport { boundOf } from \"./values.js\";\nexport const PROTOCOL = 'bound-lock/1';\nconst NEEDS_QUOTE = /[ =\"\\n\\\\]/;\nfunction escape(value) {\n if (!NEEDS_QUOTE.test(value))\n return value;\n return `\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n')}\"`;\n}\nfunction unescape(token) {\n if (!token.startsWith('\"'))\n return NEEDS_QUOTE.test(token) ? null : token;\n if (token.length < 2 || !token.endsWith('\"'))\n return null;\n const body = token.slice(1, -1);\n let out = '';\n for (let i = 0; i < body.length; i++) {\n const c = body[i];\n if (c !== '\\\\') {\n if (c === '\"')\n return null;\n out += c;\n continue;\n }\n const next = body[i + 1];\n if (next === '\"')\n out += '\"';\n else if (next === '\\\\')\n out += '\\\\';\n else if (next === 'n')\n out += '\\n';\n else\n return null;\n i += 1;\n }\n return out;\n}\nconst UTF8 = new TextEncoder();\nexport function byBytes(a, b) {\n const x = UTF8.encode(a);\n const y = UTF8.encode(b);\n for (let i = 0; i < x.length && i < y.length; i++) {\n if (x[i] !== y[i])\n return x[i] - y[i];\n }\n return x.length - y.length;\n}\n/* NO UNICODE NORMALISATION — NFC and NFD are two scopes until a bridge. */\nconst unwritten = (fields) => fields['form'] === 'interval' && fields['value'] !== undefined && fields['value'] !== 'withdraw' && boundOf('interval', fields['value']) === null;\nexport function canonical(fields, version = '1') {\n if (unwritten(fields))\n throw new Error(`REFUSE·wire canonical: \\`${fields['value']}\\` is no interval the wire writes: two ends, each decimal or *`);\n const keys = Object.keys(fields).sort(byBytes);\n const tokens = keys.map((k) => `${k}=${escape(fields[k])}`);\n return [`${PROTOCOL.split('/')[0]}/${version}`, ...tokens].join(' ');\n}\nexport function signedBytes(fields, version = '1') {\n const { sig: _sig, ...rest } = fields;\n return canonical(rest, version);\n}\nconst ABSENT = '-';\nexport function parse(text, options = {}) {\n if (text.includes('\\n')) {\n return refuse('a line is one line — a newline in a value must be escaped as `\\\\n`');\n }\n const space = text.indexOf(' ');\n const envelope = space === -1 ? text : text.slice(0, space);\n const [name, version] = envelope.split('/');\n if (name !== PROTOCOL.split('/')[0] || !version) {\n return refuse(`no \\`bound-lock/<v>\\` envelope — found \\`${envelope.slice(0, 24)}\\``);\n }\n if (version !== PROTOCOL.split('/')[1]) {\n return abstain(`\\`bound-lock/${version}\\` is a version this reader does not know`);\n }\n const fields = {};\n const writtenKeys = new Set();\n for (const token of tokensOf(space === -1 ? '' : text.slice(space + 1))) {\n if (token === null)\n return refuse('a quoted value is not closed');\n const at = token.indexOf('=');\n if (at <= 0)\n return refuse(`\\`${token.slice(0, 24)}\\` is not \\`key=value\\``);\n const key = token.slice(0, at);\n if (writtenKeys.has(key))\n return refuse(`\\`${key}\\` appears twice — one line, one value per key`);\n writtenKeys.add(key);\n const value = unescape(token.slice(at + 1));\n if (value === null)\n return refuse(`\\`${key}\\` has an escaping this format does not define`);\n if (value !== ABSENT)\n fields[key] = value;\n }\n if (unwritten(fields))\n return refuse(`\\`${fields['value']}\\` is no interval the wire reads: two ends, each decimal or *`);\n return fact({ version, fields, ...(options.preserveKeys ? { keys: [...writtenKeys] } : {}) });\n}\nfunction* tokensOf(rest) {\n let at = 0;\n while (at < rest.length) {\n while (rest[at] === ' ')\n at += 1;\n if (at >= rest.length)\n return;\n let end = at;\n let quoted = false;\n while (end < rest.length && (quoted || rest[end] !== ' ')) {\n if (rest[end] === '\\\\' && quoted)\n end += 1;\n else if (rest[end] === '\"')\n quoted = !quoted;\n end += 1;\n }\n if (quoted) {\n yield null;\n return;\n }\n yield rest.slice(at, end);\n at = end;\n }\n}\n/** Signing cannot silently discard a key that was explicitly written as absent. */\nexport function parseForSigning(text) {\n const got = parse(text, { preserveKeys: true });\n if (got.kind !== 'fact')\n return got;\n const absent = got.value.keys.find(key => got.value.fields[key] === undefined);\n return absent === undefined ? got : refuse(`signing cannot discard explicitly absent field ${absent}; omit the key`, absent);\n}\n"},{"coordinate":"dist/wire/measures.js","digest":"sha256:0ba6f4262398419773c4b0cd0c3697d4ae9c6500e98948efc65d21259135ab75","source":"import { intervals } from '@lapxo/obligations';\nconst READINGS = intervals(-Infinity, Infinity);\n/** How the readings of one measure combine when a line reads more than one of them: counts, sizes and showings add up; a longest is the longest. */\nconst COMBINATIONS = { count: 'sum', size: 'sum', shown: 'sum', longest: 'max' };\n/** The readings of a measure combined as the measure says; one this table names no combination for is refused when it is more than one. */\nexport function combine(measure, values) {\n const how = COMBINATIONS[measure];\n if (how === 'max')\n return values.reduce((held, one) => READINGS.join(held, { lo: -Infinity, hi: one }), { lo: -Infinity, hi: 0 }).hi;\n if (how === 'sum' || values.length <= 1)\n return values.reduce((sum, one) => sum + one, 0);\n throw new Error(`REFUSE·measure ${measure}: ${values.length} readings and no combination the wire names for them`);\n}\n"},{"coordinate":"dist/wire/names.js","digest":"sha256:e9b619e2bc56a2fdd59e55b790456b182716b2e1a5cc5ee70eea0c56ed521d3a","source":"/**\n * The format's own names, spelled once: the extension every file of the format carries, and the three files it names\n * by it.\n */\nexport const EXTENSION = '.bound';\nexport const LOCK = `TARGET${EXTENSION}`;\nexport const CAPSULE = `capsule${EXTENSION}`;\nexport const RECEIPTS = `receipts${EXTENSION}`;\n"},{"coordinate":"dist/wire/object-context.js","digest":"sha256:5ddad691abfde0191db168419fcb1bd672bf764fefc1542cae56fd3337ac4af3","source":"import { signedBytes } from \"./line.js\";\nimport { restCoordinates } from \"./object-record.js\";\nimport { fact, refuse } from \"./outcome.js\";\n/** Validates one proposed history without deriving parts, state, meet, freedom or receipts. */\nexport function validateObjectContext(records, context) {\n const fail = (why) => refuse(`object context: ${why}`);\n const ids = new Map();\n for (const record of records) {\n if (!context.admit(record))\n return fail(`signature or authority does not admit ${record.fields.id}`);\n const prior = ids.get(record.fields.id);\n if (prior && signedBytes(prior.fields) !== signedBytes(record.fields))\n return fail(`record ID collision ${record.fields.id}`);\n if (!prior)\n ids.set(record.fields.id, record);\n }\n const unique = [...ids.values()];\n const position = new Map(unique.map((record, index) => [record.fields.id, index]));\n const cells = new Map();\n for (const record of unique.filter(r => r.record === 'cell')) {\n if (cells.has(record.fields.scope))\n return fail(`cell definition is not unique at ${record.fields.scope}`);\n cells.set(record.fields.scope, record);\n }\n const selected = new Map();\n for (const [scope, record] of cells) {\n try {\n const got = context.resolve(record);\n if (got.digest !== record.fields.topos || got.form.id !== record.fields.form)\n return fail(`selected digest/form does not match ${scope}`);\n got.form.lattice(got.params);\n selected.set(scope, got);\n }\n catch (error) {\n return fail(`codec/pin/decoder stop at ${scope}: ${String(error)}`);\n }\n }\n const edges = new Map();\n for (const [scope, record] of cells) {\n const rest = restCoordinates(record.fields.restsOn);\n if (rest === undefined)\n return fail(`invalid declared rest at ${scope}`);\n for (const parent of rest) {\n const ancestor = cells.get(parent);\n if (!ancestor)\n return fail(`missing rest target ${parent}`);\n if (Number(ancestor.fields.epoch) > Number(record.fields.epoch))\n return fail(`rest target ${parent} did not exist at cell declaration`);\n if (['topos', 'form', 'params', 'measure'].some(k => ancestor.fields[k] !== record.fields[k]))\n return fail(`incompatible rest component ${scope}/${parent}`);\n }\n edges.set(scope, rest);\n }\n // Structural DAG validation reads edges alone, never marks or object restOf.\n const colour = new Map();\n for (const scope of cells.keys()) {\n if (colour.get(scope) === 2)\n continue;\n const stack = [{ name: scope, exit: false }];\n while (stack.length) {\n const next = stack.pop();\n if (next.exit) {\n colour.set(next.name, 2);\n continue;\n }\n if (colour.get(next.name) === 1)\n return fail(`declared rest cycle reachable from ${scope}`);\n if (colour.get(next.name) === 2)\n continue;\n colour.set(next.name, 1);\n stack.push({ name: next.name, exit: true });\n for (const parent of [...edges.get(next.name)].reverse())\n stack.push({ name: parent, exit: false });\n }\n }\n for (const record of unique.filter(r => r.record !== 'cell')) {\n const f = record.fields;\n const own = cells.get(f.scope);\n if (!own || Number(own.fields.epoch) > Number(f.epoch) ||\n (Number(own.fields.epoch) === Number(f.epoch) && position.get(own.fields.id) > position.get(f.id)))\n return fail(`cell not declared before ${f.id}`);\n if (f.sign === '-1') {\n const target = ids.get(f.takes);\n if (!target || target.record !== record.record || target.fields.scope !== f.scope || target.fields.sign !== '+1' || target.fields.by !== f.by || Number(target.fields.epoch) >= Number(f.epoch))\n return fail(`unauthorized or incompatible withdrawal target ${f.takes}`);\n }\n else {\n const codec = selected.get(f.scope);\n try {\n codec.form.parse(codec.params, f.value);\n }\n catch (error) {\n return fail(`span codec stop at ${f.id}: ${String(error)}`);\n }\n if (record.record === 'claim' && !context.origin(f.origin, f.by, f.scope))\n return fail(`origin is not attested for ${f.id}`);\n if (f.widens !== undefined && !context.witness(f.widens, f.by, f.scope))\n return fail(`join witness is not admitted for ${f.id}`);\n }\n }\n // Only potentially noncommuting ceiling marks participate in the order check.\n for (const scope of cells.keys()) {\n const rest = new Set();\n const pending = [...edges.get(scope)];\n while (pending.length) {\n const name = pending.pop();\n if (rest.has(name))\n continue;\n rest.add(name);\n pending.push(...edges.get(name));\n }\n const marks = unique.filter(r => r.record === 'mark' && r.fields.sign === '+1' && r.fields.pole === 'ceiling' && (r.fields.scope === scope || (rest.has(r.fields.scope) && r.fields.reach === 'travels')));\n const epochs = new Map();\n for (const m of marks)\n epochs.set(m.fields.epoch, [...(epochs.get(m.fields.epoch) ?? []), m]);\n for (const same of epochs.values())\n if (same.length > 1 && same.some(m => m.fields.widens !== undefined))\n return fail(`ambiguous same-epoch ceiling acts at ${scope}`);\n }\n return fact(unique);\n}\n"},{"coordinate":"dist/wire/object-history.js","digest":"sha256:591d909e4af84980d1a3fb3e61a5ad22cd56bf3040bf14becec393f6789caf37","source":"import { parse } from \"./line.js\";\nimport { recordKind } from \"./record-kind.js\";\nimport { fromLine, wireAt } from \"./claimline.js\";\nimport { fact } from \"./outcome.js\";\n/** Historical grammar is selected by each record's epoch, before context admission. */\nexport function objectHistory(lines) {\n const parsed = [];\n for (const text of lines) {\n const p = parse(text);\n if (p.kind !== 'fact')\n return p;\n parsed.push(p.value.fields);\n }\n const objects = [], configuration = [];\n for (let i = 0; i < lines.length; i++) {\n const k = recordKind(lines[i]);\n if (k.kind !== 'fact')\n return k;\n if (k.value === 'config') {\n configuration.push(parsed[i]);\n continue;\n }\n const got = fromLine(lines[i], wireAt(parsed, Number(parsed[i].epoch)));\n if (got.kind !== 'fact')\n return got;\n if (!('record' in got.value))\n throw Error('typed history returned configuration');\n objects.push(got.value);\n }\n return fact({ objects, configuration });\n}\n"},{"coordinate":"dist/wire/object-record.js","digest":"sha256:b2995fe366b23f7ab34fc46d2481db901f552a31a8cff0a5a02ead74e36ddda7","source":"import { alphabet } from \"./grammar.js\";\nimport { byBytes } from \"./line.js\";\nimport { fact, refuse } from \"./outcome.js\";\nexport function coordinateText(value) {\n return value !== '' && !/[\\s\\\\|]/.test(value) && value.split('/').every((s) => s !== '' && s !== '.' && s !== '..' && s !== '*' && s !== '**');\n}\nexport function restCoordinates(text) {\n try {\n const read = alphabet(text);\n if (read.polarity !== 'permit' || read.members.some((one) => !coordinateText(one)))\n return undefined;\n const sorted = [...new Set(read.members)].sort(byBytes);\n if (alphabet({ polarity: 'permit', members: sorted }) !== text)\n return undefined;\n return sorted;\n }\n catch {\n return undefined;\n }\n}\nconst COMMON = ['type', 'scope', 'id', 'epoch', 'by', 'sig'];\n/** Typed records retain encoded values; only the selected codec interprets them. */\nexport function objectFromFields(fields, keys, schema, globalFields, forms) {\n const bad = (why, key) => refuse(why, key);\n if (keys.includes('at'))\n return bad('object records carry no at: order is epoch and a local join witness is widens', 'at');\n const type = fields.type;\n if (!schema.types.has(type ?? '') || !['cell', 'claim', 'mark'].includes(type ?? ''))\n return bad('an object record names a declared type: cell, claim or mark', 'type');\n if (!/^(0|[1-9][0-9]*)$/.test(fields.epoch ?? '') || !Number.isSafeInteger(Number(fields.epoch)))\n return bad('an object record carries an exactly supported logical epoch', 'epoch');\n if (Number(fields.epoch) < schema.activation)\n return bad(`an object epoch precedes typed-wire activation ${schema.activation}`, 'epoch');\n let row;\n if (type === 'cell')\n row = 'cell';\n else if (fields.sign === '-1')\n row = `${type}/negative`;\n else if (fields.sign !== '+1')\n return bad('a claim or mark names sign=+1 or sign=-1', 'sign');\n else if (type === 'claim')\n row = 'claim/positive';\n else if (fields.pole === 'floor' && fields.reach === 'travels' && fields.widens === undefined)\n row = 'mark/floor-travelling';\n else if (fields.pole === 'ceiling' && fields.reach === 'travels' && fields.widens === undefined)\n row = 'mark/travelling';\n else if (fields.pole === 'ceiling' && fields.reach === 'local')\n row = 'mark/local';\n else\n return bad('a positive mark is ceiling/travels, ceiling/local with widens, or floor/travels without widens', 'pole');\n const required = schema.required.get(row);\n const allowed = schema.allowed.get(row);\n if (!required || !allowed || schema.common.size === 0 || schema.configuration.size === 0 || [...schema.common].some(k => !required.has(k) || !allowed.has(k)) || [...required].some(k => !allowed.has(k)))\n return bad(`typed wire has no complete required/allowed contract for ${row}`, 'type');\n // These are intrinsic envelope identities, not a copy of each row's field alphabet.\n for (const key of COMMON)\n if (fields[key] === undefined || fields[key] === '')\n return bad(`an object record has no ${key}`, key);\n for (const key of keys)\n if (!globalFields.has(key) || !allowed.has(key))\n return bad(`\\`${key}=\\` is not allowed on ${row}`, key);\n for (const key of required)\n if (!allowed.has(key) || fields[key] === undefined || fields[key] === '')\n return bad(`a ${row} record has no declared required \\`${key}\\``, key);\n if (!coordinateText(fields.scope))\n return bad('scope is a canonical cell coordinate', 'scope');\n if (type === 'cell') {\n if (!forms.has(fields.form))\n return bad('the cell names no admitted form', 'form');\n if (restCoordinates(fields.restsOn) === undefined)\n return bad('cell restsOn is none or a canonical alphabet of coordinates', 'restsOn');\n }\n return fact({ record: type, fields: { ...fields } });\n}\n"},{"coordinate":"dist/wire/outcome.js","digest":"sha256:deab53c58c078862088ac4bf424fb13ed68793913e399815871031e3a7e41a9a","source":"export const fact = (value) => ({ kind: 'fact', value });\nexport const abstain = (why) => ({ kind: 'abstain', why });\nexport const refuse = (why, named) => ({ kind: 'refuse', why, ...(named === undefined ? {} : { named }) });\n"},{"coordinate":"dist/wire/place-act-context.js","digest":"sha256:4c20ef9134263ed4d28adcb7c4ebfe8444d7d923e3355cf22adafc7a4332a133","source":"/** Prospective, opt-in pure contract. NOT exported/activated by the package yet.\n * local-act@1 is unchanged; caller trust comes from the admitted instrument. */\nimport { byBytes, canonical, parse, signedBytes } from \"./line.js\";\nimport { authorityAtEpoch } from \"./claimline.js\";\nexport const PLACE_ACT_CONTEXT = 'place-act-context@1';\nconst refuse = (why) => { throw Error('REFUSE·place-act ' + why); };\nconst exactString = (value) => typeof value === 'string' && value.length > 0;\nconst clock = (value) => { if (!exactString(value) || !/^(0|[1-9][0-9]*)$/.test(value) || value.length > String(Number.MAX_SAFE_INTEGER).length || !Number.isSafeInteger(Number(value)))\n return refuse('unknown or invalid clock'); return value; };\nconst budget = (b) => { if (!b || typeof b !== 'object')\n refuse('missing resource budget'); for (const name of ['bytes', 'records', 'placements', 'policies', 'proofs', 'signers'])\n if (!Number.isSafeInteger(b[name]) || b[name] < 1)\n refuse('missing resource ' + name); };\nconst bytes = (text) => new TextEncoder().encode(text).byteLength;\nconst fields = (original) => { const got = parse(original); if (got.kind !== 'fact')\n return refuse('noncanonical or unsigned original'); if (canonical(got.value.fields, got.value.version) !== original || !got.value.fields.sig || !got.value.fields.by)\n return refuse('noncanonical or unsigned original'); return got.value.fields; };\nconst place = (p) => { if (p !== '.' && (!p.endsWith('/TARGET.bound') || p.startsWith('/') || p.split('/').some(s => s === '' || s === '.' || s === '..')))\n refuse('unknown place coordinate'); };\nconst frame = (value) => JSON.stringify(value) + '\\n';\nconst rootTuple = (r) => [r.namespace, r.snapshot, r.epoch, r.prefix, r.head, r.policies];\nexport function originContextBytes(root, p, by, b) {\n placeActContextBytes({ root, places: [p] }, b);\n if (!exactString(by))\n refuse('unknown origin signer');\n if (by.length > b.bytes)\n refuse('byte budget');\n const out = frame([PLACE_ACT_CONTEXT, 'origin', by, p.place, p.epoch, p.originPrefix, root.snapshot, p.records]);\n if (by.length > b.bytes || bytes(out) > b.bytes)\n refuse('byte budget');\n return out;\n}\nexport function placeActContextBytes(a, b) {\n budget(b);\n if (!a || typeof a !== 'object' || !a.root || !Array.isArray(a.places) || !Array.isArray(a.root.policies))\n refuse('incomplete context');\n if (a.places.some(p => !p || !Array.isArray(p.records) || !Array.isArray(p.proofs)))\n refuse('incomplete place context');\n if (a.places.length > b.placements || a.root.policies.length > b.policies)\n refuse('dependency/placement budget');\n let count = 0, proofs = 0, total = 0;\n const scalar = (value) => { if (!exactString(value))\n return refuse('unknown context reference'); if (value.length > b.bytes)\n refuse('byte budget'); total += value.length; if (total > b.bytes)\n refuse('byte budget'); };\n for (const value of [a.root.namespace, a.root.snapshot, a.root.epoch, a.root.prefix, a.root.head, ...a.root.policies])\n scalar(value);\n for (const p of a.places) {\n count += p.records.length;\n proofs += p.proofs.length;\n if (count > b.records || proofs > b.proofs)\n refuse('record/proof budget');\n for (const value of [p.place, p.previous, p.epoch, p.originPrefix, ...p.records])\n scalar(value);\n for (const proof of p.proofs) {\n if (!proof || typeof proof !== 'object')\n refuse('unknown origin proof');\n scalar(proof.by);\n scalar(proof.signature);\n }\n }\n const value = frame([PLACE_ACT_CONTEXT, 'transaction', rootTuple(a.root), a.places.map(p => [p.place, p.previous, p.epoch, p.originPrefix, p.records, p.proofs.map(proof => [proof.by, proof.signature])])]);\n if (bytes(value) > b.bytes)\n refuse('byte budget');\n readPlaceActContext(value, b);\n return value;\n}\n/** Byte cap BEFORE JSON.parse; closed tuple shape/count caps BEFORE line parsing,\n * hashes/signatures/prefix callbacks. No recursive general JSON canonicalizer. */\nexport function readPlaceActContext(encoded, b) {\n budget(b);\n if (typeof encoded !== 'string' || bytes(encoded) > b.bytes)\n refuse('byte budget');\n let tuple;\n try {\n tuple = JSON.parse(encoded);\n }\n catch {\n return refuse('invalid framing');\n }\n if (!Array.isArray(tuple) || tuple.length !== 4 || tuple[0] !== PLACE_ACT_CONTEXT || tuple[1] !== 'transaction')\n refuse('unsupported clock profile');\n const r = tuple[2], ps = tuple[3];\n if (!Array.isArray(r) || r.length !== 6 || !Array.isArray(r[5]) || !Array.isArray(ps))\n refuse('incomplete context');\n if (r[5].length > b.policies || ps.length > b.placements)\n refuse('dependency/placement budget');\n let count = 0, proofCount = 0;\n for (const p of ps) {\n if (!Array.isArray(p) || p.length !== 6 || !Array.isArray(p[4]) || !Array.isArray(p[5]))\n refuse('incomplete place context');\n count += p[4].length;\n proofCount += p[5].length;\n }\n if (count > b.records || proofCount > b.proofs)\n refuse('record/proof budget');\n if (!ps.length || !count)\n refuse('empty transaction');\n if (!r.slice(0, 5).every(exactString) || !r[5].every(exactString))\n refuse('unknown authority context');\n clock(r[2]);\n if (new Set(r[5]).size !== r[5].length || r[5].some((v, i) => i > 0 && byBytes(r[5][i - 1], v) >= 0))\n refuse('noncanonical policy dependencies');\n const places = ps.map((p) => {\n if (!p.slice(0, 4).every(exactString) || !p[4].every(exactString) || !p[4].length)\n refuse('unknown place context');\n place(p[0]);\n clock(p[2]);\n if (p[5].some((proof) => !Array.isArray(proof) || proof.length !== 2 || !proof.every(exactString)))\n refuse('unknown origin proof');\n const proofs = p[5].map((proof) => ({ by: proof[0], signature: proof[1] }));\n if (new Set(proofs.map((p) => p.by)).size !== proofs.length || proofs.some((p, i) => i > 0 && byBytes(proofs[i - 1].by, p.by) >= 0))\n refuse('duplicate/noncanonical origin proofs');\n return { place: p[0], previous: p[1], epoch: p[2], originPrefix: p[3], records: p[4], proofs };\n });\n if (new Set(places.map(p => p.place)).size !== places.length || places.some((p, i) => i > 0 && byBytes(places[i - 1].place, p.place) >= 0))\n refuse('duplicate/noncanonical places');\n const root = { namespace: r[0], snapshot: r[1], epoch: r[2], prefix: r[3], head: r[4], policies: r[5] };\n if (frame([PLACE_ACT_CONTEXT, 'transaction', rootTuple(root), ps]) !== encoded)\n refuse('noncanonical framing');\n return { root, places };\n}\nfunction eligibility(f, p, s, root, family) {\n const scope = p.place === '.' ? f.scope : [family, p.place.slice(0, -'/TARGET.bound'.length), f.scope].join('/');\n // Projection changes only the authorization coordinate, NEVER signature input.\n // The originating key-class gate is also checked on unchanged original scope.\n const verdict = authorityAtEpoch(f, s, Number(clock(root.epoch)), scope, 'authority');\n if (verdict.kind !== 'admitted')\n refuse('authority ' + verdict.kind + ' ' + verdict.why);\n}\n/** Explicit root-clock authorization; NEVER alters signed epoch/bytes. Namespace\n * membership/authenticated prefix must have been established by the instrument. */\nfunction verifyAuthenticatedOriginal(original, p, contract) {\n const f = fields(original), signer = contract.signers.find(s => s.id === f.by);\n if (!signer || contract.verifiesOriginal(original, signer, contract.root) !== true)\n return refuse('original signature');\n if (clock(f.epoch) !== p.epoch)\n refuse('origin clock mismatch');\n eligibility(f, p, signer, contract.root, contract.regionFamily);\n}\nexport function verifyPlaceActContext(encoded, contract) {\n if (!contract || typeof contract !== 'object')\n refuse('missing instrument trust');\n const a = readPlaceActContext(encoded, contract.budget);\n for (const name of ['verifiesRootContext', 'verifiesNamespaceAdmission', 'verifiesNewLocalPrefix', 'verifiesOriginal', 'verifiesProof', 'digest'])\n if (typeof contract[name] !== 'function')\n refuse('missing instrument verifier ' + name);\n if (!contract.root || !Array.isArray(contract.signers) || !Array.isArray(contract.places))\n refuse('missing authenticated context');\n if (new Set(contract.signers.map(s => s.id)).size !== contract.signers.length)\n refuse('duplicate signer id');\n if (contract.signers.length > contract.budget.signers || !contract.places.length || !exactString(contract.regionFamily))\n refuse('trusted context budget/mapping');\n if (frame(rootTuple(a.root)) !== frame(rootTuple(contract.root)) || contract.verifiesRootContext(a.root) !== true)\n refuse('unauthenticated authority context');\n for (const p of a.places) {\n if (!contract.places.includes(p.place) || contract.verifiesNamespaceAdmission(p.place, a.root) !== true)\n refuse('namespace not admitted');\n if (contract.verifiesNewLocalPrefix(p.place, p.originPrefix, p.epoch, p.records) !== true)\n refuse('origin prefix or legacy reinterpretation');\n const signers = [...new Set(p.records.map(line => fields(line).by))].sort(byBytes);\n if (signers.length !== p.proofs.length || signers.some((by, i) => p.proofs[i].by !== by))\n refuse('missing/borrowed origin proof');\n for (const proof of p.proofs) {\n const signer = contract.signers.find(s => s.id === proof.by);\n if (!signer || contract.verifiesProof(originContextBytes(a.root, p, proof.by, contract.budget), proof.signature, signer, a.root) !== true)\n refuse('origin proof signature');\n }\n const identities = p.records.map(line => contract.digest(signedBytes(fields(line))));\n if (new Set(identities).size !== identities.length)\n refuse('duplicate original');\n for (const line of p.records)\n verifyAuthenticatedOriginal(line, p, contract);\n }\n return { identity: contract.digest(encoded), context: a, dependencies: a.root };\n}\nexport function placeReceiptBytes(identity, p, root, by, receiptScope, b) {\n placeActContextBytes({ root, places: [p] }, b);\n if (!exactString(identity) || !exactString(by) || !exactString(receiptScope))\n refuse('unknown receipt identity/signer');\n if (identity.length > b.bytes || by.length > b.bytes || receiptScope.length > b.bytes)\n refuse('byte budget');\n const out = frame([PLACE_ACT_CONTEXT, 'receipt', by, receiptScope, identity, p.place, p.previous, p.epoch, root.snapshot]);\n if (bytes(out) > b.bytes)\n refuse('byte budget');\n return out;\n}\nexport function placeActReceiptsOf(encoded, receipts, contract) {\n if (!contract || typeof contract !== 'object')\n refuse('missing instrument trust');\n budget(contract.budget);\n if (!Array.isArray(receipts))\n refuse('unknown receipt set');\n if (receipts.length > contract.budget.placements)\n refuse('receipt budget');\n let receiptSize = 0;\n for (const r of receipts) {\n if (!r || typeof r !== 'object')\n refuse('unknown receiver receipt');\n for (const value of [r.by, r.place, r.signature]) {\n if (!exactString(value) || value.length > contract.budget.bytes)\n refuse('receipt byte budget');\n receiptSize += value.length;\n }\n }\n if (receiptSize > contract.budget.bytes || bytes(JSON.stringify(receipts)) > contract.budget.bytes)\n refuse('receipt byte budget');\n if (receipts.length > contract.budget.placements)\n refuse('receipt budget');\n if (!exactString(contract.receiptScope))\n refuse('unknown receiver scope');\n const result = verifyPlaceActContext(encoded, contract);\n if (receipts.length !== result.context.places.length || new Set(receipts.map(r => r.place)).size !== receipts.length)\n refuse('incomplete/duplicate receiver receipts');\n const signer = contract.signers.find(s => s.id === contract.receiptSigner);\n if (!signer)\n return refuse('unknown receiver signer');\n const receiverVerdict = authorityAtEpoch({ scope: contract.receiptScope, by: signer.id }, signer, Number(clock(contract.root.epoch)), contract.receiptScope, 'authority');\n if (receiverVerdict.kind !== 'admitted')\n refuse('receiver authority ' + receiverVerdict.kind + ' ' + receiverVerdict.why);\n for (const p of result.context.places) {\n const receipt = receipts.find(r => r.place === p.place);\n if (!receipt || receipt.by !== contract.receiptSigner || contract.verifiesProof(placeReceiptBytes(result.identity, p, result.context.root, receipt.by, contract.receiptScope, contract.budget), receipt.signature, signer, contract.root) !== true)\n refuse('receiver receipt signature');\n }\n return { identity: result.identity, places: result.context.places.map(p => ({ place: p.place, epoch: p.epoch })) };\n}\n/** Returns dependencies to a guarded HOST boundary, never a freshness permit.\n * Historical replay may inspect original context; a new admission must atomically\n * compare these heads AND each selected previous head at actual publication. */\n/** Standalone public use has the SAME budgets, anchored context, namespace,\n * origin prefix/proofs and signatures as full transaction verification. */\nexport function verifyOriginalAtAuthorityContext(original, p, contract) {\n if (!contract || typeof contract !== 'object')\n refuse('missing instrument trust');\n budget(contract.budget);\n if (typeof original !== 'string' || original.length > contract.budget.bytes || bytes(original) > contract.budget.bytes)\n refuse('byte budget');\n const encoded = placeActContextBytes({ root: contract.root, places: [p] }, contract.budget);\n if (!p.records.includes(original))\n refuse('original not in bound context');\n verifyPlaceActContext(encoded, contract);\n}\n"},{"coordinate":"dist/wire/publication.js","digest":"sha256:15e96b443de431c47937f32d550b9cc8fb04feccb08ac3558ef26c55c3d8edfd","source":"import { byBytes, canonical, parse } from \"./line.js\";\nimport { ENVELOPE } from \"./claimline.js\";\n/**\n * Project already admitted, folded configuration claims for publication.\n * This does not admit claims or fold history. The containing artifact supplies integrity;\n * public-key records retain their signatures, while other claims lose delivery envelopes.\n */\nexport function publicationOf(live) {\n return live.map(line => {\n const got = parse(line);\n if (got.kind !== 'fact')\n throw Error(`REFUSE·publication ${got.why}`);\n const fields = got.value.fields;\n if (fields.value === 'withdraw')\n throw Error('REFUSE·publication a withdrawal is history, not standing');\n if (fields.type !== undefined)\n throw Error('REFUSE·publication object history needs its semantic projection');\n if (isPublicKey(fields))\n return canonical(fields);\n const semantic = Object.fromEntries(Object.entries(fields).filter(([name]) => !ENVELOPE.has(name)));\n return canonical({ ...semantic, by: 'target' });\n }).sort(byBytes);\n}\n/**\n * Recognize a public lock without granting authority or verifying public keys.\n * Signed delivery history returns undefined for the ordinary authority reader.\n */\nexport function publicLock(lines) {\n const fields = lines.map(line => {\n const got = parse(line);\n if (got.kind !== 'fact')\n throw Error(`REFUSE·publication ${got.why}`);\n return got.value.fields;\n });\n if (fields.some(record => record.sig !== undefined && !isPublicKey(record)))\n return undefined;\n for (const record of fields) {\n if (record.type !== undefined)\n throw Error('REFUSE·publication object history needs its semantic projection');\n if (record.sig === undefined && record.by !== undefined && record.by !== 'target') {\n throw Error('REFUSE·publication unsigned delivery signer');\n }\n if (record.value === 'withdraw')\n throw Error('REFUSE·publication withdrawal in a public lock');\n if (record.sig === undefined && [...ENVELOPE].some(name => name !== 'by' && record[name] !== undefined)) {\n throw Error('REFUSE·publication delivery envelope in a public lock');\n }\n }\n return [...lines];\n}\nfunction isPublicKey(fields) {\n return fields.scope?.startsWith('keys/') === true && fields.measure === 'public-key';\n}\n"},{"coordinate":"dist/wire/reader-lifetime.js","digest":"sha256:ac7cfa4009fb6e1aa0e5cd88190332c6529c0c456c2439186cf56c43411ce309","source":"import { boundOf } from \"./values.js\";\nimport { intervals } from '@lapxo/obligations';\n/** Policy selection is part of the wire. Historical unbounded profiles are not a bounded-reading certificate. */\nexport function readerLifetime(lines, reference) {\n const contract = lines.filter(f => (f.scope === 'wire/reader-lifetime' || f.scope === 'audit/wire/reader-lifetime') && f.value !== 'withdraw');\n if (!contract.length)\n return undefined;\n const profiles = new Set(contract.map(f => f.value));\n if (profiles.size !== 1)\n throw Error('REFUSE·wire conflicting reader lifetime profiles');\n const profile = contract[0].value;\n if (!['bounded-process@1', 'bounded-process@2'].includes(profile ?? ''))\n throw Error('REFUSE·wire unsupported reader lifetime');\n // @1 retains its historical module coordinate; @2 selects the declared reader.\n const reader = typeof reference === 'string' ? reference : profile === 'bounded-process@1' ? reference.module : reference.id;\n const limit = (name, measure) => {\n const scopes = [`reader/${name}`, `reader/${reader}/${name}`];\n const rows = lines.filter(f => scopes.includes(f.scope ?? '') && f.measure === measure && f.value !== 'withdraw' && f.role === 'writes');\n if (!rows.length)\n throw Error(`REFUSE·reader ${reader} no declared ${name}`);\n const values = rows.map(f => {\n const bound = f.form === 'interval' ? boundOf('interval', f.value ?? '') : undefined;\n if (!bound || bound.kind !== 'interval' || bound.hi === null || !Number.isSafeInteger(bound.hi) || bound.hi <= 0 || bound.lo === null || bound.lo < 0 || bound.lo > bound.hi)\n throw Error(`REFUSE·reader ${reader} invalid ${f.scope}`);\n return { lo: bound.lo, hi: bound.hi };\n });\n // The historical profile used upper ceilings only. Its meaning remains fixed.\n if (profile === 'bounded-process@1')\n return Math.min(...values.map(value => value.hi));\n const lattice = intervals(0, Infinity);\n const bound = values.reduce((held, value) => lattice.meet(held, value), lattice.top);\n if (!lattice.inhabited(bound))\n throw Error(`REFUSE·reader ${reader} conflicting ${name}`);\n return bound.hi;\n };\n return { timeoutMs: limit('timeout', 'milliseconds'), responseBytes: limit('response-bytes', 'bytes') };\n}\n/** Completed empty output requires an explicit permission; absence of input is a separate unanswered demand. */\nexport function readerAllowsEmpty(lines, reader) {\n const contract = lines.filter(f => (f.scope === 'wire/reader-empty' || f.scope === 'audit/wire/reader-empty') && f.value !== 'withdraw');\n if (!contract.length)\n return false;\n if (contract.some(f => f.value !== 'declared-empty@1'))\n throw Error('REFUSE·wire unsupported empty-reading contract');\n const rows = lines.filter(f => ['reader/empty', `reader/${reader}/empty`].includes(f.scope ?? '') && f.measure === 'id' && f.role === 'writes' && f.value !== 'withdraw');\n if (!rows.length)\n return false;\n if (rows.some(f => f.form !== 'alphabet' || !['allow', 'required'].includes(f.value ?? '')))\n throw Error(`REFUSE·reader ${reader} invalid empty policy`);\n return rows.every(f => f.value === 'allow');\n}\n/** The host supplies selection cardinality; the wire decides whether absence leaves a demand. */\nexport function assertReaderInputs(lines, reader, count) {\n const contract = lines.filter(f => (f.scope === 'wire/reader-inputs' || f.scope === 'audit/wire/reader-inputs') && f.value !== 'withdraw');\n if (!contract.length)\n return;\n if (contract.some(f => f.value !== 'declared-presence@1'))\n throw Error('REFUSE·wire unsupported reader input presence');\n const rows = lines.filter(f => ['reader/inputs', `reader/${reader}/inputs`].includes(f.scope ?? '') && f.measure === 'id' && f.role === 'writes' && f.value !== 'withdraw');\n if (!rows.length || rows.some(f => f.form !== 'alphabet' || !['required', 'optional'].includes(f.value ?? '')))\n throw Error(`REFUSE·reader ${reader} no valid input presence policy`);\n if (count === 0 && rows.some(f => f.value === 'required'))\n throw Error(`REFUSE·reader ${reader} required input selection is empty`);\n}\n"},{"coordinate":"dist/wire/record-kind.js","digest":"sha256:844a163ddf99a694a1dc54cd8ecf118c91d88b92ff8f93424092b53c4ffb2cd1","source":"import { parse } from \"./line.js\";\nimport { fact, refuse } from \"./outcome.js\";\n/** Lexical kind is explicit; it grants no admission and supplies no legacy defaults. */\nexport function recordKind(text) {\n const got = parse(text, { preserveKeys: true });\n if (got.kind !== 'fact')\n return got;\n if (!got.value.keys.includes('type'))\n return fact('config');\n const type = got.value.fields.type;\n return type === 'cell' || type === 'claim' || type === 'mark' ? fact(type) : refuse('an explicit type names cell, claim or mark', 'type');\n}\n"},{"coordinate":"dist/wire/sig.js","digest":"sha256:103d41dd0dc8fc9386fac861b6f0392b05183945b4a9c6e9f46dffb976c20d9c","source":"export function formatSignature(algorithm, raw) {\n return `${algorithm}:${raw}`;\n}\nexport function parseSignature(value) {\n const colon = value.lastIndexOf(':');\n if (colon <= 0 || colon === value.length - 1)\n return null;\n return { algorithm: value.slice(0, colon), raw: value.slice(colon + 1) };\n}\n/** The fields a signature covers: every field but the signature itself, with the signer named. */\nexport function signedFieldsOf(fields, signer) {\n const covered = { ...fields, by: signer };\n delete covered['sig'];\n return covered;\n}\n"},{"coordinate":"dist/wire/signing-port.js","digest":"sha256:b5787a9ddd779bc0ad7f167057211116ea488e4e051956f74ed2c0e782d446b7","source":"import { canonical, parse, signedBytes } from \"./line.js\";\nimport { parseSignature } from \"./sig.js\";\nimport { boundOf } from \"./values.js\";\n/** Proposed transport vector, not an admitted object/configuration record. */\nexport function requestBytes(lot) {\n if (!lot.bytes.length)\n throw new Error('REFUSE·signer empty lot');\n for (const bytes of lot.bytes) {\n const got = parse(bytes);\n if (got.kind !== 'fact' || got.value.fields['sig'] !== undefined\n || got.value.fields['by'] !== lot.keyId || signedBytes(got.value.fields) !== bytes) {\n throw new Error('REFUSE·signer noncanonical payload');\n }\n }\n return lot.bytes.join('\\n') + '\\n';\n}\nexport function responseBytes(records) {\n return records.map(record => canonical({ by: record.keyId, sig: record.signature })).join('\\n') + '\\n';\n}\n/** The existing lexical envelope carries exactly by/sig, in lot order. No authority is minted. */\nexport function responseOf(text, lot) {\n if (!text.endsWith('\\n'))\n throw new Error('REFUSE·signer truncated response');\n const rows = text.slice(0, -1).split('\\n');\n if (rows.length !== lot.bytes.length)\n throw new Error('REFUSE·signer response count');\n return rows.map(row => {\n const got = parse(row);\n if (got.kind !== 'fact')\n throw new Error('REFUSE·signer response grammar');\n const fields = got.value.fields;\n const signature = parseSignature(fields['sig'] ?? '');\n if (Object.keys(fields).length !== 2 || fields['by'] !== lot.keyId || !signature\n || signature.algorithm !== lot.algorithm || canonical(fields) !== row) {\n throw new Error('REFUSE·signer response identity or signature form');\n }\n return { keyId: fields['by'], signature: fields['sig'] };\n });\n}\n/** Caller supplies live admitted configuration; host resolves the logical name separately. */\nexport function signerSelection(lines, keyId) {\n const value = (scope, measure) => {\n const rows = lines.filter(f => f['scope'] === scope && f['measure'] === measure\n && f['role'] === 'writes' && f['value'] !== 'withdraw');\n const values = [...new Set(rows.map(f => f['value']))];\n if (values.length !== 1 || !values[0])\n throw new Error(`REFUSE·signer ${keyId} missing or conflicting ${scope}`);\n return values[0];\n };\n const exact = (scope, measure) => {\n if (lines.some(f => f['scope'] === scope && f['measure'] === measure\n && f['role'] === 'writes' && f['value'] !== 'withdraw' && f['form'] !== 'interval')) {\n throw new Error(`REFUSE·signer ${keyId} invalid ${scope}`);\n }\n const bound = boundOf('interval', value(scope, measure));\n if (!bound || bound.kind !== 'interval' || bound.lo === null || bound.lo !== bound.hi || !Number.isSafeInteger(bound.lo) || bound.lo <= 0) {\n throw new Error(`REFUSE·signer ${keyId} invalid ${scope}`);\n }\n return bound.lo;\n };\n return { name: value(`keys/${keyId}`, 'signer'), timeoutMs: exact('signer/timeout', 'milliseconds'),\n responseBytes: exact('signer/response-bytes', 'bytes') };\n}\n"},{"coordinate":"dist/wire/transport-port.js","digest":"sha256:116b1d2941add8cf2b41db06ef8c28f846a05b20c66b11f6d29f3bf0ce44afbf","source":"import { boundOf } from \"./values.js\";\nimport { intervals } from '@lapxo/obligations';\n/** Live admitted host policy selects a logical mechanism; a location never selects executable bytes. */\nexport function transportSelection(lines, scheme) {\n const contract = lines.filter(f => (f.scope === 'wire/transport' || f.scope === 'audit/wire/transport') && f.value !== 'withdraw');\n if (!contract.length)\n return undefined;\n if (contract.some(f => f.value !== 'content-request/1'))\n throw Error('REFUSE·wire unsupported content transport');\n const one = (scope, measure) => {\n const rows = lines.filter(f => f.scope === scope && f.measure === measure && f.role === 'writes' && f.value !== 'withdraw');\n if (!rows.length || new Set(rows.map(f => f.value)).size !== 1)\n throw Error(`REFUSE·transport ${scheme} missing or conflicting ${scope}`);\n return rows[0];\n };\n const name = one(`transport/${scheme}`, 'id').value;\n if (!name)\n throw Error(`REFUSE·transport ${scheme} has no mechanism`);\n const limit = (scope, measure) => {\n const rows = lines.filter(f => f.scope === scope && f.measure === measure && f.role === 'writes' && f.value !== 'withdraw');\n if (!rows.length)\n throw Error(`REFUSE·transport ${scheme} missing ${scope}`);\n const lattice = intervals(0, Infinity);\n const bound = rows.reduce((held, row) => {\n const parsed = row.form === 'interval' ? boundOf('interval', row.value ?? '') : undefined;\n if (!parsed || parsed.kind !== 'interval' || parsed.lo === null || parsed.lo < 0 || parsed.hi === null || !Number.isSafeInteger(parsed.hi) || parsed.hi <= 0 || parsed.lo > parsed.hi)\n throw Error(`REFUSE·transport ${scheme} invalid ${scope}`);\n return lattice.meet(held, { lo: parsed.lo, hi: parsed.hi });\n }, lattice.top);\n if (!lattice.inhabited(bound))\n throw Error(`REFUSE·transport ${scheme} conflicting ${scope}`);\n return bound.hi;\n };\n return { name, timeoutMs: limit('transport/timeout', 'milliseconds'), responseBytes: limit('transport/response-bytes', 'bytes') };\n}\n/** One request per invocation; successful stdout is raw payload bytes, a nonzero exit is never a payload. */\nexport function contentRequest(location, digest, limits) {\n const request = { protocol: 'content-request/1', location, digest, timeoutMs: limits.timeoutMs, responseBytes: limits.responseBytes };\n return JSON.stringify(request) + '\\n';\n}\n"},{"coordinate":"dist/wire/types.js","digest":"sha256:ed15e5d164e28439f811665306ced6e06d1ea030a3779bf387350b1cc131211f","source":"export { PROTOCOL } from \"./line.js\";\nexport { fact, abstain, refuse } from \"./outcome.js\";\n"},{"coordinate":"dist/wire/values.js","digest":"sha256:5b883395c0dc4ecde724a91d6a263c68d180a8e53fac6319daf51087af214d62","source":"export function unpipe(value) {\n const out = [];\n let at = '';\n for (let i = 0; i < value.length; i++) {\n const c = value[i];\n if (c === '\\\\') {\n const next = value[i + 1];\n if (next !== '|' && next !== '\\\\')\n return null;\n at += next;\n i += 1;\n }\n else if (c === '|') {\n out.push(at);\n at = '';\n }\n else {\n at += c;\n }\n }\n out.push(at);\n return out;\n}\nconst OPEN = '*';\nconst num = (s) => {\n if (!/^-?\\d+(\\.\\d+)?$/.test(s))\n return null;\n const n = Number(s);\n return isFinite(n) ? n : null;\n};\n/**\n * A number as the wire writes it, the only spelling it reads: decimal digits, a minus when negative and a fraction\n * when it has one, never an exponent, a hex prefix, a leading dot or padding. The digits are the shortest that read\n * back to the number, so a second head in any language writes the same bytes; a number that is not finite has none.\n */\nexport function decimal(n) {\n if (!isFinite(n))\n throw new Error(`REFUSE·wire decimal: \\`${n}\\` is not a finite number`);\n const got = /^(-?)(\\d)(?:\\.(\\d+))?e([+-])(\\d+)$/.exec(String(n));\n if (got === null)\n return String(n);\n const [, sign = '', lead = '', rest = '', ahead = '', exp = '0'] = got;\n return ahead === '+' ? `${sign}${lead}${rest}${'0'.repeat(Number(exp) - rest.length)}` : `${sign}0.${'0'.repeat(Number(exp) - 1)}${lead}${rest}`;\n}\n/**\n * The forms this reader parses, each with the grammar that reads its value. The alphabet of forms is what these\n * implement — never a list kept beside them, which the lock could move and the list could not.\n */\nconst GRAMMARS = {\n interval: (value) => {\n const at = value.indexOf('..');\n if (at < 0)\n return null;\n const lo = value.slice(0, at);\n const hi = value.slice(at + 2);\n const l = lo === OPEN ? null : num(lo);\n const h = hi === OPEN ? null : num(hi);\n if ((lo !== OPEN && l === null) || (hi !== OPEN && h === null))\n return null;\n return { kind: 'interval', lo: l, hi: h };\n },\n alphabet: (value) => {\n const values = unpipe(value);\n return values === null ? null : { kind: 'enumerated', values };\n },\n ladder: (value) => {\n const parts = unpipe(value);\n if (parts === null || parts.length !== 2)\n return null;\n return { kind: 'band', floor: parts[0] ?? '', ceiling: parts[1] ?? '' };\n },\n};\nexport function boundOf(form, value, grammars) {\n const extra = Array.isArray(grammars) ? grammars.find((g) => g.form === form) : undefined;\n if (extra)\n return extra.parse(value);\n return GRAMMARS[form]?.(value) ?? null;\n}\nexport const BOUND_FORMS = Object.keys(GRAMMARS);\nexport const REF_RELATIONS = ['within', 'copies', 'derives'];\n"}]},{"identity":"sha256:6cd93a688f1b0c5017a772cff1c27b29937d2844f4101f69a8dcc320e2fcb885","package":"@lapxo/obligations","members":[{"coordinate":"dist/debit/debit.js","digest":"sha256:4e9c79bfb91f542dcb1609846da3d32058b87a4c45cd3eafa13821d567f8feb9","source":"export function foldIn(L, demands) {\n let acc = L.top;\n for (const d of demands)\n acc = L.meet(acc, d);\n return acc;\n}\nexport function witnessesIn(L, demands) {\n const whole = foldIn(L, demands);\n if (L.inhabited(whole))\n return null;\n for (let i = 0; i < demands.length; i++) {\n for (let j = i + 1; j < demands.length; j++) {\n if (!L.inhabited(L.meet(demands[i], demands[j]))) {\n return [demands[i], demands[j]];\n }\n }\n }\n return null;\n}\n"},{"coordinate":"dist/debit/graph.js","digest":"sha256:5be27ebec40dcb3ffdc34775622a1c07367daa2ad2de93b3ca0edecf4b823bea","source":"export function buildGraph(edges) {\n const index = new Map();\n const names = [];\n const intern = (s) => {\n const hit = index.get(s);\n if (hit !== undefined)\n return hit;\n const i = names.length;\n names.push(s);\n index.set(s, i);\n return i;\n };\n const pairs = [];\n for (const [a, b] of edges)\n pairs.push([intern(a), intern(b)]);\n const size = names.length;\n const counts = new Int32Array(size);\n for (const [a] of pairs)\n counts[a]++;\n const heads = new Int32Array(size + 1);\n for (let i = 0; i < size; i++)\n heads[i + 1] = heads[i] + counts[i];\n const tails = new Int32Array(pairs.length);\n const cursor = heads.slice();\n for (const [a, b] of pairs)\n tails[cursor[a]++] = b;\n return {\n size,\n id: (name) => index.get(name) ?? -1,\n name: (id) => names[id] ?? '',\n heads,\n tails,\n };\n}\nexport function reachIds(g, from, scratch) {\n const seen = scratch ?? new Uint8Array(g.size);\n if (scratch)\n seen.fill(0);\n if (from < 0 || from >= g.size)\n return seen;\n const queue = [from];\n seen[from] = 1;\n while (queue.length > 0) {\n const v = queue.pop();\n for (let i = g.heads[v]; i < g.heads[v + 1]; i++) {\n const n = g.tails[i];\n if (!seen[n]) {\n seen[n] = 1;\n queue.push(n);\n }\n }\n }\n return seen;\n}\n"},{"coordinate":"dist/debit/ideal.js","digest":"sha256:4c55b1eaad5301c264611e322aee48734c2dd95a7f54493ca1211caf6a4988fd","source":"import { UnitError } from \"../lattice/errors.js\";\nconst namesOf = (c) => c.levels;\nconst sorted = (names) => [...new Set(names)].sort();\nconst has = (xs, name) => xs.includes(name);\nexport function upset(c, names) {\n return sorted(namesOf(c).filter((_, i) => names.some((n) => c.leq(c.rank(n), i))));\n}\nexport function downset(c, names) {\n return sorted(namesOf(c).filter((_, i) => names.some((n) => c.leq(i, c.rank(n)))));\n}\nexport function isUpset(c, names) {\n const closed = upset(c, names);\n return names.length === closed.length && names.every((n) => has(closed, n));\n}\nexport function isDownset(c, names) {\n const closed = downset(c, names);\n return names.length === closed.length && names.every((n) => has(closed, n));\n}\nexport function isIdealPair(c, d) {\n return isUpset(c, d.demand) && isDownset(c, d.permit);\n}\nexport function idealDebit(c, demand, permit) {\n const pair = { demand: sorted(demand), permit: sorted(permit) };\n if (!isIdealPair(c, pair)) {\n throw new UnitError('MALFORMED', 'a debit that is not a pair of ideals', {\n demand: pair.demand,\n permit: pair.permit,\n });\n }\n return pair;\n}\nexport function idealMeet(a, b) {\n return {\n demand: sorted(a.demand.filter((n) => has(b.demand, n))),\n permit: sorted([...a.permit, ...b.permit]),\n };\n}\nexport function idealJoin(a, b) {\n return {\n demand: sorted([...a.demand, ...b.demand]),\n permit: sorted(a.permit.filter((n) => has(b.permit, n))),\n };\n}\nfunction idealInhabited(d) {\n return d.demand.some((n) => has(d.permit, n));\n}\nexport function idealEntails(a, b) {\n return a.demand.every((n) => has(b.demand, n)) && a.permit.every((n) => has(b.permit, n));\n}\nexport function idealComplexity(c, d) {\n const omega = namesOf(c);\n return omega.filter((n) => !has(d.demand, n)).length\n + omega.filter((n) => !has(d.permit, n)).length;\n}\nexport function unitToIdeal(c, u) {\n return {\n demand: upset(c, [u.floor]),\n permit: downset(c, [u.ceiling]),\n };\n}\nexport function freedom(c, u) {\n const d = unitToIdeal(c, u);\n const between = d.demand.filter((n) => has(d.permit, n)).length;\n return between > 1 ? Math.log2(between) : 0;\n}\nexport function unitComplexity(c, u) {\n return idealComplexity(c, unitToIdeal(c, u));\n}\nexport function fromIdeals(c) {\n const omega = namesOf(c);\n return {\n bottom: { demand: [], permit: [] },\n top: { demand: [...omega], permit: [...omega] },\n leq: (a, b) => idealEntails(a, b),\n meet: (a, b) => idealMeet(a, b),\n join: (a, b) => idealJoin(a, b),\n show: (x) => `{${x.demand.join(',')}}/{${x.permit.join(',')}}`,\n inhabited: (x) => idealInhabited(x),\n };\n}\n"},{"coordinate":"dist/debit/masks.js","digest":"sha256:4f175c64ecdd57f4e0b0746b58940390c6777b7cc8944b27f0badb7ba16bf37f","source":"import { UnitError } from \"../lattice/errors.js\";\nimport { WIDTH } from \"./packed.js\";\nexport function chunkCount(n) {\n if (n <= 0)\n return 0;\n return Math.ceil(n / WIDTH);\n}\nexport class WideMask {\n words;\n width;\n constructor(width, words) {\n this.width = width;\n this.words = words ?? new Uint32Array(chunkCount(width));\n }\n static fromTokens(tokens, allowed) {\n const m = new WideMask(tokens.length);\n tokens.forEach((t, i) => {\n if (allowed.has(t))\n m.set(i);\n });\n return m;\n }\n set(bit) {\n if (bit < 0 || bit >= this.width) {\n throw new UnitError('MALFORMED', `bit ${bit} is outside a mask of width ${this.width}`, {\n bit,\n width: this.width,\n });\n }\n this.words[bit >> 5] |= 1 << (bit & 31);\n }\n has(bit) {\n if (bit < 0 || bit >= this.width)\n return false;\n return (this.words[bit >> 5] & (1 << (bit & 31))) !== 0;\n }\n and(other) {\n const w = Math.max(this.width, other.width);\n const out = new WideMask(w);\n const n = Math.min(this.words.length, other.words.length);\n for (let i = 0; i < n; i++)\n out.words[i] = this.words[i] & other.words[i];\n return out;\n }\n or(other) {\n const w = Math.max(this.width, other.width);\n const out = new WideMask(w);\n for (let i = 0; i < out.words.length; i++) {\n out.words[i] = (this.words[i] ?? 0) | (other.words[i] ?? 0);\n }\n return out;\n }\n difference(other) {\n const w = Math.max(this.width, other.width);\n const out = new WideMask(w);\n for (let i = 0; i < out.words.length; i++) {\n out.words[i] = (this.words[i] ?? 0) & ~(other.words[i] ?? 0);\n }\n const spare = w % 32;\n if (spare !== 0 && out.words.length > 0) {\n out.words[out.words.length - 1] &= (1 << spare) - 1;\n }\n return out;\n }\n subsetOf(other) {\n const n = Math.max(this.words.length, other.words.length);\n for (let i = 0; i < n; i++) {\n const a = this.words[i] ?? 0;\n const b = other.words[i] ?? 0;\n if ((a & ~b) !== 0)\n return false;\n }\n return true;\n }\n size() {\n let n = 0;\n for (let i = 0; i < this.width; i++)\n if (this.has(i))\n n++;\n return n;\n }\n members(tokens) {\n return tokens.filter((_, i) => this.has(i));\n }\n static filled(width) {\n const m = new WideMask(width);\n if (width <= 0)\n return m;\n m.words.fill(0xffffffff);\n const spare = width % 32;\n if (spare !== 0)\n m.words[m.words.length - 1] = (1 << spare) - 1;\n return m;\n }\n}\n"},{"coordinate":"dist/debit/observer.js","digest":"sha256:a2ff9de359770cc855074c673c008c4c4168d371983fd88f14f7c90290d39e7b","source":"import { sign } from \"../field/sign.js\";\nimport { UnitError } from \"../lattice/errors.js\";\nimport { cell, parts } from \"../lattice/obligatory.js\";\nexport function price(bits, before, after) {\n return bits(before) - bits(after);\n}\nexport function looksLeft(L, world, origin) {\n return parts(L, world.get(origin) ?? cell(origin), world).ceiling.hi;\n}\nexport function pay(L, world, origin) {\n const held = parts(L, world.get(origin) ?? cell(origin), world);\n if (held.ceiling.hi - 1 < held.floor.lo)\n throw new UnitError('attention-spent', `obligations: REFUSE·attention ${origin} has no look left: an act nobody pays for is not taken`);\n return sign(L, world, origin, { lo: L.top.lo, hi: held.ceiling.hi - 1 });\n}\n"},{"coordinate":"dist/debit/packed.js","digest":"sha256:292c09c79fe8870f6fd45558a949ab6e1ca9081d97cef9008dff79295e7a53fe","source":"import { UnitError } from \"../lattice/errors.js\";\nexport const WIDTH = 32;\nexport const opinion = (demanded, permitted, limiting, required) => ({\n demanded,\n permitted,\n limiting,\n required,\n demand: demanded,\n limit: permitted,\n});\nconst clashes = (p) => p.demanded & ~p.permitted;\nconst dualClashes = (p) => p.limiting & ~p.required;\nconst isConflict = (p) => clashes(p) !== 0;\nexport const or = (a, b) => opinion(a.demanded & b.demanded, a.permitted | b.permitted, a.limiting & b.limiting, a.required | b.required);\nexport const and = (a, b) => opinion(a.demanded | b.demanded, a.permitted & b.permitted, a.limiting | b.limiting, a.required & b.required);\nconst ones = (n) => (n === WIDTH ? -1 : (1 << n) - 1);\nexport function packer(c) {\n const joins = c.joins();\n const limits = c.limits();\n if (joins.length > WIDTH || limits.length > WIDTH) {\n throw new UnitError('MALFORMED', `this scale has ${joins.length} demand-debits and ${limits.length} ` +\n `limit-debits; each opinion holds at most ${WIDTH}`, { joins: joins.length, limits: limits.length, width: WIDTH });\n }\n const allJ = ones(joins.length);\n const allM = ones(limits.length);\n const above = joins.map((j) => {\n let m = 0;\n limits.forEach((lim, bit) => {\n if (c.leq(j, lim))\n m |= 1 << bit;\n });\n return m;\n });\n const miAboveAll = (jiMask) => {\n let acc = allM;\n for (let bit = 0; bit < joins.length; bit++) {\n if ((jiMask & (1 << bit)) !== 0)\n acc &= above[bit];\n }\n return acc;\n };\n const jiBelowAll = (miMask) => {\n let out = 0;\n for (let bit = 0; bit < joins.length; bit++) {\n if ((miMask & ~above[bit]) === 0)\n out |= 1 << bit;\n }\n return out;\n };\n const joinOf = (mask) => joins.reduce((acc, j, bit) => ((mask & (1 << bit)) !== 0 ? c.higher(acc, j) : acc), c.bottomIx);\n return {\n width: joins.length,\n joinWidth: joins.length,\n limitWidth: limits.length,\n free: () => opinion(0, allJ, 0, allM),\n pack(u) {\n const f = c.rank(u.floor);\n const cl = c.rank(u.ceiling);\n let demanded = 0;\n let permitted = 0;\n joins.forEach((j, bit) => {\n if (c.leq(j, f))\n demanded |= 1 << bit;\n if (c.leq(j, cl))\n permitted |= 1 << bit;\n });\n let limiting = 0;\n let required = 0;\n limits.forEach((m, bit) => {\n if (c.leq(cl, m))\n limiting |= 1 << bit;\n if (c.leq(f, m))\n required |= 1 << bit;\n });\n return opinion(demanded, permitted, limiting, required);\n },\n unpack: (subject, p) => ({\n subject,\n floor: c.levels[joinOf(p.demanded)],\n ceiling: c.levels[joinOf(p.permitted)],\n }),\n state(p) {\n if (isConflict(p))\n return 'CONFLICT';\n if (p.demanded !== 0)\n return 'REQUIRED';\n if (p.permitted !== allJ)\n return 'FORBIDDEN';\n return 'FREE';\n },\n clashing: (p) => joins.filter((_, bit) => (clashes(p) & (1 << bit)) !== 0).map((j) => c.levels[j]),\n clashingLimits: (p) => limits.filter((_, bit) => (dualClashes(p) & (1 << bit)) !== 0).map((m) => c.levels[m]),\n maskOf(level) {\n const l = c.rank(level);\n let m = 0;\n joins.forEach((j, bit) => {\n if (c.leq(j, l))\n m |= 1 << bit;\n });\n return m;\n },\n accepts: (p, mask) => (p.demanded & ~mask) === 0 && (mask & ~p.permitted) === 0,\n above: (jBit) => above[jBit] ?? 0,\n coherent(p) {\n return (p.required === miAboveAll(p.demanded) &&\n p.limiting === miAboveAll(p.permitted) &&\n p.demanded === jiBelowAll(p.required) &&\n p.permitted === jiBelowAll(p.limiting));\n },\n };\n}\nexport function canonical(pk, p) {\n return pk.pack(pk.unpack('', p));\n}\n"},{"coordinate":"dist/debit/provenance.js","digest":"sha256:75d20ac3801c01d2526550a2ec20201ec750290491aa7e8325ecef3fb6d6bb43","source":"import { chain } from \"../lattice/order.js\";\nimport { compose, unit } from \"./unit.js\";\nexport const METHODS = ['declared', 'statistics', 'sample', 'exact'];\nexport function weakest(methods) {\n const c = chain(METHODS);\n const units = [...methods].map((m) => unit('evidence', { floor: METHODS[0], ceiling: m }));\n return units.length === 0 ? 'exact' : compose(c, units).ceiling;\n}\n"},{"coordinate":"dist/debit/register.js","digest":"sha256:fa008ab4534bf27169dd85e9e873d4631d461fb0bcf7d5280dbdc25af2ddd4bd","source":"export function register(c, u) {\n const f = c.rank(u.floor);\n const cl = c.rank(u.ceiling);\n return {\n demanded: c.joins().filter((j) => c.leq(j, f)).map((j) => c.levels[j]),\n limiting: c.limits().filter((m) => c.leq(cl, m)).map((m) => c.levels[m]),\n };\n}\nexport function rebuild(c, reg, subject = '') {\n let floor = c.bottomIx;\n for (const name of reg.demanded)\n floor = c.higher(floor, c.rank(name));\n let ceiling = c.topIx;\n for (const name of reg.limiting)\n ceiling = c.lower(ceiling, c.rank(name));\n return { subject, floor: c.levels[floor], ceiling: c.levels[ceiling] };\n}\n"},{"coordinate":"dist/debit/shuffle.js","digest":"sha256:8dfd76ebab3d7bedec1e686cb371cfc96b4195c04e7f689df21cad5bd3d5726c","source":"function stream(seed) {\n let s = (Math.imul(seed + 1, 2654435761) ^ 0x5f3759df) >>> 0;\n return () => {\n s = (Math.imul(s, 1664525) + 1013904223) >>> 0;\n return s;\n };\n}\nexport function unitStream(seed) {\n const next = stream(seed);\n return () => next() / 4294967296;\n}\nexport function permute(xs, salt) {\n const next = stream(salt);\n const out = xs.slice();\n for (let i = out.length - 1; i > 0; i--) {\n const j = next() % (i + 1);\n const t = out[i];\n out[i] = out[j];\n out[j] = t;\n }\n return out;\n}\nexport function permutationBlind(values, claim, draws = 8) {\n const want = JSON.stringify(claim(values));\n for (let d = 0; d < draws; d++) {\n if (JSON.stringify(claim(permute(values, d + 1))) !== want)\n return false;\n }\n return true;\n}\n"},{"coordinate":"dist/debit/standing.js","digest":"sha256:261a3ab5322cc48120e42ce468249f83ad88be28dfbb892cfee403e6833dd8d1","source":"import { fuse } from \"./unit.js\";\nexport function touches(c, mine, folded) {\n return c.rank(mine.floor) === c.rank(folded.floor) || c.rank(mine.ceiling) === c.rank(folded.ceiling);\n}\nexport function holds(c, units, index) {\n if (index < 0 || index >= units.length)\n return false;\n const whole = fuse(c, units);\n const rest = units.filter((_, i) => i !== index);\n const next = fuse(c, rest);\n return next.floor !== whole.floor || next.ceiling !== whole.ceiling;\n}\n"},{"coordinate":"dist/debit/unit-span.js","digest":"sha256:f882bf1b9c084707e8490e47324fa68ad48f662cb6ee94be5075e48ecb2eb514","source":"import { unitComplexity } from \"./ideal.js\";\nexport function statesPerDebit(c, u) {\n const f = c.rank(u.floor);\n const cl = c.rank(u.ceiling);\n return c.joins().map((j) => {\n const demanded = c.leq(j, f);\n const permitted = c.leq(j, cl);\n return [\n c.levels[j],\n demanded ? (permitted ? 'REQUIRED' : 'CONFLICT') : permitted ? 'FREE' : 'FORBIDDEN',\n ];\n });\n}\nexport function anyOf(c, units) {\n const rank = (u) => [c.rank(u.floor), c.rank(u.ceiling)];\n const holds = (f, cl, l) => c.leq(f, l) && c.leq(l, cl);\n const levels = [...c.levels.keys()];\n let live = units.filter((u) => {\n const [f, cl] = rank(u);\n return c.leq(f, cl);\n });\n for (let changed = true; changed;) {\n changed = false;\n outer: for (let i = 0; i < live.length; i++) {\n for (let j = i + 1; j < live.length; j++) {\n const [af, ac] = rank(live[i]);\n const [bf, bc] = rank(live[j]);\n const lo = c.lower(af, bf);\n const hi = c.higher(ac, bc);\n const gains = levels.some((l) => holds(lo, hi, l) && !holds(af, ac, l) && !holds(bf, bc, l));\n if (gains)\n continue;\n live = [\n ...live.filter((_, k) => k !== i && k !== j),\n { subject: live[i].subject, floor: c.levels[lo], ceiling: c.levels[hi] },\n ];\n changed = true;\n break outer;\n }\n }\n }\n return live.sort((x, y) => {\n const [xf, xc] = rank(x);\n const [yf, yc] = rank(y);\n return xf - yf || xc - yc;\n });\n}\nexport function missing(c, have, want) {\n const [hf, hc] = [c.rank(have.floor), c.rank(have.ceiling)];\n const [wf, wc] = [c.rank(want.floor), c.rank(want.ceiling)];\n const all = [...c.levels.keys()];\n const weakestOf = (works) => {\n const ok = all.filter(works);\n return ok.filter((l) => !ok.some((o) => o !== l && c.leq(o, l))).map((l) => c.levels[l]);\n };\n return {\n raiseFloorTo: c.leq(wf, hf) ? [] : weakestOf((l) => c.leq(wf, c.higher(hf, l))),\n raiseCeilingTo: c.leq(wc, hc) ? [] : weakestOf((l) => c.leq(wc, c.higher(hc, l))),\n };\n}\nexport function complexity(c, u) {\n return unitComplexity(c, u);\n}\n"},{"coordinate":"dist/debit/unit.js","digest":"sha256:a26c30d5456d99667ab44ff56663fff0ced252de60b860acefb820c32a0f5f78","source":"import { UnitError } from \"../lattice/errors.js\";\nexport function unit(subject, bounds) {\n return { subject, floor: bounds.floor, ceiling: bounds.ceiling };\n}\nexport const permitAll = (c, subject) => unit(subject, { floor: c.bottom, ceiling: c.top });\nexport function state(c, u) {\n return c.stateOf(c.rank(u.floor), c.rank(u.ceiling));\n}\nexport function asBoolean(c, u) {\n const s = state(c, u);\n if (s === 'CONFLICT') {\n return {\n kind: 'unsayable',\n lost: 'a boolean has no way to say two promises cannot both hold, so a ' +\n 'register of booleans settles it by precedence instead',\n };\n }\n if (s === 'REQUIRED') {\n return {\n kind: 'lossy',\n value: true,\n lost: 'the floor: a boolean says may, never must, so nothing records that ' +\n 'somebody depends on this',\n };\n }\n if (s === 'FORBIDDEN') {\n return c.rank(u.ceiling) === c.bottomIx\n ? { kind: 'exactly', value: false }\n : { kind: 'lossy', value: true, lost: 'the ceiling: a boolean cannot say how far' };\n }\n return { kind: 'exactly', value: true };\n}\nexport function bitLoss(c) {\n let exactly = 0;\n let lossy = 0;\n let unsayable = 0;\n let possible = 0;\n for (const floor of c.levels) {\n for (const ceiling of c.levels) {\n possible++;\n const k = asBoolean(c, { subject: '', floor, ceiling }).kind;\n if (k === 'exactly')\n exactly++;\n else if (k === 'lossy')\n lossy++;\n else\n unsayable++;\n }\n }\n return { possible, exactly, lossy, unsayable };\n}\nexport function compose(c, units) {\n for (const u of units) {\n if (!c.leq(c.rank(u.floor), c.rank(u.ceiling))) {\n throw new UnitError('MALFORMED', `\\`${u.subject}\\` cannot be met by anything`, {\n subject: u.subject,\n floor: u.floor,\n ceiling: u.ceiling,\n });\n }\n }\n return fuse(c, units);\n}\nfunction band(c, units, from, onFloor, onCeiling) {\n let floor = from.floor;\n let ceiling = from.ceiling;\n for (const u of units) {\n floor = onFloor(floor, c.rank(u.floor));\n ceiling = onCeiling(ceiling, c.rank(u.ceiling));\n }\n return { subject: units[0].subject, floor: c.levels[floor], ceiling: c.levels[ceiling] };\n}\nexport function fuse(c, units) {\n if (units.length === 0)\n return permitAll(c, '');\n return band(c, units, { floor: c.bottomIx, ceiling: c.topIx }, (a, b) => c.higher(a, b), (a, b) => c.lower(a, b));\n}\nexport function composeState(c, units) {\n const u = compose(c, units);\n return c.stateOf(c.rank(u.floor), c.rank(u.ceiling));\n}\nconst ORDER = ['FREE', 'REQUIRED', 'FORBIDDEN', 'CONFLICT'];\nconst RoC = 'REQUIRED_OR_CONFLICT';\nconst TABLE = [\n ['FREE', 'REQUIRED', 'FORBIDDEN', 'CONFLICT'],\n ['REQUIRED', RoC, RoC, 'CONFLICT'],\n ['FORBIDDEN', RoC, 'FORBIDDEN', 'CONFLICT'],\n ['CONFLICT', 'CONFLICT', 'CONFLICT', 'CONFLICT'],\n];\nexport function table(a, b) {\n return TABLE[ORDER.indexOf(a)][ORDER.indexOf(b)];\n}\nexport function conflictDebits(c, u) {\n const f = c.rank(u.floor);\n const cl = c.rank(u.ceiling);\n if (c.leq(f, cl))\n return 0;\n return c.joins().filter((j) => c.leq(j, f) && !c.leq(j, cl)).length;\n}\nexport function entails(c, a, b) {\n const [af, ac] = [c.rank(a.floor), c.rank(a.ceiling)];\n const [bf, bc] = [c.rank(b.floor), c.rank(b.ceiling)];\n return c.leq(bf, af) && c.leq(ac, bc);\n}\nexport function widen(c, units) {\n if (units.length === 0)\n return { subject: '', floor: c.levels[c.topIx], ceiling: c.levels[c.bottomIx] };\n return band(c, units, { floor: c.topIx, ceiling: c.bottomIx }, (a, b) => c.lower(a, b), (a, b) => c.higher(a, b));\n}\nexport { anyOf, missing, statesPerDebit, complexity } from \"./unit-span.js\";\n"},{"coordinate":"dist/debit/vector-move.js","digest":"sha256:0573c65d6a55bc4c20cd0e2e537e9ae6d275825b0d6e09bf20828c193b0d0a87","source":"const STATES = ['REQUIRED', 'FREE', 'FORBIDDEN', 'CONFLICT'];\nexport const DANGEROUS = STATES.filter((s) => s !== 'CONFLICT').map((s) => [s, 'CONFLICT']);\nconst zero = () => {\n const m = {};\n for (const a of STATES) {\n m[a] = {};\n for (const b of STATES)\n m[a][b] = 0;\n }\n return m;\n};\nexport function transitions(before, after, width) {\n const at = (q, bit) => {\n for (const s of STATES)\n if (q[s].has(bit))\n return s;\n return null;\n };\n const m = zero();\n for (let bit = 0; bit < width; bit++) {\n const a = at(before, bit);\n const b = at(after, bit);\n if (a === null || b === null)\n continue;\n m[a][b] += 1;\n }\n return m;\n}\nexport function dangerous(m) {\n return DANGEROUS\n .map(([from, to]) => ({ from, to, n: m[from][to] }))\n .filter((x) => x.n > 0);\n}\nexport function moved(m) {\n let n = 0;\n for (const a of STATES)\n for (const b of STATES)\n if (a !== b)\n n += m[a][b];\n return n;\n}\n"},{"coordinate":"dist/debit/vector.js","digest":"sha256:250eda384b40b23c5dbe20399e1a53a2e3d314847ac1b91c7172028cb6b91fb3","source":"import { WideMask } from \"./masks.js\";\nexport const STATES = ['REQUIRED', 'FREE', 'FORBIDDEN', 'CONFLICT'];\nexport function quadrants(demanded, permitted, extent) {\n const d = demanded.and(extent);\n const p = permitted.and(extent);\n return {\n REQUIRED: d.and(p),\n FREE: p.difference(d),\n FORBIDDEN: extent.difference(p).difference(d),\n CONFLICT: d.difference(p),\n };\n}\nexport function stateAt(q, bit) {\n for (const s of STATES)\n if (q[s].has(bit))\n return s;\n return null;\n}\nconst overlaps = (a, x) => x >= a.lo && x <= a.hi;\nexport function runQuadrants(demanded, permitted, extent) {\n if (extent.hi < extent.lo)\n return [];\n const cuts = new Set([extent.lo]);\n const add = (s) => {\n if (s.lo > extent.lo && s.lo <= extent.hi)\n cuts.add(s.lo);\n if (s.hi >= extent.lo && s.hi < extent.hi)\n cuts.add(s.hi + 1);\n };\n for (const s of demanded)\n add(s);\n if (permitted)\n add(permitted);\n const at = (x) => {\n const d = demanded.some((s) => overlaps(s, x));\n const p = permitted !== null && overlaps(permitted, x);\n if (d && p)\n return 'REQUIRED';\n if (d)\n return 'CONFLICT';\n return p ? 'FREE' : 'FORBIDDEN';\n };\n const points = [...cuts].sort((a, b) => a - b);\n const out = [];\n for (let i = 0; i < points.length; i++) {\n const lo = points[i];\n const hi = i + 1 < points.length ? points[i + 1] - 1 : extent.hi;\n if (hi < lo)\n continue;\n const state = at(lo);\n const last = out[out.length - 1];\n if (last && last.state === state && last.hi + 1 === lo) {\n out[out.length - 1] = { lo: last.lo, hi, state };\n continue;\n }\n out.push({ lo, hi, state });\n }\n return out;\n}\nexport { DANGEROUS, dangerous, moved, transitions } from \"./vector-move.js\";\n"},{"coordinate":"dist/field/encounter.js","digest":"sha256:84a46a48496abb0fcad4d37f7c891e9c7e4a7ea080035f05473d7e052e51bf22","source":"import { witnessesIn } from \"../debit/debit.js\";\nimport { key } from \"./field.js\";\nimport { meet } from \"./meet.js\";\nimport { intervals } from \"../lattice/forms.js\";\nimport { live } from \"../lattice/obligatory.js\";\nconst spanning = (spans) => intervals(Math.min(...spans.map((one) => one.lo)), Math.max(...spans.map((one) => one.hi)));\nexport function origins(place) {\n return new Set(place.seen.map((s) => s.origin)).size;\n}\nexport function potential(place) {\n return origins(place) < 2;\n}\nexport function disagree(place) {\n const spans = place.seen.map((s) => s.span);\n const split = spans.length ? witnessesIn(spanning(spans), spans) : null;\n if (!split)\n return null;\n const left = place.seen.find((s) => s.span === split[0]);\n const right = place.seen.find((s) => s.span === split[1]);\n return left && right ? [left, right] : null;\n}\nexport function meetAt(place) {\n const spans = place.seen.map((s) => s.span);\n if (!spans.length)\n throw new Error('obligations: REFUSE·meet a cell no origin has claimed has no meet of its own: read it against the form it belongs to');\n const form = spanning(spans);\n return spans.reduce((held, span) => form.meet(held, span));\n}\nexport function latest(places) {\n return places.reduce((held, place) => (held === null || place.epoch > held.epoch ? place : held), null);\n}\nexport function verdict(place) {\n return potential(place) ? 'one' : disagree(place) ? 'apart' : 'together';\n}\nexport function turned(before, after) {\n const held = new Map(before.map((p) => [key([{ at: p.at }]), verdict(p)]));\n return after.filter((p) => held.get(key([{ at: p.at }])) !== verdict(p));\n}\nexport function encounter(L, c, world = new Map()) {\n return { origins: new Set(live(c.seen).map((claim) => claim.origin)).size, held: meet(L, c, world) };\n}\nexport const cancels = (a, b) => Math.cos(a.phase - b.phase) < 0;\nexport function pairs(origins) {\n let forks = 0;\n let closes = 0;\n for (let i = 0; i < origins.length; i += 1)\n for (let j = i + 1; j < origins.length; j += 1)\n if (cancels(origins[i], origins[j]))\n forks += 1;\n else\n closes += 1;\n return { forks, closes };\n}\nexport function laminar(origins) {\n const x = origins.reduce((sum, one) => sum + Math.cos(one.phase), 0);\n const y = origins.reduce((sum, one) => sum + Math.sin(one.phase), 0);\n return x * x + y * y > origins.length;\n}\n"},{"coordinate":"dist/field/field.js","digest":"sha256:820abaed1d422fdb89c759ca31f3732b6bea6ff7bd1a5b20f2114c1626979880","source":"export function coordinate(name, steps = '/') {\n const at = name.split(new RegExp(`[${steps.replace(/[.*+?^${}()|[\\]\\\\-]/g, '\\\\$&')}]`)).filter((s) => s !== '');\n while (at[at.length - 1] === '*' || at[at.length - 1] === '**')\n at.pop();\n return at;\n}\nexport function point(name, epoch = 0, seen = [], steps = '/') {\n return { at: coordinate(name, steps), epoch, seen };\n}\nexport function region(name, steps = '/') {\n return { at: coordinate(name, steps) };\n}\nexport function coarsen(place, steps) {\n return { at: place.at.slice(0, Math.max(0, steps)), epoch: place.epoch, seen: place.seen };\n}\nexport function passes(place, step) {\n return step.startsWith('*') ? place.at.some((s) => s.endsWith(step.slice(1))) : place.at.includes(step);\n}\nexport function resolution(place) {\n return place.at.length;\n}\nexport function within(inner, outer) {\n const refines = (i, j) => j === outer.at.length\n || (outer.at[j] === '**'\n ? refines(i, j + 1) || (i < inner.at.length && refines(i + 1, j))\n : i < inner.at.length && (outer.at[j] === '*' || outer.at[j] === inner.at[i]) && refines(i + 1, j + 1));\n return refines(0, 0);\n}\nexport function exclusive(mine, others) {\n return mine.filter((one) => !others.some((other) => other.some((theirs) => resolution(theirs) === resolution(one) && within(one, theirs))));\n}\nexport function contracts(regions, touched) {\n return !regions.some((one) => touched.some((p) => within(p, one)));\n}\nexport function key(regions) {\n return [...new Set(regions.map((one) => one.at.join('/')))].sort().join('|');\n}\nconst inside = (one, of) => one >= of.lo && one <= of.hi;\nexport function foldRegion(places, where, f) {\n const gathered = new Map();\n for (const place of places) {\n if (!within(place, where))\n continue;\n const at = place.at.join('/');\n gathered.set(at, [...(gathered.get(at) ?? []), place]);\n }\n return [...gathered].sort((a, b) => (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0)).map(([at, met]) => ({ at, value: f(met) }));\n}\nexport function covers(met, of) {\n return met.every((place) => of.where.some((one) => within(place, one))\n && inside(resolution(place), of.steps)\n && inside(place.epoch, of.when));\n}\nexport function outranks(met, named, order) {\n const matched = named.filter(([step]) => met.some((place) => passes(place, step))).map(([, kind]) => kind);\n return order.find((kind) => matched.includes(kind)) ?? null;\n}\nexport function answers(met, where) {\n return met.length > 0 && met.every((place) => where.some((one) => within(place, one)));\n}\nexport function verified(met, green) {\n return met.some((place) => green(place));\n}\nexport function retracted(met, by) {\n return met.filter((place) => by.some((one) => within(place, one)));\n}\nexport function size(at, steps) {\n return new Set(at.map((name) => {\n const place = point(name);\n return (steps === undefined ? place : coarsen(place, steps)).at.join('/');\n })).size;\n}\nexport function sufficientResolution(finest, verdict, same = Object.is) {\n const whole = verdict(finest);\n for (let steps = 1; steps < finest; steps += 1)\n if (same(verdict(steps), whole))\n return steps;\n return finest;\n}\n"},{"coordinate":"dist/field/fragility.js","digest":"sha256:6c533de862591dfb397d4c93a0bc0660a00065343e6876691816c3e23724cb2e","source":"import { eq } from \"../lattice/lattice.js\";\nimport { live, parts } from \"../lattice/obligatory.js\";\nfunction takes(names, size) {\n if (size === 0)\n return [[]];\n return names.flatMap((name, i) => takes(names.slice(i + 1), size - 1).map((rest) => [name, ...rest]));\n}\nexport function fragility(L, c, world = new Map()) {\n const was = parts(L, c, world);\n const names = [...new Set(live(c.seen).map((claim) => claim.origin))];\n for (let size = 1; size <= names.length; size += 1) {\n for (const out of takes(names, size)) {\n const now = parts(L, { ...c, seen: c.seen.filter((claim) => !out.includes(claim.origin)) }, world);\n if (!eq(L, now.floor, was.floor) || !eq(L, now.ceiling, was.ceiling))\n return size;\n }\n }\n return 0;\n}\n"},{"coordinate":"dist/field/frontier.js","digest":"sha256:11931187be2c7e1afdb139c0e80582d8f2c1beefc30294c671f4d19d61636aba","source":"import { origins } from \"./encounter.js\";\nimport { resolution } from \"./field.js\";\nimport { premium } from \"../lattice/price/premium.js\";\nexport function frontier(c, value, asked) {\n return asked.filter((one) => origins(one.at) === 0).map((one) => {\n const cheapest = [...one.closers].sort((a, b) => (a.cost === b.cost ? (a.by < b.by ? -1 : 1) : a.cost - b.cost))[0];\n return {\n at: one.at.at.join('/'),\n resolution: resolution(one.at),\n premium: premium(c, value, c.rank(one.bound.floor), c.rank(one.bound.ceiling)),\n dependents: one.dependents.length,\n closer: cheapest?.by ?? null,\n cost: cheapest?.cost ?? null,\n };\n });\n}\n"},{"coordinate":"dist/field/join.js","digest":"sha256:c574e7f455e18284a8f9c120a78e30c3ad87e666dc85c4c9201f1b1d3abc5f71","source":"import { UnitError } from \"../lattice/errors.js\";\nimport { mark } from \"../lattice/obligatory.js\";\nexport function join(L, c, span, witness, at) {\n if (witness === '')\n throw new UnitError('join-unwitnessed', 'obligations: REFUSE·join a widening lands only with a witness or the signatures of whoever rests on the old bound');\n return { ...c, marks: [...(c.marks ?? []), mark({ pole: 'ceiling', reach: 'local', span: L.meet(L.top, span), widens: witness, ...(at === undefined ? {} : { at }) })] };\n}\n"},{"coordinate":"dist/field/meet.js","digest":"sha256:9b52c83f47dbf56e144aba56cc077ac7eb0ef57579aea5c72c13324d4f9dd39c","source":"import { parts } from \"../lattice/obligatory.js\";\nexport function meet(L, c, world = new Map()) {\n const { floor, ceiling } = parts(L, c, world);\n return L.meet(floor, ceiling);\n}\n"},{"coordinate":"dist/field/motion.js","digest":"sha256:8ae192e43a7ae7c0b406280984063a8094a67a8a0d4e0d9fa943a21c2c7571b7","source":"import { isDistributive } from \"../lattice/order.js\";\nimport { isSupermodular, premium } from \"../lattice/price/premium.js\";\nimport { state, unit } from \"../debit/unit.js\";\nimport { statesPerDebit } from \"../debit/unit-span.js\";\nimport { STATES } from \"../debit/vector.js\";\nexport function declarationOf(c, place) {\n return place.seen.reduce((held, s) => ({ demand: c.higher(held.demand, s.span.lo), limit: c.lower(held.limit, s.span.hi) }), { demand: c.bottomIx, limit: c.topIx });\n}\nexport function unitOf(c, place) {\n const { demand, limit } = declarationOf(c, place);\n return unit(place.at.join('/'), { floor: c.levels[demand] ?? c.bottom, ceiling: c.levels[limit] ?? c.top });\n}\nexport function stateOf(c, place) {\n return state(c, unitOf(c, place));\n}\nexport function registerOf(c, place) {\n return statesPerDebit(c, unitOf(c, place));\n}\nexport function premiumOf(c, value, place) {\n const { demand, limit } = declarationOf(c, place);\n return premium(c, value, demand, limit);\n}\nexport function degenerate(c, value) {\n return isSupermodular(c, value);\n}\nexport function withdrawsExactly(c) {\n return isDistributive(c);\n}\nexport function movesOf(c, before, after) {\n const moves = Object.fromEntries(STATES.map((a) => [a, Object.fromEntries(STATES.map((b) => [b, 0]))]));\n const was = new Map(registerOf(c, before));\n for (const [debit, now] of registerOf(c, after)) {\n const then = was.get(debit);\n if (then)\n moves[then][now] += 1;\n }\n return moves;\n}\n"},{"coordinate":"dist/field/observe.js","digest":"sha256:e9255aea5a52edaa841ca520804870f714817fb64b764c3d66921055c6165f3f","source":"import { UnitError } from \"../lattice/errors.js\";\nexport function observe(c, claim, s = claim.takes === undefined ? 1 : -1) {\n const takes = s === 1 ? undefined : claim.takes ?? claim.id;\n if (s === 1 && claim.takes !== undefined)\n throw new UnitError('sign-mismatch', 'obligations: REFUSE·observe a claim that takes another back is observed at −1, never at +1');\n if (s === -1 && takes === undefined)\n throw new UnitError('withdrawal-unnamed', 'obligations: REFUSE·observe a withdrawal names the claim it takes back, never a value that looks like it');\n const line = takes === undefined ? claim : { origin: claim.origin, span: claim.span, sign: -1, takes, ...(claim.at === undefined ? {} : { at: claim.at }) };\n return { ...c, epoch: Math.max(c.epoch, claim.at ?? c.epoch), seen: [...c.seen, line] };\n}\n"},{"coordinate":"dist/field/present.js","digest":"sha256:1d730a7a65ffd97f3fce761ddee21b99947bfc60ca190b4107c90562fde26692","source":"import { meetAt, potential } from \"./encounter.js\";\nexport function present(place) {\n if (potential(place))\n return 'potential';\n const held = meetAt(place);\n return held.lo > held.hi ? null : held;\n}\nexport function converge(width, maturation, forgetting, epochs) {\n let at = width;\n for (let epoch = 0; epoch < epochs; epoch += 1)\n at = Math.max(0, at + maturation - forgetting);\n return { width: at, trend: at === 0 && width > 0 ? 'zero' : at > width ? 'widens' : at < width ? 'narrows' : 'holds' };\n}\nexport function endsBeforeNow(now, leading, lagging) {\n const ends = [...leading, ...lagging].map(([, hi]) => hi);\n const end = ends.length ? Math.max(...ends) : 0;\n return leading.length === 0 && end < now;\n}\n"},{"coordinate":"dist/field/refine.js","digest":"sha256:1653d77d1e954d29eb5e6968ff8fb9992d05a2f0990ee48d634c931bf24c1201","source":"export function refine(c, steps) {\n return { ...c, at: steps >= c.at.length ? c.at : c.at.slice(0, Math.max(1, steps)) };\n}\n"},{"coordinate":"dist/field/require.js","digest":"sha256:895a5491ca1c60cb0cc7db2325df7c9b02e69ce25df7dc378371fc38df146b9c","source":"import { cell, mark } from \"../lattice/obligatory.js\";\nexport function require(L, world, name, span, line = {}) {\n const held = world.get(name) ?? cell(name);\n return new Map([...world, [name, { ...held, marks: [...(held.marks ?? []), mark({ pole: 'floor', reach: 'travels', span: L.meet(L.top, span), ...line })] }]]);\n}\n"},{"coordinate":"dist/field/sign.js","digest":"sha256:0286a81e542ce89696d8593dedec9b7930bb67b4bf55b959979638f1eb98f8a9","source":"import { cell, live, mark, restOf } from \"../lattice/obligatory.js\";\nexport function sign(L, world, name, span, line = {}) {\n const held = world.get(name) ?? cell(name);\n return new Map([...world, [name, { ...held, marks: [...(held.marks ?? []), mark({ pole: 'ceiling', reach: 'travels', span: L.meet(L.top, span), ...line })] }]]);\n}\nexport function restingOn(world) {\n const out = new Map();\n for (const [name, one] of world)\n for (const bound of one.restsOn)\n out.set(bound, [...(out.get(bound) ?? []), name]);\n return out;\n}\nexport function bites(L, world, resting, name, span) {\n const own = (at) => live(world.get(at)?.marks ?? []).filter((one) => one.pole === 'ceiling' && one.reach === 'travels' && one.widens === undefined)\n .reduce((held, one) => L.meet(held, one.span), L.top);\n const above = (at) => restOf(world.get(at) ?? cell(at), world).reduce((held, up) => L.meet(held, own(up)), own(at));\n const bitten = [];\n const edge = [[name, above(name)]];\n const held = new Set([name]);\n for (let i = 0; i < edge.length; i += 1) {\n const [here, was] = edge[i];\n if (L.leq(was, span))\n continue;\n bitten.push(here);\n for (const next of resting.get(here) ?? []) {\n if (held.has(next))\n continue;\n held.add(next);\n const one = world.get(next);\n edge.push([next, one !== undefined && one.restsOn.length === 1 ? L.meet(was, own(next)) : above(next)]);\n }\n }\n return { cells: bitten, visits: edge.length };\n}\n"},{"coordinate":"dist/field/signatures.js","digest":"sha256:4f7b0afb3a20e1e23a64eaa5ba14d3a30c091f7ba435b75d862330067d117e2e","source":"import { relate } from \"../lattice/lattice.js\";\nexport function foldSigned(L, values) {\n const classes = [];\n for (let i = 0; i < values.length; i++) {\n const home = classes.find((c) => relate(L, values[c[0]], values[i]) === 'equal');\n if (home)\n home.push(i);\n else\n classes.push([i]);\n }\n const standing = [];\n for (let c = 0; c < classes.length; c++) {\n const mine = values[classes[c][0]];\n const beaten = classes.some((other, o) => o !== c && relate(L, values[other[0]], mine) === 'narrower');\n if (!beaten)\n standing.push(c);\n }\n return { classes, standing, fork: standing.length > 1 };\n}\n"},{"coordinate":"dist/field/yield.js","digest":"sha256:89aa3852828ff5ddeeb280532220f63ce8af5c8b66d722833a30282062c3a834","source":"import { freedom } from \"../debit/ideal.js\";\nexport function yieldOf(c, acts) {\n const by = new Map();\n for (const act of acts) {\n const moved = freedom(c, act.before) - freedom(c, act.after);\n const key = `${act.by} ${act.epoch}`;\n const held = by.get(key) ?? { by: act.by, epoch: act.epoch, closed: 0, reopened: 0, acts: 0 };\n by.set(key, {\n ...held,\n closed: held.closed + Math.max(moved, 0),\n reopened: held.reopened + Math.max(-moved, 0),\n acts: held.acts + 1,\n });\n }\n return [...by.values()].sort((a, b) => (a.by === b.by ? a.epoch - b.epoch : a.by < b.by ? -1 : 1));\n}\n"},{"coordinate":"dist/lattice/axioms.js","digest":"sha256:b2c0d26adcc3374a6d1864f60aeee57d2b0660ebe2ca08cb35602af077f3f722","source":"import { eq } from \"./lattice.js\";\nimport { isDownset, isUpset, idealJoin, idealMeet } from \"../debit/ideal.js\";\nexport const POSET_LAW_NAMES = [\n 'transitivity',\n 'antisymmetry',\n];\nexport const MEET_LAW_NAMES = [\n 'idempotence.meet',\n 'unit.top',\n 'top.greatest',\n 'commutativity.meet',\n 'consistency.meet',\n 'associativity.meet',\n];\nexport const JOIN_LAW_NAMES = [\n 'idempotence.join',\n 'unit.bottom',\n 'bottom.least',\n 'commutativity.join',\n 'consistency.join',\n 'associativity.join',\n];\nexport const BOTH_LAW_NAMES = [\n 'absorption.meet',\n 'absorption.join',\n];\nexport const LATTICE_LAW_NAMES = [\n ...POSET_LAW_NAMES,\n ...MEET_LAW_NAMES,\n ...JOIN_LAW_NAMES,\n ...BOTH_LAW_NAMES,\n];\nconst sayAt = (L, law, at) => `${law}: ${at.map((x) => L.show(x)).join(' , ')}`;\nexport function posetViolationsIn(L, xs) {\n const out = [];\n const same = (a, b) => eq(L, a, b);\n for (const a of xs) {\n for (const b of xs) {\n if (L.leq(a, b) && L.leq(b, a) && !same(a, b)) {\n out.push(sayAt(L, 'antisymmetry', [a, b]));\n }\n for (const d of xs) {\n if (L.leq(a, b) && L.leq(b, d) && !L.leq(a, d)) {\n out.push(sayAt(L, 'transitivity', [a, b, d]));\n }\n }\n }\n }\n return out;\n}\nexport function meetViolationsIn(L, xs) {\n const out = [...posetViolationsIn(L, xs)];\n const same = (a, b) => eq(L, a, b);\n const say = (law, ...at) => {\n out.push(sayAt(L, law, at));\n };\n for (const a of xs) {\n if (!same(L.meet(a, a), a))\n say('idempotence.meet', a);\n if (!same(L.meet(a, L.top), a))\n say('unit.top', a);\n if (!L.leq(a, L.top))\n say('top.greatest', a);\n for (const b of xs) {\n if (!same(L.meet(a, b), L.meet(b, a)))\n say('commutativity.meet', a, b);\n const le = L.leq(a, b);\n if (le !== same(L.meet(a, b), a))\n say('consistency.meet', a, b);\n for (const d of xs) {\n if (!same(L.meet(L.meet(a, b), d), L.meet(a, L.meet(b, d)))) {\n say('associativity.meet', a, b, d);\n }\n }\n }\n }\n return out;\n}\nexport function violationsIn(L, xs) {\n const out = [...meetViolationsIn(L, xs)];\n const same = (a, b) => eq(L, a, b);\n const say = (law, ...at) => {\n out.push(sayAt(L, law, at));\n };\n for (const a of xs) {\n if (!same(L.join(a, a), a))\n say('idempotence.join', a);\n if (!same(L.join(a, L.bottom), a))\n say('unit.bottom', a);\n if (!L.leq(L.bottom, a))\n say('bottom.least', a);\n for (const b of xs) {\n if (!same(L.join(a, b), L.join(b, a)))\n say('commutativity.join', a, b);\n if (!same(L.meet(a, L.join(a, b)), a))\n say('absorption.meet', a, b);\n if (!same(L.join(a, L.meet(a, b)), a))\n say('absorption.join', a, b);\n const le = L.leq(a, b);\n if (le !== same(L.join(a, b), b))\n say('consistency.join', a, b);\n for (const d of xs) {\n if (!same(L.join(L.join(a, b), d), L.join(a, L.join(b, d)))) {\n say('associativity.join', a, b, d);\n }\n }\n }\n }\n return out;\n}\nexport function closureViolationsIn(c, xs) {\n const out = [];\n const say = (law, at) => {\n out.push(`${law}: ${at}`);\n };\n const shown = (d) => `{${d.demand.join(',')}}/{${d.permit.join(',')}}`;\n for (const a of xs) {\n if (!isUpset(c, a.demand))\n say('closure.demand', shown(a));\n if (!isDownset(c, a.permit))\n say('closure.permit', shown(a));\n for (const b of xs) {\n const m = idealMeet(a, b);\n const j = idealJoin(a, b);\n if (!isUpset(c, m.demand) || !isDownset(c, m.permit)) {\n say('closure.meet', `${shown(a)} , ${shown(b)}`);\n }\n if (!isUpset(c, j.demand) || !isDownset(c, j.permit)) {\n say('closure.join', `${shown(a)} , ${shown(b)}`);\n }\n }\n }\n return out;\n}\n"},{"coordinate":"dist/lattice/declaration.js","digest":"sha256:c5c4459ad4f5cffe970f87129bd5ddedeb9e35f1163204630788a574a5fdbd78","source":"export function declaration(c, u) {\n return { demand: c.rank(u.floor), limit: c.rank(u.ceiling) };\n}\nexport function asUnit(c, d, subject = '') {\n return { subject, floor: c.levels[d.demand], ceiling: c.levels[d.limit] };\n}\nexport function conj(c, a, b) {\n return { demand: c.higher(a.demand, b.demand), limit: c.lower(a.limit, b.limit) };\n}\nexport function disj(c, a, b) {\n return { demand: c.lower(a.demand, b.demand), limit: c.higher(a.limit, b.limit) };\n}\n"},{"coordinate":"dist/lattice/errors.js","digest":"sha256:0cc476498db21b2aab91e90cc0172bb34373cbe2876a21a21efdc8ba088112b0","source":"export class UnitError extends Error {\n code;\n detail;\n constructor(code, message, detail = {}) {\n super(message);\n this.name = 'UnitError';\n this.code = code;\n this.detail = Object.freeze({ ...detail });\n Object.setPrototypeOf(this, UnitError.prototype);\n }\n}\n"},{"coordinate":"dist/lattice/forms.js","digest":"sha256:9061bbb17d68f5d04e469ca83eebf4aa9db184d627b4228bee504f7f0be3dc42","source":"import { WideMask } from \"../debit/masks.js\";\nimport { fromScale, subsets } from \"./scale-lattice.js\";\nimport { chain, order } from \"./order.js\";\nexport function intervals(lo, hi) {\n const low = Math.min(lo, hi);\n const high = Math.max(lo, hi);\n return {\n bottom: { lo: high, hi: low },\n top: { lo: low, hi: high },\n leq(a, b) {\n if (a.lo > a.hi)\n return true;\n if (b.lo > b.hi)\n return false;\n return b.lo <= a.lo && a.hi <= b.hi;\n },\n meet(a, b) {\n return { lo: Math.max(a.lo, b.lo), hi: Math.min(a.hi, b.hi) };\n },\n join(a, b) {\n if (a.lo > a.hi)\n return b;\n if (b.lo > b.hi)\n return a;\n return { lo: Math.min(a.lo, b.lo), hi: Math.max(a.hi, b.hi) };\n },\n show(x) {\n return x.lo > x.hi ? 'empty' : `${x.lo}..${x.hi}`;\n },\n inhabited(x) {\n return x.lo <= x.hi;\n },\n };\n}\nexport function alphabets() {\n const within = (x, y) => [...x].every((v) => y.has(v));\n return {\n leq(a, b) {\n if (a.polarity === 'permit' && b.polarity === 'permit')\n return within(a.values, b.values);\n if (a.polarity === 'forbid' && b.polarity === 'forbid')\n return within(b.values, a.values);\n if (a.polarity === 'permit')\n return [...a.values].every((v) => !b.values.has(v));\n return false;\n },\n show(x) {\n return `${x.polarity === 'forbid' ? 'not:' : ''}${[...x.values].sort().join('|')}`;\n },\n };\n}\nfunction form(f) {\n const held = { lattice: f.lattice, parse: f.parse, emit: f.emit, count: f.count, show: f.show, points: f.points };\n const lacking = Object.entries(held).find(([, fn]) => typeof fn !== 'function');\n if (lacking)\n throw new Error(`form \\`${f.id}\\` declared no ${lacking[0]}`);\n return f;\n}\nconst rec = (x) => x !== null && typeof x === 'object' ? x : {};\nfunction strings(x) {\n return Array.isArray(x) ? x.map(String) : [];\n}\nconst drawn = (seed) => {\n let s = seed >>> 0;\n return () => {\n s = (s + 0x6d2b79f5) >>> 0;\n let t = Math.imul(s ^ (s >>> 15), s | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n};\nconst picked = (draw, xs) => xs[Math.floor(draw() * xs.length)];\nfunction bandCount(levels, folded) {\n if (levels.length === 0)\n return { kind: 'refused', why: 'a ladder with no levels cannot be counted' };\n const c = chain(levels);\n const f = c.rank(folded.floor);\n const cl = c.rank(folded.ceiling);\n if (!c.leq(f, cl))\n return { kind: 'finite', n: 0 };\n const n = levels.filter((_, i) => c.leq(f, i) && c.leq(i, cl)).length;\n return { kind: 'finite', n };\n}\nconst BAND = {\n parse(params, demand) {\n const L = this.lattice(params);\n const d = rec(demand);\n return {\n subject: String(d.subject ?? ''),\n floor: String(d.floor ?? L.top.floor),\n ceiling: String(d.ceiling ?? L.top.ceiling),\n };\n },\n emit(_params, value) {\n return { subject: value.subject, floor: value.floor, ceiling: value.ceiling };\n },\n count(folded, params) {\n return bandCount(strings(rec(params).levels), folded);\n },\n points(params, seed, n) {\n const L = this.lattice(params);\n const levels = strings(rec(params).levels);\n const draw = drawn(seed);\n const band = (floor, ceiling) => ({ subject: '', floor, ceiling });\n return Array.from({ length: n }, () => {\n const [a, b] = [picked(draw, levels), picked(draw, levels)];\n return [band(a, b), band(b, a)].find((x) => L.inhabited(x)) ?? band(a, a);\n });\n },\n};\nexport const ladderForm = form({\n id: 'ladder',\n lattice(params) {\n const levels = strings(rec(params).levels);\n if (levels.length === 0)\n throw new Error('ladder needs levels');\n return fromScale(chain(levels));\n },\n ...BAND,\n show(value) {\n return value.floor === value.ceiling ? value.floor : `${value.floor}..${value.ceiling}`;\n },\n});\nexport const alphabetForm = form({\n id: 'alphabet',\n lattice(params) {\n return subsets(strings(rec(params).tokens));\n },\n parse(params, demand) {\n const tokens = strings(rec(params).tokens);\n const d = rec(demand);\n const want = d.want !== undefined ? strings(d.want) : tokens;\n return WideMask.fromTokens(tokens, new Set(want));\n },\n emit(params, value) {\n return { want: value.members(strings(rec(params).tokens)) };\n },\n count(folded) {\n return { kind: 'finite', n: folded.size() };\n },\n show(value) {\n return `${value.size()}`;\n },\n points(params, seed, n) {\n const tokens = strings(rec(params).tokens);\n const draw = drawn(seed);\n return Array.from({ length: n }, () => WideMask.fromTokens(tokens, new Set(tokens.filter(() => draw() < 0.5))));\n },\n});\nexport const continuousForm = form({\n id: 'continuous',\n lattice(params) {\n const p = rec(params);\n return intervals(Number(p.lo ?? 0), Number(p.hi ?? 1));\n },\n parse(params, demand) {\n const L = this.lattice(params);\n const d = rec(demand);\n return {\n lo: d.lo === undefined ? L.top.lo : Number(d.lo),\n hi: d.hi === undefined ? L.top.hi : Number(d.hi),\n };\n },\n emit(_params, value) {\n return { lo: value.lo, hi: value.hi };\n },\n count() {\n return { kind: 'refused', why: 'a continuous band has no count; prefer not to exist over inventing one' };\n },\n show(value) {\n return value.lo > value.hi ? 'empty' : `${value.lo}..${value.hi}`;\n },\n points(params, seed, n) {\n const p = rec(params);\n const lo = Number(p.lo ?? 0);\n const hi = Number(p.hi ?? 1);\n const draw = drawn(seed);\n const at = () => lo + Math.round(draw() * (hi - lo));\n return Array.from({ length: n }, () => ({ lo: at(), hi: at() }));\n },\n});\nexport const latticeForm = form({\n id: 'lattice',\n lattice(params) {\n const p = rec(params);\n const levels = strings(p.levels);\n const leq = p.leq;\n if (levels.length && leq)\n return fromScale(order(levels, leq));\n throw new Error('lattice needs levels+leq');\n },\n ...BAND,\n show(value) {\n return `${value.floor}..${value.ceiling}`;\n },\n});\nexport const FORM_IMPLEMENTATIONS = [ladderForm, alphabetForm, continuousForm, latticeForm];\nexport const FORMS = [...FORM_IMPLEMENTATIONS];\n"},{"coordinate":"dist/lattice/index.js","digest":"sha256:597e3c37c0d370687d1ed0674ae0737c8ec9efac5ca270c1abdb84413dd147f5","source":"export { UnitError } from \"./errors.js\";\nexport { chain, height, isDistributive, order } from \"./order.js\";\nexport { asBoolean, bitLoss, compose, composeState, fuse, widen, conflictDebits, anyOf, missing, entails, permitAll, state, statesPerDebit, table, unit } from \"../debit/unit.js\";\nexport { WIDTH, and, or, canonical } from \"../debit/packed.js\";\nexport { WideMask, chunkCount } from \"../debit/masks.js\";\nexport { rebuild, register } from \"../debit/register.js\";\nexport { DANGEROUS, STATES, dangerous, moved, quadrants, runQuadrants, stateAt, transitions } from \"../debit/vector.js\";\nexport { METHODS, weakest } from \"../debit/provenance.js\";\nexport { touches, holds } from \"../debit/standing.js\";\nexport { declaration, asUnit, conj, disj } from \"./declaration.js\";\nexport { relate } from \"./lattice.js\";\nexport { intervals, alphabets } from \"./forms.js\";\nexport { foldIn, witnessesIn } from \"../debit/debit.js\";\nexport { foldSigned } from \"../field/signatures.js\";\nexport { size, sufficientResolution } from \"../field/field.js\";\nexport { present, converge, endsBeforeNow } from \"../field/present.js\";\nexport { yieldOf } from \"../field/yield.js\";\nexport { frontier } from \"../field/frontier.js\";\nexport { declarationOf, unitOf, stateOf, registerOf, premiumOf, degenerate, withdrawsExactly, movesOf } from \"../field/motion.js\";\nexport { violationsIn, meetViolationsIn, posetViolationsIn, closureViolationsIn, LATTICE_LAW_NAMES, POSET_LAW_NAMES, MEET_LAW_NAMES, JOIN_LAW_NAMES, BOTH_LAW_NAMES, } from \"./axioms.js\";\nexport { fromScale, subsets } from \"./scale-lattice.js\";\nexport { downset, freedom, fromIdeals, idealComplexity, idealDebit, idealEntails, idealJoin, idealMeet, isDownset, isIdealPair, isUpset, unitToIdeal, upset } from \"../debit/ideal.js\";\nexport { FORM_IMPLEMENTATIONS, FORMS, ladderForm, alphabetForm, continuousForm, latticeForm } from \"./forms.js\";\nexport { buildGraph, reachIds } from \"../debit/graph.js\";\nexport { isMonotone, vacuityOf } from \"./vacuity.js\";\nexport { permute, permutationBlind, unitStream } from \"../debit/shuffle.js\";\nexport { answers, coarsen, coordinate, contracts, covers, exclusive, foldRegion, key, outranks, passes, point, region, resolution, retracted, verified, within } from \"../field/field.js\";\nexport { disagree, latest, meetAt, origins, potential, turned } from \"../field/encounter.js\";\nexport { replay } from \"../replay.js\";\n"},{"coordinate":"dist/lattice/lattice.js","digest":"sha256:0922b8ee14e1fd0e6c56cf026b377e67e070e1ab5ede71b64aebe17ecc4303a7","source":"export function eq(L, a, b) {\n return L.leq(a, b) && L.leq(b, a);\n}\nexport function relate(L, a, b) {\n const ab = L.leq(a, b);\n const ba = L.leq(b, a);\n if (ab && ba)\n return 'equal';\n if (ab)\n return 'narrower';\n if (ba)\n return 'wider';\n return 'incomparable';\n}\n"},{"coordinate":"dist/lattice/obligatory.js","digest":"sha256:767c01b525fe5e97997acebdd2aac89c0d6e579fd9d6955c339292d17d34d048","source":"import { coordinate } from \"../field/field.js\";\nimport { UnitError } from \"./errors.js\";\nexport function cell(at, epoch = 0, seen = [], restsOn = []) {\n return { at: coordinate(at), epoch, seen, restsOn };\n}\nexport function mark(one) {\n if (one.widens !== undefined && one.reach === 'travels') {\n throw new UnitError('widening-travels', 'obligations: REFUSE·widening-travels a widening stands where it was witnessed and never travels to what rests there', { pole: one.pole });\n }\n return one.takes === undefined ? one : { ...one, sign: -1 };\n}\nexport function live(lines) {\n const taken = new Set(lines.flatMap((line) => (line.takes === undefined ? [] : [line.takes])));\n return lines.filter((line) => line.takes === undefined && (line.id === undefined || !taken.has(line.id)));\n}\nexport function restOf(c, world = new Map()) {\n const own = c.at.join('/');\n const out = [];\n const held = new Set();\n const edge = [...c.restsOn];\n const above = new Map();\n for (let i = 0; i < edge.length; i += 1) {\n const name = edge[i];\n if (name === own)\n throw new UnitError('rest-cycle', `obligations: REFUSE·rest ${own} rests on itself: an order of rest with a cycle has no fold to reach`, { at: own });\n if (held.has(name))\n continue;\n held.add(name);\n out.push(name);\n const rests = world.get(name)?.restsOn ?? [];\n above.set(name, rests);\n for (const ancestor of rests)\n edge.push(ancestor);\n }\n const status = new Map();\n for (const name of out) {\n if (status.has(name))\n continue;\n status.set(name, 'visiting');\n const path = [{ name, next: 0 }];\n while (path.length) {\n const head = path[path.length - 1];\n const rests = above.get(head.name);\n if (head.next === rests.length) {\n status.set(head.name, 'done');\n path.pop();\n continue;\n }\n const ancestor = rests[head.next++];\n const seen = status.get(ancestor);\n if (seen === 'visiting')\n throw new UnitError('rest-cycle', `obligations: REFUSE·rest ${own} reaches a cycle at ${ancestor}: an order of rest with a cycle has no fold to reach`, { at: own });\n if (seen === undefined) {\n status.set(ancestor, 'visiting');\n path.push({ name: ancestor, next: 0 });\n }\n }\n }\n return out;\n}\nexport function parts(L, c, world = new Map()) {\n const rest = restOf(c, world);\n const above = rest.flatMap((name) => live(world.get(name)?.marks ?? []).filter((one) => one.reach === 'travels' && one.widens === undefined));\n const marks = [...live(c.marks ?? []), ...above].sort((a, b) => (a.at ?? 0) - (b.at ?? 0));\n let required = L.top;\n let signed = L.top;\n for (const one of marks) {\n if (one.pole === 'floor')\n required = L.meet(required, one.span);\n else\n signed = one.widens === undefined ? L.meet(signed, one.span) : L.join(signed, one.span);\n }\n const origins = live(c.seen);\n const held = origins.reduce((acc, claim) => L.meet(acc, claim.span), L.top);\n return { floor: L.meet(required, held), ceiling: L.meet(signed, held), origins, rest, required, signed };\n}\nexport function state(L, c, world = new Map()) {\n const { floor, ceiling, origins, required, signed } = parts(L, c, world);\n if (!L.inhabited(L.meet(required, signed)))\n return 'CONFLICT';\n if (new Set(origins.map((claim) => claim.origin)).size < 2)\n return 'REQUIRED';\n if (!L.inhabited(origins.reduce((acc, claim) => L.meet(acc, claim.span), L.top)))\n return 'CONFLICT';\n return L.inhabited(L.meet(floor, ceiling)) ? 'FREE' : 'FORBIDDEN';\n}\n"},{"coordinate":"dist/lattice/order.js","digest":"sha256:4752a5da2995163d26712bb96acc9c14d5d65f76366e941ec29c25dd8fdd6741","source":"import { UnitError } from \"./errors.js\";\nfunction build(levels, join, meet) {\n const n = levels.length;\n for (let i = 0; i < n; i++) {\n if (levels.indexOf(levels[i]) !== i) {\n throw new UnitError('DUPLICATE_LEVEL', `the level \\`${levels[i]}\\` is declared twice`, {\n level: levels[i],\n });\n }\n }\n const index = new Map(levels.map((l, i) => [l, i]));\n const leq = (a, b) => join[a][b] === b;\n const total = levels.every((_, i) => levels.every((__, j) => join[i][j] === i || join[i][j] === j));\n let simple = true;\n for (let x = 0; x < n && simple; x++) {\n for (let y = 0; y < n && simple; y++) {\n for (let z = 0; z < n; z++) {\n if (meet[x][join[y][z]] !== join[meet[x][y]][meet[x][z]]) {\n simple = false;\n break;\n }\n }\n }\n }\n const all = [...levels.keys()];\n const bottomIx = all.find((i) => all.every((j) => leq(i, j))) ?? 0;\n const topIx = all.find((i) => all.every((j) => leq(j, i))) ?? n - 1;\n const joinIrr = all.filter((j) => j !== bottomIx &&\n all.filter((x) => x !== j && leq(x, j)).reduce((acc, x) => join[acc][x], bottomIx) !== j);\n const meetIrr = all.filter((m) => m !== topIx &&\n all.filter((x) => x !== m && leq(m, x)).reduce((acc, x) => meet[acc][x], topIx) !== m);\n const seen = new Set();\n const allDebits = [];\n for (const x of [...joinIrr, ...meetIrr]) {\n if (!seen.has(x)) {\n seen.add(x);\n allDebits.push(x);\n }\n }\n return {\n levels,\n isLadder: total,\n isSimple: simple,\n bottomIx,\n topIx,\n bottom: levels[bottomIx],\n top: levels[topIx],\n leq,\n higher: (a, b) => join[a][b],\n lower: (a, b) => meet[a][b],\n rank(level) {\n const r = index.get(level);\n if (r === undefined) {\n throw new UnitError('UNKNOWN_LEVEL', `no level \\`${level}\\` in this scale`, {\n level,\n levels,\n });\n }\n return r;\n },\n stateOf(floor, ceiling) {\n if (!leq(floor, ceiling))\n return 'CONFLICT';\n if (floor !== bottomIx)\n return 'REQUIRED';\n if (ceiling !== topIx)\n return 'FORBIDDEN';\n return 'FREE';\n },\n joins: () => joinIrr.slice(),\n limits: () => meetIrr.slice(),\n debits: () => allDebits.slice(),\n intervalHeight(lo, hi) {\n if (!leq(lo, hi))\n return null;\n const inside = all.filter((x) => leq(lo, x) && leq(x, hi));\n const covers = (x) => inside.filter((y) => y !== x &&\n leq(x, y) &&\n !inside.some((z) => z !== x && z !== y && leq(x, z) && leq(z, y)));\n const long = new Map([[lo, 0]]);\n const short = new Map([[lo, 0]]);\n const walk = [...inside].sort((a, b) => inside.filter((z) => leq(z, a)).length - inside.filter((z) => leq(z, b)).length);\n for (const x of walk) {\n const lx = long.get(x);\n const sx = short.get(x);\n if (lx === undefined || sx === undefined)\n continue;\n for (const y of covers(x)) {\n long.set(y, Math.max(long.get(y) ?? lx + 1, lx + 1));\n short.set(y, Math.min(short.get(y) ?? sx + 1, sx + 1));\n }\n }\n const l = long.get(hi);\n return l !== undefined && l === short.get(hi) ? l : null;\n },\n };\n}\nexport function chain(levels) {\n if (!Array.isArray(levels) || levels.length === 0) {\n throw new UnitError('EMPTY_CHAIN', 'a chain needs at least one level');\n }\n const n = levels.length;\n const grid = (f) => [...Array(n)].map((_, i) => [...Array(n)].map((__, j) => f(i, j)));\n return build(levels, grid(Math.max), grid(Math.min));\n}\nexport function height(c, level) {\n const r = level;\n const depth = (x) => {\n let d = 0;\n for (let y = 0; y < c.levels.length; y++)\n if (y !== x && c.leq(y, x))\n d++;\n return d;\n };\n let h = 0;\n for (let x = 0; x < c.levels.length; x++)\n if (x !== r && c.leq(x, r))\n h = Math.max(h, depth(x) + 1);\n return h;\n}\nexport function isDistributive(c) {\n const n = c.levels.length;\n for (let x = 0; x < n; x++)\n for (let y = 0; y < n; y++)\n for (let z = 0; z < n; z++) {\n const left = c.higher(x, c.lower(y, z));\n const right = c.lower(c.higher(x, y), c.higher(x, z));\n if (left !== right)\n return false;\n }\n return true;\n}\nexport function order(levels, leq) {\n if (!Array.isArray(levels) || levels.length === 0) {\n throw new UnitError('EMPTY_CHAIN', 'an order needs at least one level');\n }\n const n = levels.length;\n const bound = (a, b, up) => {\n const bs = [...Array(n).keys()].filter((x) => up ? leq[a][x] && leq[b][x] : leq[x][a] && leq[x][b]);\n const least = bs.filter((x) => bs.every((y) => (up ? leq[x][y] : leq[y][x])));\n if (least.length !== 1) {\n throw new UnitError('MALFORMED', `\\`${levels[a]}\\` and \\`${levels[b]}\\` have ${least.length} ` +\n `${up ? 'lowest common' : 'highest common'} bounds, so this is not a usable scale`, { levels: [levels[a], levels[b]] });\n }\n return least[0];\n };\n const grid = (up) => [...Array(n)].map((_, i) => [...Array(n)].map((__, j) => bound(i, j, up)));\n return build(levels, grid(true), grid(false));\n}\n"},{"coordinate":"dist/lattice/price/premium.js","digest":"sha256:3c8e7a61164f5dd2416112baa791ed401922afeafe06239c597113bb2b5f78ff","source":"const SLACK = 1e-12;\nexport function c_n(n) {\n return Math.log2(n) - 2 + 2 / n;\n}\nexport function costOfState(c, value, u, w, s) {\n return {\n shortfall: value(u) - value(c.lower(u, s)),\n overshoot: value(s) - value(c.lower(s, w)),\n };\n}\nconst costAt = (c, value, u, w, s) => {\n const { shortfall, overshoot } = costOfState(c, value, u, w, s);\n return shortfall + overshoot;\n};\nfunction cheapest(c, value, u, w, visit) {\n let cost;\n let at = c.bottomIx;\n visit((s) => {\n const cs = costAt(c, value, u, w, s);\n if (cost === undefined || cs < cost) {\n cost = cs;\n at = s;\n }\n });\n return { cost: cost ?? costAt(c, value, u, w, at), at };\n}\nfunction eachPair(c, u, w, fn) {\n for (let p = 0; p < c.levels.length; p++) {\n if (!c.leq(p, u))\n continue;\n for (let q = 0; q < c.levels.length; q++) {\n if (!c.leq(q, w))\n continue;\n fn(p, q);\n }\n }\n}\nexport const best = (c, value, u, w) => cheapest(c, value, u, w, (take) => {\n for (let s = 0; s < c.levels.length; s++)\n take(s);\n});\nexport function gap(c, value, u, w) {\n const m = c.lower(u, w);\n let mx = value(m);\n eachPair(c, u, w, (p, q) => {\n const v = value(p) + value(q) - value(c.higher(p, q));\n if (v > mx)\n mx = v;\n });\n return mx - value(m);\n}\nexport function premium(c, value, u, w) {\n return value(u) - value(c.lower(u, w)) - best(c, value, u, w).cost;\n}\nexport function isSupermodular(c, value) {\n for (let x = 0; x < c.levels.length; x++) {\n for (let y = 0; y < c.levels.length; y++) {\n const ri = value(x) + value(y) - value(c.higher(x, y)) - value(c.lower(x, y));\n if (ri > SLACK)\n return false;\n }\n }\n return true;\n}\nfunction gapVanishes(c, value) {\n for (let a = 0; a < c.levels.length; a++) {\n for (let b = 0; b < c.levels.length; b++) {\n if (c.leq(a, b) && value(a) > value(b) + SLACK)\n return false;\n }\n }\n return isSupermodular(c, value);\n}\nexport function pricesAnything(c, worth) {\n return !gapVanishes(c, worth);\n}\nexport function collapses(c, value, u, w, tol = 1e-9) {\n const ri = value(u) + value(w) - value(c.higher(u, w)) - value(c.lower(u, w));\n return Math.abs(premium(c, value, u, w) - ri) <= tol;\n}\n"},{"coordinate":"dist/lattice/scale-lattice.js","digest":"sha256:2669476b7811dc4db1ffe60131fbf5df568030f37d66cacb7062f7ed87704fa6","source":"import { WideMask } from \"../debit/masks.js\";\nimport { entails, fuse, permitAll, state } from \"../debit/unit.js\";\nexport function fromScale(c) {\n const inhabited = (x) => state(c, x) !== 'CONFLICT';\n return {\n top: permitAll(c, ''),\n bottom: { subject: '', floor: c.levels[c.topIx] ?? '', ceiling: c.levels[c.bottomIx] ?? '' },\n leq: (a, b) => entails(c, a, b),\n meet: (a, b) => fuse(c, [a, b]),\n join: (a, b) => {\n if (!inhabited(a))\n return b;\n if (!inhabited(b))\n return a;\n return {\n subject: a.subject || b.subject,\n floor: c.levels[c.lower(c.rank(a.floor), c.rank(b.floor))] ?? a.floor,\n ceiling: c.levels[c.higher(c.rank(a.ceiling), c.rank(b.ceiling))] ?? a.ceiling,\n };\n },\n show: (x) => `[${x.floor}, ${x.ceiling}]`,\n inhabited,\n };\n}\nexport function subsets(tokens) {\n return {\n bottom: new WideMask(tokens.length),\n top: WideMask.filled(tokens.length),\n leq: (a, b) => a.subsetOf(b),\n meet: (a, b) => a.and(b),\n join: (a, b) => a.or(b),\n show: (x) => x.members(tokens).join(','),\n inhabited: (x) => x.size() > 0,\n };\n}\n"},{"coordinate":"dist/lattice/vacuity.js","digest":"sha256:86a33399266ad3d5274838e9580a467d045e8edba6bded643ffdb580a79ae37d","source":"import { unitStream } from \"../debit/shuffle.js\";\nexport function isMonotone(c, value) {\n for (let a = 0; a < c.levels.length; a++) {\n for (let b = 0; b < c.levels.length; b++) {\n if (c.leq(a, b) && value(a) > value(b) + 1e-12)\n return false;\n }\n }\n return true;\n}\nexport function vacuityOf(predicate, structure, c, test, opts = {}) {\n const samples = opts.samples ?? 2000;\n const spread = opts.spread ?? 20;\n const next = unitStream(1);\n const n = c.levels.length;\n let yes = 0;\n let no = 0;\n let sawYes;\n let sawNo;\n let read = false;\n for (let i = 0; i < samples; i++) {\n const v = [];\n for (let k = 0; k < n; k++)\n v.push(Math.round(next() * spread));\n if (opts.monotone) {\n v.sort((a, b) => a - b);\n if (!isMonotone(c, (x) => v[x]))\n continue;\n }\n const probe = (x) => {\n read = true;\n return v[x];\n };\n if (test(c, probe)) {\n yes += 1;\n if (!sawYes)\n sawYes = [...v];\n }\n else {\n no += 1;\n if (!sawNo)\n sawNo = [...v];\n }\n }\n const both = yes > 0 && no > 0;\n return {\n predicate,\n structure,\n samples: yes + no,\n yes,\n no,\n verdict: both ? 'DISCRIMINATES' : read ? 'CONSTANT' : 'INDEPENDENT',\n ...(both ? { witnesses: { yes: sawYes, no: sawNo } } : {}),\n };\n}\n"},{"coordinate":"dist/replay.js","digest":"sha256:195a93d0e955b30575e5172e4dcb779f8c688997de1a3a3a5c649bcc6a723ab3","source":"import { foldRegion } from \"./field/field.js\";\nexport function replay(landed, where, verdict) {\n return foldRegion(landed, where, verdict);\n}\n"},{"coordinate":"dist/views/field.js","digest":"sha256:691ea483df5d6021feae901607ccd3b67721514c2963ad539466839d6a1db430","source":"export { foldIn, witnessesIn } from \"../debit/debit.js\";\nexport { cancels, disagree, encounter, laminar, latest, meetAt, origins, pairs, potential, turned } from \"../field/encounter.js\";\nexport { contracts, coordinate, covers, exclusive, key, passes, point, region, resolution, within } from \"../field/field.js\";\nexport { join } from \"../field/join.js\";\nexport { meet } from \"../field/meet.js\";\nexport { observe } from \"../field/observe.js\";\nexport { refine } from \"../field/refine.js\";\nexport { require } from \"../field/require.js\";\nexport { bites, restingOn, sign } from \"../field/sign.js\";\nexport { converge, endsBeforeNow, present } from \"../field/present.js\";\nexport { amplitude, coherence, fringes, interfere, phase, seenAs } from \"./field/wave.js\";\nexport { cell, live, mark, parts, restOf, state } from \"../lattice/obligatory.js\";\nexport { fragility } from \"../field/fragility.js\";\nexport { looksLeft, pay, price } from \"../debit/observer.js\";\nexport { budget, decohere, disturbance, distinct, evolve, sameObject } from \"./field/physics.js\";\nexport { choose, play } from \"./field/policy.js\";\nexport { selfFold } from \"./field/self.js\";\n"},{"coordinate":"dist/views/field/physics.js","digest":"sha256:69e500cdd7bb1a3eff095c4e15078db508d214adae84c3b3d751ec60de314ddb","source":"import { meet } from \"../../field/meet.js\";\nimport { coherence } from \"./wave.js\";\nexport function disturbance(lattice, one, claim) {\n const was = meet(lattice, one);\n const now = meet(lattice, { ...one, seen: [...one.seen, claim] });\n const width = (span) => Math.max(0, span.hi - span.lo);\n return width(was) - width(now);\n}\nexport function budget(cells, resolution) {\n if (resolution <= 0)\n throw new Error('obligations: REFUSE·budget a region read at no resolution has no budget to take');\n return Math.ceil((2 * cells) / resolution);\n}\nexport function sameObject(lattice, a, b, width) {\n const bin = (one) => {\n const held = meet(lattice, one);\n return width <= 0 ? held.lo : Math.round(held.lo / width);\n };\n return bin(a) === bin(b);\n}\nexport function distinct(lattice, world, width) {\n const seen = new Set();\n for (const one of world) {\n const held = meet(lattice, one);\n seen.add(width <= 0 ? held.lo : Math.round(held.lo / width));\n }\n return seen.size;\n}\nexport function evolve(world, epochs, budget_, seed) {\n let held = seed;\n const next = () => { held = (held * 1103515245 + 12345) % 2147483648; return held / 2147483648; };\n const out = [];\n let now = world;\n for (let epoch = 1; epoch <= epochs; epoch += 1) {\n for (let k = 0; k < budget_; k += 1) {\n const weight = now.map((one) => 1 + 20 * one.seen.length);\n const total = weight.reduce((sum, w) => sum + w, 0);\n const where = () => {\n let pick = next() * total;\n let at = 0;\n while (pick > weight[at] && at < now.length - 1) {\n pick -= weight[at];\n at += 1;\n }\n return at;\n };\n const i = where();\n let j = where();\n if (j === i)\n j = (j + 1) % now.length;\n const name = `e${epoch}-${k}`;\n now = now.map((one, at) => (at === i || at === j ? { ...one, epoch, seen: [...one.seen, { id: `${name}-${at}`, origin: name, at: epoch, span: { lo: 0, hi: 100 } }] } : one));\n }\n out.push(now);\n }\n return out;\n}\nexport function decohere(claims, environment, period) {\n const about = claims.map((claim, i) => ({ ...claim, epoch: claim.at ?? 0, origin: claim.origin || `o${i}` }));\n const noise = Array.from({ length: environment }, (_, i) => ({\n origin: `n${i}`, span: { lo: 0, hi: 1 }, epoch: i % Math.max(1, period), at: i % Math.max(1, period),\n }));\n return coherence([...about, ...noise].map((claim) => ({ origin: claim.origin, epoch: claim.epoch, span: claim.span })), period);\n}\n"},{"coordinate":"dist/views/field/policy.js","digest":"sha256:b248f374304c22f7f08e9639f32cd5651e4092684a874dac3396b9b19fb7ed10","source":"import { encounter } from \"../../field/encounter.js\";\nimport { meet } from \"../../field/meet.js\";\nimport { coherence } from \"./wave.js\";\nimport { neighbours, reach } from \"../product/reach.js\";\nconst at = (cell) => cell.at.join('/');\nconst said = (lattice, cell) => {\n const held = meet(lattice, cell);\n if (encounter(lattice, cell).origins < 2)\n return 'one';\n return held.lo > held.hi ? 'apart' : 'together';\n};\nconst widthOf = (lattice, cell) => {\n const held = meet(lattice, cell);\n return Math.max(0, held.hi - held.lo);\n};\nexport function choose(lattice, world, weights, held) {\n let best = '';\n let top;\n for (const cell of world) {\n const name = at(cell);\n if (held.has(name))\n continue;\n const said = cell.seen.map((claim, i) => ({ origin: claim.origin, epoch: claim.at ?? i, span: claim.span }));\n const score = weights.reach * reach(world, name)\n + weights.coherence * coherence(said, 8)\n + weights.rank * (neighbours(world).get(name) ?? []).length\n + weights.bits * Math.log2(1 + widthOf(lattice, cell));\n if (top === undefined || score > top) {\n top = score;\n best = name;\n }\n }\n return best;\n}\nexport function play(lattice, world, weights, epochs, seed, spread) {\n let held = seed;\n const next = () => { held = (held * 1103515245 + 12345) % 2147483648; return held / 2147483648; };\n let now = [...world];\n const closed = new Set();\n const forked = new Set();\n let reopened = 0;\n for (let epoch = 1; epoch <= epochs; epoch += 1) {\n const name = choose(lattice, now, weights, new Set());\n if (!name)\n break;\n now = now.map((cell) => {\n if (at(cell) !== name)\n return cell;\n const was = said(lattice, cell);\n const held = meet(lattice, cell);\n const centre = (held.lo + held.hi) / 2 + (next() * 2 - 1) * spread;\n const one = { id: `p${epoch}`, origin: `p${epoch}`, at: epoch, span: { lo: centre - 5, hi: centre + 5 } };\n const after = { ...cell, epoch, seen: [...cell.seen, one] };\n const verdict = said(lattice, after);\n if (verdict === 'together' && was !== 'together')\n closed.add(name);\n if (verdict === 'apart') {\n forked.add(name);\n if (closed.has(name)) {\n reopened += 1;\n closed.delete(name);\n }\n }\n return after;\n });\n }\n const covered = now.filter((cell) => encounter(lattice, cell).origins > 1).length;\n return { closed: closed.size, forks: forked.size, reopened, coverage: Math.round((100 * covered) / now.length) };\n}\n"},{"coordinate":"dist/views/field/self.js","digest":"sha256:d8fe9cf3233c45cb87976097920da194cdfae9cd7da4e75f4bb15de533b258df","source":"import { meet } from \"../../field/meet.js\";\nimport { observe } from \"../../field/observe.js\";\nexport function selfFold(lattice, one, epochs, width, spread, seed) {\n let held = seed;\n const next = () => { held = (held * 1103515245 + 12345) % 2147483648; return held / 2147483648; };\n const out = [];\n let now = one;\n for (let epoch = 1; epoch <= epochs; epoch += 1) {\n const at = meet(lattice, now);\n const centre = (at.lo + at.hi) / 2 + (next() * 2 - 1) * spread;\n now = observe(now, { origin: `self${epoch}`, at: epoch, span: { lo: centre - width / 2, hi: centre + width / 2 } });\n out.push(now);\n }\n return out;\n}\n"},{"coordinate":"dist/views/field/wave.js","digest":"sha256:ab030ffa1cf49b5b26a9e5b62a94d4f553c6313c5e7138f66016d7d12f620c0d","source":"export function amplitude(claim) {\n const size = claim.span.hi - claim.span.lo;\n const width = Number.isFinite(size) ? 1 / (1 + Math.max(size, 0)) : 0;\n return claim.withdraws ? -width : width;\n}\nexport function phase(claim, period) {\n return period <= 0 ? 0 : ((claim.epoch % period) + period) % period;\n}\nexport function coherence(claims, period) {\n if (!claims.length)\n return 0;\n let x = 0;\n let y = 0;\n for (const claim of claims) {\n const turn = (2 * Math.PI * phase(claim, period)) / period;\n x += Math.cos(turn);\n y += Math.sin(turn);\n }\n return Math.sqrt(x * x + y * y) / claims.length;\n}\nexport function interfere(claims, period) {\n let x = 0;\n let y = 0;\n for (const claim of claims) {\n const turn = (2 * Math.PI * phase(claim, period)) / period;\n x += amplitude(claim) * Math.cos(turn);\n y += amplitude(claim) * Math.sin(turn);\n }\n return Math.sqrt(x * x + y * y) ** 2;\n}\nexport function fringes(claims, period, delays) {\n return delays.map((delay) => interfere(claims.map((claim, i) => (i % 2 === 0 ? claim : { ...claim, epoch: claim.epoch + delay })), period));\n}\nexport const seenAs = (cell, period) => cell.seen.map((s) => ({ origin: s.origin, epoch: cell.epoch, span: s.span }));\n"},{"coordinate":"dist/views/product/reach.js","digest":"sha256:81ceeabdccb4451d03f307ca959caa0373512272715dcd46b70444c4ccbc4d61","source":"import { meetAt, origins } from \"../../field/encounter.js\";\nconst at = (cell) => cell.at.join('/');\nconst spoke = (cell, bounds) => [...new Set(cell.seen.map((s) => s.origin))].filter((one) => !bounds.includes(one));\nexport function neighbours(world, bounds = []) {\n const byOrigin = new Map();\n for (const cell of world)\n for (const one of spoke(cell, bounds))\n byOrigin.set(one, [...(byOrigin.get(one) ?? []), at(cell)]);\n const out = new Map();\n for (const held of byOrigin.values()) {\n for (const a of held) {\n const mine = out.get(a) ?? new Set();\n for (const b of held)\n if (b !== a)\n mine.add(b);\n out.set(a, mine);\n }\n }\n return new Map([...out].map(([place, said]) => [place, [...said]]));\n}\nexport function distance(world, from, to, bounds = []) {\n if (from === to)\n return 0;\n const next = neighbours(world, bounds);\n const seen = new Set([from]);\n let edge = [from];\n for (let step = 1; edge.length; step += 1) {\n const further = [];\n for (const one of edge) {\n for (const other of next.get(one) ?? []) {\n if (seen.has(other))\n continue;\n if (other === to)\n return step;\n seen.add(other);\n further.push(other);\n }\n }\n edge = further;\n }\n return world.length;\n}\nexport function horizon(world, from, bounds = []) {\n const next = neighbours(world, bounds);\n const seen = new Set([from]);\n const edge = [from];\n while (edge.length) {\n const one = edge.pop();\n for (const other of next.get(one) ?? [])\n if (!seen.has(other)) {\n seen.add(other);\n edge.push(other);\n }\n }\n return world.map(at).filter((place) => !seen.has(place));\n}\nexport function reach(world, from, bounds = []) {\n return world.length - horizon(world, from, bounds).length - 1;\n}\nexport function tunnel(world, places, bounds = []) {\n const crossed = [];\n for (const a of places)\n for (const b of places)\n if (a < b && distance(world, a, b, bounds) >= world.length)\n crossed.push([a, b]);\n return crossed;\n}\nexport function curvature(world) {\n const counts = world.map((cell) => origins(cell)).filter((n) => n > 0).sort((a, b) => b - a);\n if (!counts.length)\n return 0;\n const top = counts.slice(0, Math.max(1, Math.floor(counts.length / 10)));\n const low = counts.slice(-Math.max(1, Math.floor(counts.length / 10)));\n const mean = (xs) => xs.reduce((s, x) => s + x, 0) / xs.length;\n if (mean(low) === 0)\n throw new Error('obligations: REFUSE·curvature the sparsest tenth of this field holds no origin, so there is no ratio to take');\n return mean(top) / mean(low);\n}\nexport function grow(walls, placed) {\n const edges = [...new Set(walls)].sort((a, b) => a - b);\n const held = [...placed].sort((a, b) => a - b);\n const first = edges[0] ?? 0;\n const last = edges[edges.length - 1] ?? 0;\n return held.map((one) => {\n const lo = Math.max(...edges.filter((w) => w <= one), first);\n const hi = Math.min(...edges.filter((w) => w >= one), last);\n const inside = held.filter((other) => other > lo && other < hi);\n const i = inside.indexOf(one);\n const left = i > 0 ? (inside[i - 1] + one) / 2 : lo;\n const right = i < inside.length - 1 ? (inside[i + 1] + one) / 2 : hi;\n return { at: one, width: right - left };\n });\n}\nexport function entangled(world, bound) {\n return world.filter((cell) => cell.seen.some((s) => s.origin === bound)).map(at);\n}\nexport function resting(world, bound, was, now) {\n const under = (span, cell) => {\n const held = meetAt({ ...cell, seen: cell.seen.map((s) => (s.origin === bound ? { ...s, span } : s)) });\n return held.hi >= held.lo;\n };\n return entangled(world, bound).flatMap((place) => {\n const cell = world.find((one) => at(one) === place);\n return cell !== undefined && under(was, cell) !== under(now, cell) ? [place] : [];\n });\n}\n"}]}],"entries":[{"request":"@lapxo/bound/engine","region":"module/@lapxo/bound/dist/engine/index.js"},{"request":"@lapxo/topos/forms","region":"module/@lapxo/topos/dist/forms/index.js"}],"regions":[{"scope":"module/@lapxo/topos/dist/authority/admit.js","value":"sha256:eed858773ea11feeb518228aa6ba2a433245a3658257d6cc2fae4546faed01f3","restsOn":["module/@lapxo/obligations/dist/field/field.js"]},{"scope":"module/@lapxo/topos/dist/forms/alphabet.js","value":"sha256:5d12162d8f5d58a6d2225780362386f5e8a98c11130257a4f42499fcedc977fe","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js","module/@lapxo/topos/dist/wire/grammar.js"]},{"scope":"module/@lapxo/topos/dist/forms/budget.js","value":"sha256:8ee938a539fdab1d0d490c9713245b6b40a5d601987286e26654ad59661bb8a0","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/configuration.js","value":"sha256:b6693c3a172758c62ef2df67dc0b85ed0931247dfcc4853e30550c5bbfa3216c","restsOn":["module/@lapxo/obligations/dist/lattice/forms.js"]},{"scope":"module/@lapxo/topos/dist/forms/declaration.js","value":"sha256:3756504aa9af42b0bfde86d135c1b2e7872c816fed8aa2d567176a6a748f04e6","restsOn":["module/@lapxo/topos/dist/wire/index.js"]},{"scope":"module/@lapxo/topos/dist/forms/distribution.js","value":"sha256:e3290d3ccbf4a54b5e2dcc44253077c87ee5c752d1278b89edb4c724f468814c","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js","module/@lapxo/topos/dist/wire/grammar.js"]},{"scope":"module/@lapxo/topos/dist/forms/form.js","value":"sha256:3f76cda3af20741c99559449d9c7d8eba32f8e221b8dc7da3f324acad7d924e4","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/wire/claimline.js","module/@lapxo/topos/dist/wire/grammar.js","module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/forms/index.js","value":"sha256:ab5ae549791c03be6e4746f7a7ef1a176e13a57de3aaf6830c3b30fa25f32f04","restsOn":["module/@lapxo/topos/dist/forms/alphabet.js","module/@lapxo/topos/dist/forms/budget.js","module/@lapxo/topos/dist/forms/configuration.js","module/@lapxo/topos/dist/forms/declaration.js","module/@lapxo/topos/dist/forms/distribution.js","module/@lapxo/topos/dist/forms/form.js","module/@lapxo/topos/dist/forms/interval.js","module/@lapxo/topos/dist/forms/ladder.js","module/@lapxo/topos/dist/forms/lattice.js","module/@lapxo/topos/dist/forms/phase.js","module/@lapxo/topos/dist/forms/rank.js","module/@lapxo/topos/dist/forms/stretch.js"]},{"scope":"module/@lapxo/topos/dist/forms/interval.js","value":"sha256:16a7ba6019199fcebbc0555ae8ac9af83fcbba7be2bac167d488d8dc6bcf7364","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/ladder.js","value":"sha256:b31ddfd1baa9496e777a46eee181f78af46d90e8bf0875535bab08cf8188571d","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/lattice.js","value":"sha256:3542e51164f5452997728dbdcee4f6c5a9ff36f211679e595e9f4ae99dce2f9f","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/phase.js","value":"sha256:5a0a880fe3d03543d6042e920548c276b3731216810e8791b0d2188fa80dd1ee","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/rank.js","value":"sha256:9f851ab5018d6b01b16b07ea9eb81f1ef197cc7c7dc3336d512c5b5154877c0b","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/forms/stretch.js","value":"sha256:1ecbd9c9d26c5203b560826702bfc93a6d9f534f38814b357681169a07373413","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/forms/form.js"]},{"scope":"module/@lapxo/topos/dist/wire/act-result.js","value":"sha256:ad887d08993ca71741cb3333ca67251ef64c24da5248a0abdad92ccc448108da","restsOn":["module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/sig.js"]},{"scope":"module/@lapxo/topos/dist/wire/claimline.js","value":"sha256:aadc3029a57954d3cce9ebc01d13e29887a7bc77fb4c55ad3644406ec520028b","restsOn":["module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/authority/admit.js","module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/object-record.js","module/@lapxo/topos/dist/wire/outcome.js","module/@lapxo/topos/dist/wire/sig.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/classes.js","value":"sha256:759f669029f1da8c35dc71baa6aa08282cdd70731f5b15b30e5eb31234a0ec0a","restsOn":[]},{"scope":"module/@lapxo/topos/dist/wire/evidence.js","value":"sha256:fcf6c66b4625b78a3225a97ed06cee84f152f2c2886b113b5a09ee9f3e21a80e","restsOn":["module/@lapxo/obligations/dist/lattice/index.js"]},{"scope":"module/@lapxo/topos/dist/wire/grammar.js","value":"sha256:a78171bb011eeb35b22ef9e463e010ede76fa1a716088657d50117d1ebb62e53","restsOn":["module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/index.js","value":"sha256:db223756dbd45beea450fc175b2c7fc44a41625a4931df4bec18229c436b086e","restsOn":["module/@lapxo/topos/dist/wire/act-result.js","module/@lapxo/topos/dist/wire/claimline.js","module/@lapxo/topos/dist/wire/classes.js","module/@lapxo/topos/dist/wire/evidence.js","module/@lapxo/topos/dist/wire/grammar.js","module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/measures.js","module/@lapxo/topos/dist/wire/names.js","module/@lapxo/topos/dist/wire/object-context.js","module/@lapxo/topos/dist/wire/object-history.js","module/@lapxo/topos/dist/wire/object-record.js","module/@lapxo/topos/dist/wire/place-act-context.js","module/@lapxo/topos/dist/wire/publication.js","module/@lapxo/topos/dist/wire/reader-lifetime.js","module/@lapxo/topos/dist/wire/record-kind.js","module/@lapxo/topos/dist/wire/sig.js","module/@lapxo/topos/dist/wire/signing-port.js","module/@lapxo/topos/dist/wire/transport-port.js","module/@lapxo/topos/dist/wire/types.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/line.js","value":"sha256:d683feba756bcd4153ed1860f5094972687db795f394ef3ec17924bc367c96ac","restsOn":["module/@lapxo/topos/dist/wire/outcome.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/measures.js","value":"sha256:0ba6f4262398419773c4b0cd0c3697d4ae9c6500e98948efc65d21259135ab75","restsOn":["module/@lapxo/obligations/dist/lattice/index.js"]},{"scope":"module/@lapxo/topos/dist/wire/names.js","value":"sha256:e9b619e2bc56a2fdd59e55b790456b182716b2e1a5cc5ee70eea0c56ed521d3a","restsOn":[]},{"scope":"module/@lapxo/topos/dist/wire/object-context.js","value":"sha256:5ddad691abfde0191db168419fcb1bd672bf764fefc1542cae56fd3337ac4af3","restsOn":["module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/object-record.js","module/@lapxo/topos/dist/wire/outcome.js"]},{"scope":"module/@lapxo/topos/dist/wire/object-history.js","value":"sha256:591d909e4af84980d1a3fb3e61a5ad22cd56bf3040bf14becec393f6789caf37","restsOn":["module/@lapxo/topos/dist/wire/claimline.js","module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/outcome.js","module/@lapxo/topos/dist/wire/record-kind.js"]},{"scope":"module/@lapxo/topos/dist/wire/object-record.js","value":"sha256:b2995fe366b23f7ab34fc46d2481db901f552a31a8cff0a5a02ead74e36ddda7","restsOn":["module/@lapxo/topos/dist/wire/grammar.js","module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/outcome.js"]},{"scope":"module/@lapxo/topos/dist/wire/outcome.js","value":"sha256:deab53c58c078862088ac4bf424fb13ed68793913e399815871031e3a7e41a9a","restsOn":[]},{"scope":"module/@lapxo/topos/dist/wire/place-act-context.js","value":"sha256:4c20ef9134263ed4d28adcb7c4ebfe8444d7d923e3355cf22adafc7a4332a133","restsOn":["module/@lapxo/topos/dist/wire/claimline.js","module/@lapxo/topos/dist/wire/line.js"]},{"scope":"module/@lapxo/topos/dist/wire/publication.js","value":"sha256:15e96b443de431c47937f32d550b9cc8fb04feccb08ac3558ef26c55c3d8edfd","restsOn":["module/@lapxo/topos/dist/wire/claimline.js","module/@lapxo/topos/dist/wire/line.js"]},{"scope":"module/@lapxo/topos/dist/wire/reader-lifetime.js","value":"sha256:ac7cfa4009fb6e1aa0e5cd88190332c6529c0c456c2439186cf56c43411ce309","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/record-kind.js","value":"sha256:844a163ddf99a694a1dc54cd8ecf118c91d88b92ff8f93424092b53c4ffb2cd1","restsOn":["module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/outcome.js"]},{"scope":"module/@lapxo/topos/dist/wire/sig.js","value":"sha256:103d41dd0dc8fc9386fac861b6f0392b05183945b4a9c6e9f46dffb976c20d9c","restsOn":[]},{"scope":"module/@lapxo/topos/dist/wire/signing-port.js","value":"sha256:b5787a9ddd779bc0ad7f167057211116ea488e4e051956f74ed2c0e782d446b7","restsOn":["module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/sig.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/transport-port.js","value":"sha256:116b1d2941add8cf2b41db06ef8c28f846a05b20c66b11f6d29f3bf0ce44afbf","restsOn":["module/@lapxo/obligations/dist/lattice/index.js","module/@lapxo/topos/dist/wire/values.js"]},{"scope":"module/@lapxo/topos/dist/wire/types.js","value":"sha256:ed15e5d164e28439f811665306ced6e06d1ea030a3779bf387350b1cc131211f","restsOn":["module/@lapxo/topos/dist/wire/line.js","module/@lapxo/topos/dist/wire/outcome.js"]},{"scope":"module/@lapxo/topos/dist/wire/values.js","value":"sha256:5b883395c0dc4ecde724a91d6a263c68d180a8e53fac6319daf51087af214d62","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/debit.js","value":"sha256:4e9c79bfb91f542dcb1609846da3d32058b87a4c45cd3eafa13821d567f8feb9","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/graph.js","value":"sha256:5be27ebec40dcb3ffdc34775622a1c07367daa2ad2de93b3ca0edecf4b823bea","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/ideal.js","value":"sha256:4c55b1eaad5301c264611e322aee48734c2dd95a7f54493ca1211caf6a4988fd","restsOn":["module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/debit/masks.js","value":"sha256:4f175c64ecdd57f4e0b0746b58940390c6777b7cc8944b27f0badb7ba16bf37f","restsOn":["module/@lapxo/obligations/dist/debit/packed.js","module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/debit/observer.js","value":"sha256:a2ff9de359770cc855074c673c008c4c4168d371983fd88f14f7c90290d39e7b","restsOn":["module/@lapxo/obligations/dist/field/sign.js","module/@lapxo/obligations/dist/lattice/errors.js","module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/debit/packed.js","value":"sha256:292c09c79fe8870f6fd45558a949ab6e1ca9081d97cef9008dff79295e7a53fe","restsOn":["module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/debit/provenance.js","value":"sha256:75d20ac3801c01d2526550a2ec20201ec750290491aa7e8325ecef3fb6d6bb43","restsOn":["module/@lapxo/obligations/dist/debit/unit.js","module/@lapxo/obligations/dist/lattice/order.js"]},{"scope":"module/@lapxo/obligations/dist/debit/register.js","value":"sha256:fa008ab4534bf27169dd85e9e873d4631d461fb0bcf7d5280dbdc25af2ddd4bd","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/shuffle.js","value":"sha256:8dfd76ebab3d7bedec1e686cb371cfc96b4195c04e7f689df21cad5bd3d5726c","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/standing.js","value":"sha256:261a3ab5322cc48120e42ce468249f83ad88be28dfbb892cfee403e6833dd8d1","restsOn":["module/@lapxo/obligations/dist/debit/unit.js"]},{"scope":"module/@lapxo/obligations/dist/debit/unit-span.js","value":"sha256:f882bf1b9c084707e8490e47324fa68ad48f662cb6ee94be5075e48ecb2eb514","restsOn":["module/@lapxo/obligations/dist/debit/ideal.js"]},{"scope":"module/@lapxo/obligations/dist/debit/unit.js","value":"sha256:a26c30d5456d99667ab44ff56663fff0ced252de60b860acefb820c32a0f5f78","restsOn":["module/@lapxo/obligations/dist/debit/unit-span.js","module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/debit/vector-move.js","value":"sha256:0573c65d6a55bc4c20cd0e2e537e9ae6d275825b0d6e09bf20828c193b0d0a87","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/debit/vector.js","value":"sha256:250eda384b40b23c5dbe20399e1a53a2e3d314847ac1b91c7172028cb6b91fb3","restsOn":["module/@lapxo/obligations/dist/debit/masks.js","module/@lapxo/obligations/dist/debit/vector-move.js"]},{"scope":"module/@lapxo/obligations/dist/field/encounter.js","value":"sha256:84a46a48496abb0fcad4d37f7c891e9c7e4a7ea080035f05473d7e052e51bf22","restsOn":["module/@lapxo/obligations/dist/debit/debit.js","module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/field/meet.js","module/@lapxo/obligations/dist/lattice/forms.js","module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/field.js","value":"sha256:820abaed1d422fdb89c759ca31f3732b6bea6ff7bd1a5b20f2114c1626979880","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/field/fragility.js","value":"sha256:6c533de862591dfb397d4c93a0bc0660a00065343e6876691816c3e23724cb2e","restsOn":["module/@lapxo/obligations/dist/lattice/lattice.js","module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/frontier.js","value":"sha256:11931187be2c7e1afdb139c0e80582d8f2c1beefc30294c671f4d19d61636aba","restsOn":["module/@lapxo/obligations/dist/field/encounter.js","module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/lattice/price/premium.js"]},{"scope":"module/@lapxo/obligations/dist/field/join.js","value":"sha256:c574e7f455e18284a8f9c120a78e30c3ad87e666dc85c4c9201f1b1d3abc5f71","restsOn":["module/@lapxo/obligations/dist/lattice/errors.js","module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/meet.js","value":"sha256:9b52c83f47dbf56e144aba56cc077ac7eb0ef57579aea5c72c13324d4f9dd39c","restsOn":["module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/motion.js","value":"sha256:8ae192e43a7ae7c0b406280984063a8094a67a8a0d4e0d9fa943a21c2c7571b7","restsOn":["module/@lapxo/obligations/dist/debit/unit-span.js","module/@lapxo/obligations/dist/debit/unit.js","module/@lapxo/obligations/dist/debit/vector.js","module/@lapxo/obligations/dist/lattice/order.js","module/@lapxo/obligations/dist/lattice/price/premium.js"]},{"scope":"module/@lapxo/obligations/dist/field/observe.js","value":"sha256:e9255aea5a52edaa841ca520804870f714817fb64b764c3d66921055c6165f3f","restsOn":["module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/field/present.js","value":"sha256:1d730a7a65ffd97f3fce761ddee21b99947bfc60ca190b4107c90562fde26692","restsOn":["module/@lapxo/obligations/dist/field/encounter.js"]},{"scope":"module/@lapxo/obligations/dist/field/refine.js","value":"sha256:1653d77d1e954d29eb5e6968ff8fb9992d05a2f0990ee48d634c931bf24c1201","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/field/require.js","value":"sha256:895a5491ca1c60cb0cc7db2325df7c9b02e69ce25df7dc378371fc38df146b9c","restsOn":["module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/sign.js","value":"sha256:0286a81e542ce89696d8593dedec9b7930bb67b4bf55b959979638f1eb98f8a9","restsOn":["module/@lapxo/obligations/dist/lattice/obligatory.js"]},{"scope":"module/@lapxo/obligations/dist/field/signatures.js","value":"sha256:4f7b0afb3a20e1e23a64eaa5ba14d3a30c091f7ba435b75d862330067d117e2e","restsOn":["module/@lapxo/obligations/dist/lattice/lattice.js"]},{"scope":"module/@lapxo/obligations/dist/field/yield.js","value":"sha256:89aa3852828ff5ddeeb280532220f63ce8af5c8b66d722833a30282062c3a834","restsOn":["module/@lapxo/obligations/dist/debit/ideal.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/axioms.js","value":"sha256:b2c0d26adcc3374a6d1864f60aeee57d2b0660ebe2ca08cb35602af077f3f722","restsOn":["module/@lapxo/obligations/dist/debit/ideal.js","module/@lapxo/obligations/dist/lattice/lattice.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/declaration.js","value":"sha256:c5c4459ad4f5cffe970f87129bd5ddedeb9e35f1163204630788a574a5fdbd78","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/lattice/errors.js","value":"sha256:0cc476498db21b2aab91e90cc0172bb34373cbe2876a21a21efdc8ba088112b0","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/lattice/forms.js","value":"sha256:9061bbb17d68f5d04e469ca83eebf4aa9db184d627b4228bee504f7f0be3dc42","restsOn":["module/@lapxo/obligations/dist/debit/masks.js","module/@lapxo/obligations/dist/lattice/order.js","module/@lapxo/obligations/dist/lattice/scale-lattice.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/index.js","value":"sha256:597e3c37c0d370687d1ed0674ae0737c8ec9efac5ca270c1abdb84413dd147f5","restsOn":["module/@lapxo/obligations/dist/debit/debit.js","module/@lapxo/obligations/dist/debit/graph.js","module/@lapxo/obligations/dist/debit/ideal.js","module/@lapxo/obligations/dist/debit/masks.js","module/@lapxo/obligations/dist/debit/packed.js","module/@lapxo/obligations/dist/debit/provenance.js","module/@lapxo/obligations/dist/debit/register.js","module/@lapxo/obligations/dist/debit/shuffle.js","module/@lapxo/obligations/dist/debit/standing.js","module/@lapxo/obligations/dist/debit/unit.js","module/@lapxo/obligations/dist/debit/vector.js","module/@lapxo/obligations/dist/field/encounter.js","module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/field/frontier.js","module/@lapxo/obligations/dist/field/motion.js","module/@lapxo/obligations/dist/field/present.js","module/@lapxo/obligations/dist/field/signatures.js","module/@lapxo/obligations/dist/field/yield.js","module/@lapxo/obligations/dist/lattice/axioms.js","module/@lapxo/obligations/dist/lattice/declaration.js","module/@lapxo/obligations/dist/lattice/errors.js","module/@lapxo/obligations/dist/lattice/forms.js","module/@lapxo/obligations/dist/lattice/lattice.js","module/@lapxo/obligations/dist/lattice/order.js","module/@lapxo/obligations/dist/lattice/scale-lattice.js","module/@lapxo/obligations/dist/lattice/vacuity.js","module/@lapxo/obligations/dist/replay.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/lattice.js","value":"sha256:0922b8ee14e1fd0e6c56cf026b377e67e070e1ab5ede71b64aebe17ecc4303a7","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/lattice/obligatory.js","value":"sha256:767c01b525fe5e97997acebdd2aac89c0d6e579fd9d6955c339292d17d34d048","restsOn":["module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/order.js","value":"sha256:4752a5da2995163d26712bb96acc9c14d5d65f76366e941ec29c25dd8fdd6741","restsOn":["module/@lapxo/obligations/dist/lattice/errors.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/price/premium.js","value":"sha256:3c8e7a61164f5dd2416112baa791ed401922afeafe06239c597113bb2b5f78ff","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/lattice/scale-lattice.js","value":"sha256:2669476b7811dc4db1ffe60131fbf5df568030f37d66cacb7062f7ed87704fa6","restsOn":["module/@lapxo/obligations/dist/debit/masks.js","module/@lapxo/obligations/dist/debit/unit.js"]},{"scope":"module/@lapxo/obligations/dist/lattice/vacuity.js","value":"sha256:86a33399266ad3d5274838e9580a467d045e8edba6bded643ffdb580a79ae37d","restsOn":["module/@lapxo/obligations/dist/debit/shuffle.js"]},{"scope":"module/@lapxo/obligations/dist/replay.js","value":"sha256:195a93d0e955b30575e5172e4dcb779f8c688997de1a3a3a5c649bcc6a723ab3","restsOn":["module/@lapxo/obligations/dist/field/field.js"]},{"scope":"module/@lapxo/obligations/dist/views/field.js","value":"sha256:691ea483df5d6021feae901607ccd3b67721514c2963ad539466839d6a1db430","restsOn":["module/@lapxo/obligations/dist/debit/debit.js","module/@lapxo/obligations/dist/debit/observer.js","module/@lapxo/obligations/dist/field/encounter.js","module/@lapxo/obligations/dist/field/field.js","module/@lapxo/obligations/dist/field/fragility.js","module/@lapxo/obligations/dist/field/join.js","module/@lapxo/obligations/dist/field/meet.js","module/@lapxo/obligations/dist/field/observe.js","module/@lapxo/obligations/dist/field/present.js","module/@lapxo/obligations/dist/field/refine.js","module/@lapxo/obligations/dist/field/require.js","module/@lapxo/obligations/dist/field/sign.js","module/@lapxo/obligations/dist/lattice/obligatory.js","module/@lapxo/obligations/dist/views/field/physics.js","module/@lapxo/obligations/dist/views/field/policy.js","module/@lapxo/obligations/dist/views/field/self.js","module/@lapxo/obligations/dist/views/field/wave.js"]},{"scope":"module/@lapxo/obligations/dist/views/field/physics.js","value":"sha256:69e500cdd7bb1a3eff095c4e15078db508d214adae84c3b3d751ec60de314ddb","restsOn":["module/@lapxo/obligations/dist/field/meet.js","module/@lapxo/obligations/dist/views/field/wave.js"]},{"scope":"module/@lapxo/obligations/dist/views/field/policy.js","value":"sha256:b248f374304c22f7f08e9639f32cd5651e4092684a874dac3396b9b19fb7ed10","restsOn":["module/@lapxo/obligations/dist/field/encounter.js","module/@lapxo/obligations/dist/field/meet.js","module/@lapxo/obligations/dist/views/field/wave.js","module/@lapxo/obligations/dist/views/product/reach.js"]},{"scope":"module/@lapxo/obligations/dist/views/field/self.js","value":"sha256:d8fe9cf3233c45cb87976097920da194cdfae9cd7da4e75f4bb15de533b258df","restsOn":["module/@lapxo/obligations/dist/field/meet.js","module/@lapxo/obligations/dist/field/observe.js"]},{"scope":"module/@lapxo/obligations/dist/views/field/wave.js","value":"sha256:ab030ffa1cf49b5b26a9e5b62a94d4f553c6313c5e7138f66016d7d12f620c0d","restsOn":[]},{"scope":"module/@lapxo/obligations/dist/views/product/reach.js","value":"sha256:81ceeabdccb4451d03f307ca959caa0373512272715dcd46b70444c4ccbc4d61","restsOn":["module/@lapxo/obligations/dist/field/encounter.js"]},{"scope":"module/@lapxo/bound/dist/engine/encoding.js","value":"sha256:cbce4fc176442aaeba9e22ff64694a79b200cae39231328b90b980de8baa84aa","restsOn":[]},{"scope":"module/@lapxo/bound/dist/engine/index.js","value":"sha256:e9012fd46c05050ed611878d1ea5eb108097430a741e161d58cf1dc72238db60","restsOn":["module/@lapxo/bound/dist/engine/object.js","module/@lapxo/bound/dist/engine/ports.js"]},{"scope":"module/@lapxo/bound/dist/engine/object.js","value":"sha256:1d8e2a37d187b4370ad2fb86383727dbc17a09351ab77799047213ce15f33dfc","restsOn":["module/@lapxo/obligations/dist/views/field.js","module/@lapxo/topos/dist/wire/index.js"]},{"scope":"module/@lapxo/bound/dist/engine/ports.js","value":"sha256:3f7162e409170fbda9be799a9058667d998b1308be9a46ca79c1a584693bb6a6","restsOn":["module/@lapxo/bound/dist/engine/encoding.js","module/@lapxo/bound/dist/host/refusals.js","module/@lapxo/topos/dist/wire/index.js"]},{"scope":"module/@lapxo/bound/dist/host/refusals.js","value":"sha256:c6254ec234fb4d04eeca0f126a2d5df728a8eb2f61c60736d1f81438311b0eea","restsOn":["module/@lapxo/topos/dist/wire/index.js"]}],"params":{"lo":0,"hi":24},"records":[{"record":"cell","fields":{"type":"cell","scope":"reservoir-level","id":"definition","form":"interval","measure":"litres","params":"{\"lo\":0,\"hi\":24}","topos":"sha256:0000000000000000000000000000000000000000000000000000000000000000","restsOn":"none","by":"fixture","epoch":"1"}},{"record":"mark","fields":{"type":"mark","scope":"reservoir-level","id":"limit","sign":"+1","pole":"ceiling","reach":"travels","value":"2..8","by":"fixture","epoch":"2"}},{"record":"claim","fields":{"type":"claim","scope":"reservoir-level","id":"observation","sign":"+1","origin":"reservoir-level-origin","value":"3..6","by":"fixture","epoch":"3"}}],"publicProjection":{"profile":"bound-public-standing@1","producer":"fold --as standing","producerEntry":"sha256:383a5e2737036a2f1d9a0f05db05209e73d7152eb740e43b9b8d95bb3acdcef6","digest":"sha256:c4b7021a53e2b5e37ecd53e6cb3aa6ad195e12a3208b41c02891db8a93f98148","lines":"bound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=public-key role=writes scope=keys/owner sig=\"ed25519:era1:lFqc/S1nbK7W4XgDgm3YuTKlvPS/QillVu9I1Jm8UDd50xJWtp60davJS5Plj5RLSsL6JGJmg2COrk2RkcnaBA==\" value=\"MCowBQYDK2VwAyEAIYI0be8OWhf3HcVceKpibjgZ+hbYJKYO5ayX8Kk16LE=\"\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=signer role=writes scope=keys/owner sig=\"ed25519:era1:tv/fgdEthcRAVawtsyU+qoTIPCBvHDev9u3wnbDGoXrPD+6yepssBdY05LRPnl1cYXW3w6q/+r25qRy/QhUAAw==\" value=file\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=class role=writes scope=keys/owner sig=\"ed25519:era1:aq++ZVo0UciGBKqRYczNyYhouUMauvOD/fWzD9bkUOB7zeVtR4EZvN+K3UM46gg7H2GHer9SFH8C8CQoDGdgCA==\" value=authorize\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=coverage role=writes scope=keys/owner sig=\"ed25519:era1:JEczuCmZ0+l5/s1CyiSXx+D92/FcyPDpgbas0chqUeSMPf1sZHdvPbJc7LghVrR8pKNtnTLRlAAOhPRe0/1XBg==\" value=*\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=class role=writes scope=keys/fold sig=\"ed25519:era1:hos/bok1Rj+jnm73aiO1Fae8NJTXVLzPCGHtMyF/LhbmQNxxAHOpjrd9xIhbhjfTjmldRs0skja0RnE71YSoAQ==\" value=fold\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=class role=writes scope=keys/reader sig=\"ed25519:era1:pqtr2LavNb0s6Is9CsaSaY1fRUmJE3PE9fgxJIUXqnyRZefmum9ZDd0q1e+hr9cBBjTPWjHizTeurmq1ADqDDQ==\" value=read\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=interval measure=bytes role=writes scope=signer/response-bytes sig=\"ed25519:era1:l37Ck52u7mvhsC7fBq8Z2cGagDXpAMu0CCd6SkKmzPim3o6plJaA+GkWMZ6LO+JSsBsiw5Z9C1SWT13F5R/xBg==\" value=65536..65536\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=interval measure=milliseconds role=writes scope=signer/timeout sig=\"ed25519:era1:7iQDNAiyg93yWguZIMnN4IYowvHCdXUAM/RVN6rZSgn+bI2tMdWpeaItAYW8TAJ2nEooB1THiM/YyUxDIGicBA==\" value=5000..5000\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/at-classes sig=\"ed25519:era1:EE+SRw8DroFMnuG4arCBX9hX45fVBEi0wnAbwVR+Yt6NWK3oLBpjCknIqzOIX5EBJtWCU73HNbeTfXy7VupoCg==\" value=origin|place|receipt|witness|policy\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/digest-algorithms sig=\"ed25519:era1:dDPzTUtH4x5RVRyQfPl0On8R1pG/APcwJn7NZfHJ9jUGaD6ZwIkAcp5LxsFnjxHzctfXSmSuix5lT9vDjqixBQ==\" value=sha256\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/era sig=\"ed25519:era1:6fVWFQ9BHfsY0Wkxp2bQiAgI3QT465OBM9yFodh7QL4kICqJZX4gu7H+GjtIPu5qTaWGlkLTMJNSSV6v1B2FAQ==\" value=era1\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/families sig=\"ed25519:era1:p6q9sqHa6GL3ggtvnLVxEG3WrI/LwosMrlehURv6NlA5g2tL08G8i4ljFh6XQKm1Mcd8x2UmH+tfqx665W5sBA==\" value=module|profile|engine-inventory|sample|keys|signer|wire|tree|write|leaf|reader|read|fold|receipts|rendered|resolved|beat|view|region|vector|cost|source|class|pipeline|host|closure|uses|dep|sources|library|artifact\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/fields sig=\"ed25519:era1:vmyeOhEPqC50cQj31y06npAd9CqRSYAMMQPbTVi8MAeF9gu1NavbTxO+nwWMwDwEb4nfsG0OPuvWRj01Q6ryDA==\" value=scope|role|form|measure|value|by|at|needs|sig|epoch|shape|restsOn|condition|about|kind|view\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/forms sig=\"ed25519:era1:nM5RYk4sHrlNvrvuWrV1UyWqcQxy+GYSrpCbBN+83oVYV+Xnm8tVL7LpJQTAAB1np50ruNnXq08ZTYDPbpwBBw==\" value=alphabet|interval\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/receipt-fields sig=\"ed25519:era1:cvDXDV9WjWmY7TxMPRBU4Jct3M/HgxzRXnejGJvWBR+eixbulvSUTVIH5c13K6/csW5LkBE3EdAMAC3zIKHiCg==\" value=scope|role|form|measure|value|by|at\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/region-coordinate sig=\"ed25519:era1:WNAqxgScVZMIiOL1pqz77yszMXY7igVhMxMDDjI2yE5AcKGikv/42p/BMdgj9wsNnp8OEXnu5C/prdovCrGvCg==\" value=coordinates\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/region-measures sig=\"ed25519:era1:Zw7ss7ovzLqIRkl6LqOpdN1uK1miULf9zu9p9jHIpeAbN9dZ949EWZcv/Xa6cZOzJWVSAMmJSCnXJVryJPbtDg==\" value=coordinates\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/required sig=\"ed25519:era1:fmlwgpzUK0NCojLlyFjKYePssi4ReeJUHG/+onTgge40jlVzTcKKSr+3K7rultXH3vgvgKgPk8A5kAMy7Z49Bg==\" value=scope|role|form|measure|value|by|at\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/roles sig=\"ed25519:era1:wnQmu+CRHNZsIRTa6AllznB54EtPxdCjiGYH4iPwxIuO0NMZsPtYt8f/Ica5JySwhKfiooVS9mxhuWUGpFQNBg==\" value=reads|writes|demands\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/shapes sig=\"ed25519:era1:PPF5rPPLO0UVy4vFUulaiYBddXMVl+H5cmAGGn20bu+IfVUOs4KHTEOOkgKJKrD5WJCy7QyK5hxZoOXRePirDQ==\" value=run|input.json\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=writes scope=wire/signature-algorithms sig=\"ed25519:era1:/FKu9hq6KJUTSRqIrbFrPxUMQxcVy94ajVpsOF7KmVXm6f66BMKG0dyrsOzM6CJjMNm7UQDkh+ALP30nr29iBQ==\" value=ed25519:era1\nbound-lock/1 at=policy:bound022/ep-owner-place by=owner epoch=1 form=alphabet measure=id role=demands scope=view/standing sig=\"ed25519:era1:qbaNvv925SyxUX6uefROpt+wmSuB+jYkdB7IQ5bKDE13kXDIzRuVoSIJljjuIdGbGYTfRRr7GgpWMfqJFiRPDw==\" value=standing\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/field.js role=writes scope=module/@lapxo/topos/dist/authority/admit.js sig=\"ed25519:era1:c3lfFmOzwBTwwUbv1eVzIgLQL2CUC/XiMXcO+oeLAZBzfL/e16Zo20BQk2CunLVsgLYVzsi0X6xiJq28GGOgCw==\" value=sha256:eed858773ea11feeb518228aa6ba2a433245a3658257d6cc2fae4546faed01f3\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js|module/@lapxo/topos/dist/wire/grammar.js role=writes scope=module/@lapxo/topos/dist/forms/alphabet.js sig=\"ed25519:era1:pBds3IRm5cM/xs9pzTmpfeI5gbsKcYyyLazUAYzC13kgjfJ9MiUZsEutdnthOjTZ7TeLHzAiEa8QmDFth2ncAQ==\" value=sha256:5d12162d8f5d58a6d2225780362386f5e8a98c11130257a4f42499fcedc977fe\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/budget.js sig=\"ed25519:era1:b4tO27UmS3hMVL2Q7cmq5glWNP+W0M/bLsvGZmhnVXPNN8kISRKaZU43nAoDsZGSRKhj6N7BKmtF8rcZiMp/CA==\" value=sha256:8ee938a539fdab1d0d490c9713245b6b40a5d601987286e26654ad59661bb8a0\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/forms.js role=writes scope=module/@lapxo/topos/dist/forms/configuration.js sig=\"ed25519:era1:gTkVdw78TXb/joGchwECvJAxMr0bm4H9BaU0vOV2o4lZ7WsYAb3+kS5NeSE3PgXk9s2Sk7WyaFC7ON/ZeL9JCw==\" value=sha256:b6693c3a172758c62ef2df67dc0b85ed0931247dfcc4853e30550c5bbfa3216c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/index.js role=writes scope=module/@lapxo/topos/dist/forms/declaration.js sig=\"ed25519:era1:pcX/7eVldrZVxWCpTf9bv3NwDowgcXlYem8Zc51Da3B/xTvjh1wjdbmXMrbiq8jqZsp0sxJU9AbgaqQTNcWQCg==\" value=sha256:3756504aa9af42b0bfde86d135c1b2e7872c816fed8aa2d567176a6a748f04e6\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js|module/@lapxo/topos/dist/wire/grammar.js role=writes scope=module/@lapxo/topos/dist/forms/distribution.js sig=\"ed25519:era1:Gp1BAAlbT6Agxu7gbBV0UnNg8mESdfR6ikOa9PRlzqGoT/vNv+ZfiUgS8vXf9Xr9MbQr1WhABMqJD6WlH6t5CQ==\" value=sha256:e3290d3ccbf4a54b5e2dcc44253077c87ee5c752d1278b89edb4c724f468814c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/wire/claimline.js|module/@lapxo/topos/dist/wire/grammar.js|module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/forms/form.js sig=\"ed25519:era1:QSFbjALHcA2EKKDXXlNuWvHVVOCVkgajnCmk0MRxi2DyV1npp++djCX5cfJ9XuhQd4l7fZin3SdxBXynth69Ag==\" value=sha256:3f76cda3af20741c99559449d9c7d8eba32f8e221b8dc7da3f324acad7d924e4\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/forms/alphabet.js|module/@lapxo/topos/dist/forms/budget.js|module/@lapxo/topos/dist/forms/configuration.js|module/@lapxo/topos/dist/forms/declaration.js|module/@lapxo/topos/dist/forms/distribution.js|module/@lapxo/topos/dist/forms/form.js|module/@lapxo/topos/dist/forms/interval.js|module/@lapxo/topos/dist/forms/ladder.js|module/@lapxo/topos/dist/forms/lattice.js|module/@lapxo/topos/dist/forms/phase.js|module/@lapxo/topos/dist/forms/rank.js|module/@lapxo/topos/dist/forms/stretch.js role=writes scope=module/@lapxo/topos/dist/forms/index.js sig=\"ed25519:era1:Lp9AB9Hry3zcjMTuX52fpulANBMRdskSoo3fwsiX2EnYNSaFtoV8+OZK/7KxnDQ0xlz6anCP94k8wtfWUyilCA==\" value=sha256:ab5ae549791c03be6e4746f7a7ef1a176e13a57de3aaf6830c3b30fa25f32f04\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/interval.js sig=\"ed25519:era1:XCIeqNY8euTvkE6ZKtuSCkE2SrrlWk9r72Md/iI+EpuOxeKFd96DConTVNWcdjAIZoyPYRkEmCAwyhMTNEKoCQ==\" value=sha256:16a7ba6019199fcebbc0555ae8ac9af83fcbba7be2bac167d488d8dc6bcf7364\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/ladder.js sig=\"ed25519:era1:SH6cCdSsiXS5wnbejHK8M42fnH/39JES/2gDomGMS+jXKCtbMMxls2MteJfH08ORGE3he3H9RrAbUlBRyy77AQ==\" value=sha256:b31ddfd1baa9496e777a46eee181f78af46d90e8bf0875535bab08cf8188571d\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/lattice.js sig=\"ed25519:era1:0XfUx+1YypO18Lp9uathy47eGLB0e+7/D5dfkueYh8xo8JyVgk2Nk0YNx0Fo0Yd133cV6NzXV7/+jGDbChObAQ==\" value=sha256:3542e51164f5452997728dbdcee4f6c5a9ff36f211679e595e9f4ae99dce2f9f\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/phase.js sig=\"ed25519:era1:cdTJZ3gJjfXG/ofomV+2Q10oPf4dp11WDvJnmQfAgB9Ydhum/Qx1saL2goqZeJU1k23efatIsG0lxPYHaG2MCA==\" value=sha256:5a0a880fe3d03543d6042e920548c276b3731216810e8791b0d2188fa80dd1ee\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/rank.js sig=\"ed25519:era1:J10tXam5aZkEKVi1qcjkY38M3NZdvI3gV2lP/NpKg9ooj4kkhSumJZH0eJaJ7vPdWuuVxjvH4gMn3vk4rj8aDw==\" value=sha256:9f851ab5018d6b01b16b07ea9eb81f1ef197cc7c7dc3336d512c5b5154877c0b\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/forms/form.js role=writes scope=module/@lapxo/topos/dist/forms/stretch.js sig=\"ed25519:era1:RAI6hLFPggwg+p2E4CFR5skDPllUE4Kuw6Zix+meeCVP3O16UUaUA03UyRlSq27kS8oUSWpBFo/QBiBL4MsADw==\" value=sha256:1ecbd9c9d26c5203b560826702bfc93a6d9f534f38814b357681169a07373413\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/sig.js role=writes scope=module/@lapxo/topos/dist/wire/act-result.js sig=\"ed25519:era1:qXOSd3PbY55dWgrCB+gY89V2EANcg0RiOhBxV94VgdG3HC9Cs5t5YMxA2mY9VKRtaKC6fHW/euTHdHqeB7C7DQ==\" value=sha256:ad887d08993ca71741cb3333ca67251ef64c24da5248a0abdad92ccc448108da\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/authority/admit.js|module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/object-record.js|module/@lapxo/topos/dist/wire/outcome.js|module/@lapxo/topos/dist/wire/sig.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/claimline.js sig=\"ed25519:era1:V94XN39j+voDOftViIRsMM9pE23747ZdvVbmqWATAEhS7NVTjRbQ/oB+bTBW1cPAFdw+cK1dRh9FPjehzNPEBQ==\" value=sha256:aadc3029a57954d3cce9ebc01d13e29887a7bc77fb4c55ad3644406ec520028b\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/topos/dist/wire/classes.js sig=\"ed25519:era1:2qcOvSokTBzU7ef/40xexdAQvZed7mwbN31nlEO9eCjMSAy8DktcMQ2PnYLoT2PCsZuPDBfZi5SNsL2B8WsvDg==\" value=sha256:759f669029f1da8c35dc71baa6aa08282cdd70731f5b15b30e5eb31234a0ec0a\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js role=writes scope=module/@lapxo/topos/dist/wire/evidence.js sig=\"ed25519:era1:9tW2x6DJIrEWGTUCSTxkmtfctniBy5ZscxPwS62lBEumUXH0HLM2ZkvoJQDd5vsYhOVPt0TsVY5DIdv+DsN+Dw==\" value=sha256:fcf6c66b4625b78a3225a97ed06cee84f152f2c2886b113b5a09ee9f3e21a80e\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/grammar.js sig=\"ed25519:era1:MZBeDqBaN4/fq+Tkz5sGLWjhESVUg9EmtluKcR8OZ943/loldKb879ghPjCey0W6KTSQ/ObiwUB0bbkGbo56AA==\" value=sha256:a78171bb011eeb35b22ef9e463e010ede76fa1a716088657d50117d1ebb62e53\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/act-result.js|module/@lapxo/topos/dist/wire/claimline.js|module/@lapxo/topos/dist/wire/classes.js|module/@lapxo/topos/dist/wire/evidence.js|module/@lapxo/topos/dist/wire/grammar.js|module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/measures.js|module/@lapxo/topos/dist/wire/names.js|module/@lapxo/topos/dist/wire/object-context.js|module/@lapxo/topos/dist/wire/object-history.js|module/@lapxo/topos/dist/wire/object-record.js|module/@lapxo/topos/dist/wire/place-act-context.js|module/@lapxo/topos/dist/wire/publication.js|module/@lapxo/topos/dist/wire/reader-lifetime.js|module/@lapxo/topos/dist/wire/record-kind.js|module/@lapxo/topos/dist/wire/sig.js|module/@lapxo/topos/dist/wire/signing-port.js|module/@lapxo/topos/dist/wire/transport-port.js|module/@lapxo/topos/dist/wire/types.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/index.js sig=\"ed25519:era1:IF8YBrRoyKj9ezSyvFPbpB2/tZ0GyzO0vpsgsvhGRI0OwcRUoUzgJ3fB8xLCZ5Xc76QWaVsi2sLB+GyXB/p0DA==\" value=sha256:db223756dbd45beea450fc175b2c7fc44a41625a4931df4bec18229c436b086e\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/outcome.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/line.js sig=\"ed25519:era1:lylOkPVt8vPsNTeGGg6btJlrkEWMu2jSGuXaQyY4TflqnkcvxvQOM0FJUU4DGJ6lEkJkBAJlxOjH14nQrvYmBQ==\" value=sha256:d683feba756bcd4153ed1860f5094972687db795f394ef3ec17924bc367c96ac\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js role=writes scope=module/@lapxo/topos/dist/wire/measures.js sig=\"ed25519:era1:pT+wcn1eOw0+1nIDdAd4EHxwKQshcNYyse0Et3xZYtKpfsbxylzUEMEa/294zTs6tNyDhjI9H6iL+4k8+AaRAw==\" value=sha256:0ba6f4262398419773c4b0cd0c3697d4ae9c6500e98948efc65d21259135ab75\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/topos/dist/wire/names.js sig=\"ed25519:era1:Qw6Sey5fCVJmcTy2EUpfVmJTVVliGpHG7uzvaS2RbwkZj7+yPkZq2luKnUGfZTi8tDAt8KZOqt1rOHmigZi8Bg==\" value=sha256:e9b619e2bc56a2fdd59e55b790456b182716b2e1a5cc5ee70eea0c56ed521d3a\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/object-record.js|module/@lapxo/topos/dist/wire/outcome.js role=writes scope=module/@lapxo/topos/dist/wire/object-context.js sig=\"ed25519:era1:AhPNQiOa7XUDZVopxk4HJNTACXmNKV1RJ0eoTFgkUf8ovUxyjCkQB5/qRM7kF5WxAPSWc96c1uTwKRjks1vbCg==\" value=sha256:5ddad691abfde0191db168419fcb1bd672bf764fefc1542cae56fd3337ac4af3\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/claimline.js|module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/outcome.js|module/@lapxo/topos/dist/wire/record-kind.js role=writes scope=module/@lapxo/topos/dist/wire/object-history.js sig=\"ed25519:era1:UurkYEKr8aPjRz0yGilG2x0J4tFsul1AmrUMryDlXENmeyQ41xNVdcuiOVMlBV0dibYsb2nMhOFhUT0RCMz/Dw==\" value=sha256:591d909e4af84980d1a3fb3e61a5ad22cd56bf3040bf14becec393f6789caf37\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/grammar.js|module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/outcome.js role=writes scope=module/@lapxo/topos/dist/wire/object-record.js sig=\"ed25519:era1:8kJc2htV7pXasFDxLvsJHhzMriMZSK+v9T+57JYwAAj2tnQYi19leTa4mgYcStR2dvE+GmXT9JcumFmA6L+mCg==\" value=sha256:b2995fe366b23f7ab34fc46d2481db901f552a31a8cff0a5a02ead74e36ddda7\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/topos/dist/wire/outcome.js sig=\"ed25519:era1:D/MHRfBvHD5dJo9kbZRCnQqaYVBuIRhYt1FOI7gI85Ts9swLureFiXkvEHCWxFZc4aCcCOaXKxiV3Lez2rZ4Ag==\" value=sha256:deab53c58c078862088ac4bf424fb13ed68793913e399815871031e3a7e41a9a\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/claimline.js|module/@lapxo/topos/dist/wire/line.js role=writes scope=module/@lapxo/topos/dist/wire/place-act-context.js sig=\"ed25519:era1:tsjEi8hUb9to1zsNVUZ/0sivfIyzZXEr6U+qm9QVdsAPkV4TCCWP8NdcJXOQotwJUSX9ZHHmHTXR+e4/6dMHBg==\" value=sha256:4c20ef9134263ed4d28adcb7c4ebfe8444d7d923e3355cf22adafc7a4332a133\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/claimline.js|module/@lapxo/topos/dist/wire/line.js role=writes scope=module/@lapxo/topos/dist/wire/publication.js sig=\"ed25519:era1:5/QcfpLw/HLkA4Xf/kXUiJHvbLTpInkjRaeqArlQ1cAy7BsfV+7sDhjFHLKvjuEpA2QK4LY2sRUw/bCo7HSpBA==\" value=sha256:15e96b443de431c47937f32d550b9cc8fb04feccb08ac3558ef26c55c3d8edfd\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/reader-lifetime.js sig=\"ed25519:era1:/EvUpunOpE4pG2AbBM17V6SNXlgirg7VxwVgnOBlO3/MPB9e6hV7wCQwoAlAtZVuIxGGwB8pM5oPBz9OePIwBw==\" value=sha256:ac7cfa4009fb6e1aa0e5cd88190332c6529c0c456c2439186cf56c43411ce309\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/outcome.js role=writes scope=module/@lapxo/topos/dist/wire/record-kind.js sig=\"ed25519:era1:cy9Q4nqnIT181esUxGDUMYbbJXccFt/UXRC9u4WRwP6XCSdXsNLZkYsXShVgv9kjI+/+ihkCJhjkhREu+Zw/Cw==\" value=sha256:844a163ddf99a694a1dc54cd8ecf118c91d88b92ff8f93424092b53c4ffb2cd1\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/topos/dist/wire/sig.js sig=\"ed25519:era1:du4CmovJAO/kC/F6AoN31BvVtEE0bK36oIeVmOCfGm4rSiIzAXf0u1/NjZ1fuuOpAAToDsSeE0FwSYjXvFtHDw==\" value=sha256:103d41dd0dc8fc9386fac861b6f0392b05183945b4a9c6e9f46dffb976c20d9c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/sig.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/signing-port.js sig=\"ed25519:era1:NS9KSdB9t2iIPDyma9s1PWNmBFOeG6Q/cXTFTQc7Y7eYiYLb5z0BU48v0r93JHdoiDGenc8nAXqIgUWDhqSrBg==\" value=sha256:b5787a9ddd779bc0ad7f167057211116ea488e4e051956f74ed2c0e782d446b7\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/index.js|module/@lapxo/topos/dist/wire/values.js role=writes scope=module/@lapxo/topos/dist/wire/transport-port.js sig=\"ed25519:era1:yDO/xEPD6QYjHZuhQkCH4tgixv3h2EL9daniYQg7Y71T6niTKhH4BbvpnUyPt1hNtl2qHKlnUVIRiyoqfSNLAw==\" value=sha256:116b1d2941add8cf2b41db06ef8c28f846a05b20c66b11f6d29f3bf0ce44afbf\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/line.js|module/@lapxo/topos/dist/wire/outcome.js role=writes scope=module/@lapxo/topos/dist/wire/types.js sig=\"ed25519:era1:RBqwcKkS6SGIcoetnpWfP4sLihnBWceOhlDWysb6g6VyKXZ5DdJ7clji+PSDFYTt+Tgl/Sl0xPcpumkql+aZDw==\" value=sha256:ed15e5d164e28439f811665306ced6e06d1ea030a3779bf387350b1cc131211f\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/topos/dist/wire/values.js sig=\"ed25519:era1:91SrEcHJ/BzYviowq3m6t8fHBCYH3anKL2mogJGv2HEVMw5XolTaNsmRgpUftvrjQkcZmqGCY4mUTJULHoX2Dw==\" value=sha256:5b883395c0dc4ecde724a91d6a263c68d180a8e53fac6319daf51087af214d62\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/debit/debit.js sig=\"ed25519:era1:D1XAFk46bxZrMzlBZ+MbfIJpLv93eA1t+5e19COwOx4mb6dOATjfnAssuWP8cBmRdO7R+7IIT5M3JVEvrrMNCg==\" value=sha256:4e9c79bfb91f542dcb1609846da3d32058b87a4c45cd3eafa13821d567f8feb9\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/debit/graph.js sig=\"ed25519:era1:i8Nj+hRJG3JskPp+bfgOmTi/EnyfeK8OmfQj6grH0zmxTy1zHbx5MiGJ6odx4ifBmGETVI33lye9asPOiMxIDA==\" value=sha256:5be27ebec40dcb3ffdc34775622a1c07367daa2ad2de93b3ca0edecf4b823bea\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/debit/ideal.js sig=\"ed25519:era1:lT0Q4rtXAoFOhIveSjfKTxaIquMYPO8CvrQy0JuLxqn/IT7MvPnC56o1XO0HOfA+A1c4XZIUEU+nm2jl8kqSAQ==\" value=sha256:4c55b1eaad5301c264611e322aee48734c2dd95a7f54493ca1211caf6a4988fd\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/packed.js|module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/debit/masks.js sig=\"ed25519:era1:mJo6OAFoC1YrBsl/aKCVI0/y1AVeESsFLmoEKEQBhK9Jvk0ay1S/vTp9xyciPlspSTGyLx6/XnNggCXPo84gBQ==\" value=sha256:4f175c64ecdd57f4e0b0746b58940390c6777b7cc8944b27f0badb7ba16bf37f\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/sign.js|module/@lapxo/obligations/dist/lattice/errors.js|module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/debit/observer.js sig=\"ed25519:era1:ruqrA3rK6iOZnypIe5HwyWyu7eoiDYUEsMifvcp2X6jS2dVKzNwGZvdm3i3W9P8R4rn8fHcaoC/ExRNscvKrBg==\" value=sha256:a2ff9de359770cc855074c673c008c4c4168d371983fd88f14f7c90290d39e7b\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/debit/packed.js sig=\"ed25519:era1:xbxYQgEe1ijOSjUH0OFEJndCyUEpgtAqEwCNEegQAoXlFxL5kCn1GIoEtqJ4QPW3b2zjBmrlO9L+lZs0rM6aDg==\" value=sha256:292c09c79fe8870f6fd45558a949ab6e1ca9081d97cef9008dff79295e7a53fe\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/unit.js|module/@lapxo/obligations/dist/lattice/order.js role=writes scope=module/@lapxo/obligations/dist/debit/provenance.js sig=\"ed25519:era1:QZfiRZs00Lz813dzOTmb9OtsqAYrxM1MuqUkJJ2c2Aqx7zSE+9ML8EjvIWDkP0JnUX60giP1NpL0E98bqMNuCQ==\" value=sha256:75d20ac3801c01d2526550a2ec20201ec750290491aa7e8325ecef3fb6d6bb43\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/debit/register.js sig=\"ed25519:era1:CQtKDPP9g5I1Tu51e3DoGheyGDNLayQzHdSJU5TSjOIG1RrHCFtVExt5VaBoXxJD4tKftX2NkoM6EDY0mBIAAg==\" value=sha256:fa008ab4534bf27169dd85e9e873d4631d461fb0bcf7d5280dbdc25af2ddd4bd\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/debit/shuffle.js sig=\"ed25519:era1:g1WcycFm1A/rP5hSUbzYSoGGSC2LxKSEiyizyZGWM1TyOecl9ZFHTc8jS5EdTHiZs4dBKgFb8RazdHEjeUK+Aw==\" value=sha256:8dfd76ebab3d7bedec1e686cb371cfc96b4195c04e7f689df21cad5bd3d5726c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/unit.js role=writes scope=module/@lapxo/obligations/dist/debit/standing.js sig=\"ed25519:era1:hMxO4zxdQgInpM+OtpgUr6hocDeFYFjOwV+6QpDGM2dmfj1xrsARMsH9OMU4Z1PPp9ZRpHecFli8itXlUFfIBA==\" value=sha256:261a3ab5322cc48120e42ce468249f83ad88be28dfbb892cfee403e6833dd8d1\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/ideal.js role=writes scope=module/@lapxo/obligations/dist/debit/unit-span.js sig=\"ed25519:era1:/PvppRVLjGcaKasjhsP83UpEIltM3xIekdO7H5bWcxseQtzRd/0VVAgfn5d3qrRSRMVteYyeKnMmEyUkfkRaCQ==\" value=sha256:f882bf1b9c084707e8490e47324fa68ad48f662cb6ee94be5075e48ecb2eb514\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/unit-span.js|module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/debit/unit.js sig=\"ed25519:era1:pKPM2l77Tv4SPYAnavGHbRBall8aMxOcrWDxkRn1EtdFgZW7IOQc1V7cLzVMCWM4MACJT1yAxt3dO0o56UJJDg==\" value=sha256:a26c30d5456d99667ab44ff56663fff0ced252de60b860acefb820c32a0f5f78\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/debit/vector-move.js sig=\"ed25519:era1:A4qV9DDUg/BsWAcY3x8qSFbXY51qodIrM8XUWs9keyIGyTQqUyUeOmJRPHcW657Qs13508CnrXal7WVtZKPSDQ==\" value=sha256:0573c65d6a55bc4c20cd0e2e537e9ae6d275825b0d6e09bf20828c193b0d0a87\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/masks.js|module/@lapxo/obligations/dist/debit/vector-move.js role=writes scope=module/@lapxo/obligations/dist/debit/vector.js sig=\"ed25519:era1:MlTyJNwDt2P46KsEmYnXhQxbxyAmdi1FiTZcREzLbPY70BUnxeHuvd4ohVTmBOBnd7pCxjyiHi9vHZwzWRT0Bw==\" value=sha256:250eda384b40b23c5dbe20399e1a53a2e3d314847ac1b91c7172028cb6b91fb3\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/debit.js|module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/field/meet.js|module/@lapxo/obligations/dist/lattice/forms.js|module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/encounter.js sig=\"ed25519:era1:XxMIS5aIqhX2rngdFN0EKFnYzLGVY2Y23se/nlJxA67pgbeYetDOGj9AxOoUrUZ5p9jpfwl2oeffVmUOP+BOCA==\" value=sha256:84a46a48496abb0fcad4d37f7c891e9c7e4a7ea080035f05473d7e052e51bf22\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/field/field.js sig=\"ed25519:era1:n9OtoM1BkY8IjbM5cjCjOCPGjjB1i/UtsrdWy6fRIqQC7bAePiGVSsfpYHNB+qnLtGoP+OegTGJxvCy36TugDw==\" value=sha256:820abaed1d422fdb89c759ca31f3732b6bea6ff7bd1a5b20f2114c1626979880\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/lattice.js|module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/fragility.js sig=\"ed25519:era1:uTAl1uPXVBQci77fKjdFWzXkyTW+lMhfpM0TrBQ+ePE+SIlI8QH39uVFe513D7oBDhYXR8xB/VW9rcTgL/htDA==\" value=sha256:6c533de862591dfb397d4c93a0bc0660a00065343e6876691816c3e23724cb2e\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/encounter.js|module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/lattice/price/premium.js role=writes scope=module/@lapxo/obligations/dist/field/frontier.js sig=\"ed25519:era1:5ZV+w1lI37IEgAOgNWBEGGUasWnkuVNyR5wU4RisoqLGCxQCMTae0HTfT6K+eayfYNJvX1M3sPNygdQKhtdCDA==\" value=sha256:11931187be2c7e1afdb139c0e80582d8f2c1beefc30294c671f4d19d61636aba\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/errors.js|module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/join.js sig=\"ed25519:era1:HnovT6z+TJg/q9tpDfOfSV45xhQhOgkD4ZLUYL6mIwy3BccL0dpw2N/KkjSzjEMZEPAxzYFH42RhWQik1DlOBg==\" value=sha256:c574e7f455e18284a8f9c120a78e30c3ad87e666dc85c4c9201f1b1d3abc5f71\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/meet.js sig=\"ed25519:era1:mUXIUXs8cbwF0iNbTCtw6tdZNASQh/H/XNAutZozuBFanBmiZo+/mCLZCZx5cQn1OMSo6lXTlSnBcQAXvPqYCg==\" value=sha256:9b52c83f47dbf56e144aba56cc077ac7eb0ef57579aea5c72c13324d4f9dd39c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/unit-span.js|module/@lapxo/obligations/dist/debit/unit.js|module/@lapxo/obligations/dist/debit/vector.js|module/@lapxo/obligations/dist/lattice/order.js|module/@lapxo/obligations/dist/lattice/price/premium.js role=writes scope=module/@lapxo/obligations/dist/field/motion.js sig=\"ed25519:era1:3a59Li5XotQ7lnIzM/LYTzXDoUkG/v5C6BI8g/GMtnIhWGpdN6ycEa/UM5D0z0ze9r+5uKSnnFDpSj3tAIpdBQ==\" value=sha256:8ae192e43a7ae7c0b406280984063a8094a67a8a0d4e0d9fa943a21c2c7571b7\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/field/observe.js sig=\"ed25519:era1:NVcIgD+ldBrFrfkSLH75GKWsK+aiPWSqxwvyIjtx1yS0HWKZWSaWEG4WbA2FufOx1yOU8pTBNxiLC89rS7J5BA==\" value=sha256:e9255aea5a52edaa841ca520804870f714817fb64b764c3d66921055c6165f3f\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/encounter.js role=writes scope=module/@lapxo/obligations/dist/field/present.js sig=\"ed25519:era1:RGOkrdWKsQZ5Z8+BhqiAapBMM26Rr2Jb9iQir9iVfOXfC64vrjEy6pZDXGPUFwqQ0W9uuIfc70paAD7No1snDg==\" value=sha256:1d730a7a65ffd97f3fce761ddee21b99947bfc60ca190b4107c90562fde26692\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/field/refine.js sig=\"ed25519:era1:JrpisPehQMrukN1n6y/eXByHMt0uz1guZmS2NELMRjqhTDwAJ8hRGWq/LP6dPC0QjaSA9EYxTqn4ZROdZ6PIDw==\" value=sha256:1653d77d1e954d29eb5e6968ff8fb9992d05a2f0990ee48d634c931bf24c1201\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/require.js sig=\"ed25519:era1:UP0uM4u34vRUiuct65O90RDWdi88kakjE+CdG5TSp6gYXr/+nKFLZCg5kw4OGozXx/HEAd7eDRLjT8PmL1xhBA==\" value=sha256:895a5491ca1c60cb0cc7db2325df7c9b02e69ce25df7dc378371fc38df146b9c\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/obligatory.js role=writes scope=module/@lapxo/obligations/dist/field/sign.js sig=\"ed25519:era1:be9UVMQoe6Rn8Pc48b8IBcT8OJL/zfU2l15y34fNLJ6OjyP7Akytiy9GaNTQ78wWMfsio0Koc0T9pKAp7+H/Bg==\" value=sha256:0286a81e542ce89696d8593dedec9b7930bb67b4bf55b959979638f1eb98f8a9\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/lattice.js role=writes scope=module/@lapxo/obligations/dist/field/signatures.js sig=\"ed25519:era1:CWSLmK8jam+46XvIJAHSjsFDyyzZl6JgUA0ZESBGqnHt8zY/Aun7DdRiAqKto92iwjnLCArqkZ8N8Cw2dhxbCQ==\" value=sha256:4f7b0afb3a20e1e23a64eaa5ba14d3a30c091f7ba435b75d862330067d117e2e\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/ideal.js role=writes scope=module/@lapxo/obligations/dist/field/yield.js sig=\"ed25519:era1:VDiLybDDs7GLsDS71MdF2q7ht/O3TVpLuqeihLTnBhP7n1VL1bTj2yKPK9Vc/jyF9Plo/8NZPc1GhUXcj2baBw==\" value=sha256:89aa3852828ff5ddeeb280532220f63ce8af5c8b66d722833a30282062c3a834\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/ideal.js|module/@lapxo/obligations/dist/lattice/lattice.js role=writes scope=module/@lapxo/obligations/dist/lattice/axioms.js sig=\"ed25519:era1:Go6/mbvFFZCPG6lZVL5CCbH8w1jTadqONDysKKsCEgFjk31OGxpfJo02YwsYHZNtkI1V07GGP+DmbVAMCCc1DA==\" value=sha256:b2c0d26adcc3374a6d1864f60aeee57d2b0660ebe2ca08cb35602af077f3f722\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/lattice/declaration.js sig=\"ed25519:era1:E0SQYGoMp0e9CprP1FXPUtaaAxxVOCbOXsF1Hmlz+OHmqiw/XBPxii9mmZ6M8IVbZs5o0RkEfB2SdfkzQTUxCw==\" value=sha256:c5c4459ad4f5cffe970f87129bd5ddedeb9e35f1163204630788a574a5fdbd78\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/lattice/errors.js sig=\"ed25519:era1:KowLQTcVghh+BoUYVLtLCbVlbHMMa1eHibXUSFfftNQx4LO6klFWUMTkCB6L1NNFFxah54BW7eEtBi53nppRBA==\" value=sha256:0cc476498db21b2aab91e90cc0172bb34373cbe2876a21a21efdc8ba088112b0\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/masks.js|module/@lapxo/obligations/dist/lattice/order.js|module/@lapxo/obligations/dist/lattice/scale-lattice.js role=writes scope=module/@lapxo/obligations/dist/lattice/forms.js sig=\"ed25519:era1:Odiz5OKFEoV+aTRMOb5HMfonOG8f0vP3HvhHF1FBAqKa5I5fQ9gCzFLgqnkGNGpRoFg9ILprKYZSgFCtwFm3Bw==\" value=sha256:9061bbb17d68f5d04e469ca83eebf4aa9db184d627b4228bee504f7f0be3dc42\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/debit.js|module/@lapxo/obligations/dist/debit/graph.js|module/@lapxo/obligations/dist/debit/ideal.js|module/@lapxo/obligations/dist/debit/masks.js|module/@lapxo/obligations/dist/debit/packed.js|module/@lapxo/obligations/dist/debit/provenance.js|module/@lapxo/obligations/dist/debit/register.js|module/@lapxo/obligations/dist/debit/shuffle.js|module/@lapxo/obligations/dist/debit/standing.js|module/@lapxo/obligations/dist/debit/unit.js|module/@lapxo/obligations/dist/debit/vector.js|module/@lapxo/obligations/dist/field/encounter.js|module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/field/frontier.js|module/@lapxo/obligations/dist/field/motion.js|module/@lapxo/obligations/dist/field/present.js|module/@lapxo/obligations/dist/field/signatures.js|module/@lapxo/obligations/dist/field/yield.js|module/@lapxo/obligations/dist/lattice/axioms.js|module/@lapxo/obligations/dist/lattice/declaration.js|module/@lapxo/obligations/dist/lattice/errors.js|module/@lapxo/obligations/dist/lattice/forms.js|module/@lapxo/obligations/dist/lattice/lattice.js|module/@lapxo/obligations/dist/lattice/order.js|module/@lapxo/obligations/dist/lattice/scale-lattice.js|module/@lapxo/obligations/dist/lattice/vacuity.js|module/@lapxo/obligations/dist/replay.js role=writes scope=module/@lapxo/obligations/dist/lattice/index.js sig=\"ed25519:era1:BbeiDu+4V+3AT6bmjK+XtZSaN1UtEHBDFgODq6UPZFncKHiAHuYz6ivS7IgMlQthETFCN/+pE1z0fP/C7B0hAw==\" value=sha256:597e3c37c0d370687d1ed0674ae0737c8ec9efac5ca270c1abdb84413dd147f5\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/lattice/lattice.js sig=\"ed25519:era1:OXUHC3dczC/GC/+OYnhPkGKJwwF0+Bx+ttF93xivRiN2jHJktA96jz1wXZC+VgytKjopF4qXplr8GG+5CDYACw==\" value=sha256:0922b8ee14e1fd0e6c56cf026b377e67e070e1ab5ede71b64aebe17ecc4303a7\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/lattice/obligatory.js sig=\"ed25519:era1:rWV/hbammxKIt7P77DkjCNDx8Y4c6GUnSnqa/eApcd7l2fNJ8jgQtc8PWeP9gBgfcVDO0uCHd7ow3XaDkv93CQ==\" value=sha256:767c01b525fe5e97997acebdd2aac89c0d6e579fd9d6955c339292d17d34d048\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/lattice/errors.js role=writes scope=module/@lapxo/obligations/dist/lattice/order.js sig=\"ed25519:era1:tFIs0/gKiV2JBcQ3MNdRdIwpWu9RkX7DqDdIlR1mHV4e54RHu2Gx8o6NyjBaiVZGyBOjfj+6UsffyLu+P/9DCQ==\" value=sha256:4752a5da2995163d26712bb96acc9c14d5d65f76366e941ec29c25dd8fdd6741\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/lattice/price/premium.js sig=\"ed25519:era1:NwGkEZPdrfeIaL4U83YQX9p7S1Fzcy+5+QOATOxAeq56R43ZUAb+IYtK9I6Oh4NF6kZgGhaOmpidEwC/R7IJDg==\" value=sha256:3c8e7a61164f5dd2416112baa791ed401922afeafe06239c597113bb2b5f78ff\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/masks.js|module/@lapxo/obligations/dist/debit/unit.js role=writes scope=module/@lapxo/obligations/dist/lattice/scale-lattice.js sig=\"ed25519:era1:vqJs6HnQijpE+K2LWbt69oWkp4C/DPXgDwabeFG9SknoFSTCZQsNb+i2zf2J54aifwhPd1q7Sq+govg1MFQqBw==\" value=sha256:2669476b7811dc4db1ffe60131fbf5df568030f37d66cacb7062f7ed87704fa6\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/shuffle.js role=writes scope=module/@lapxo/obligations/dist/lattice/vacuity.js sig=\"ed25519:era1:dJH8vPlRj3NGRH6moGt8gFICY4DFQHao+9rKLdR8JqjtrtV7MTgxnuzEBcWgYP31fYZwfmw4tVElPd0LyH6VAQ==\" value=sha256:86a33399266ad3d5274838e9580a467d045e8edba6bded643ffdb580a79ae37d\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/field.js role=writes scope=module/@lapxo/obligations/dist/replay.js sig=\"ed25519:era1:a9LUap1Vj6WmgturISu0xXMW/gt6NhXPGFNrvEBc3VoRGcWiJjNoht4blPtstaiopXrGb+UIG9PQoqeVoTehAg==\" value=sha256:195a93d0e955b30575e5172e4dcb779f8c688997de1a3a3a5c649bcc6a723ab3\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/debit/debit.js|module/@lapxo/obligations/dist/debit/observer.js|module/@lapxo/obligations/dist/field/encounter.js|module/@lapxo/obligations/dist/field/field.js|module/@lapxo/obligations/dist/field/fragility.js|module/@lapxo/obligations/dist/field/join.js|module/@lapxo/obligations/dist/field/meet.js|module/@lapxo/obligations/dist/field/observe.js|module/@lapxo/obligations/dist/field/present.js|module/@lapxo/obligations/dist/field/refine.js|module/@lapxo/obligations/dist/field/require.js|module/@lapxo/obligations/dist/field/sign.js|module/@lapxo/obligations/dist/lattice/obligatory.js|module/@lapxo/obligations/dist/views/field/physics.js|module/@lapxo/obligations/dist/views/field/policy.js|module/@lapxo/obligations/dist/views/field/self.js|module/@lapxo/obligations/dist/views/field/wave.js role=writes scope=module/@lapxo/obligations/dist/views/field.js sig=\"ed25519:era1:aFBl9WNlnsWwWAmAkTl7lWrStaGFEZBdAfnM2Qk2AgO/okB9wl92iSY8anQZa8RFBZxzv9BciZ356sKeDLVNBQ==\" value=sha256:691ea483df5d6021feae901607ccd3b67721514c2963ad539466839d6a1db430\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/meet.js|module/@lapxo/obligations/dist/views/field/wave.js role=writes scope=module/@lapxo/obligations/dist/views/field/physics.js sig=\"ed25519:era1:DEFi1RdMC3+GYyHr5Ji5Lt797vO5gyuY4Mtl5DcJZY/53PYyjDraP3ABorYjzEaR2iCCX702hOIa7nMiuHZlAw==\" value=sha256:69e500cdd7bb1a3eff095c4e15078db508d214adae84c3b3d751ec60de314ddb\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/encounter.js|module/@lapxo/obligations/dist/field/meet.js|module/@lapxo/obligations/dist/views/field/wave.js|module/@lapxo/obligations/dist/views/product/reach.js role=writes scope=module/@lapxo/obligations/dist/views/field/policy.js sig=\"ed25519:era1:YaMjXVknzQNtyg+MNF13gLOWCj9W9IyxnAfD0JGZq481h+LDOz14FXw4ezS32KLDzOSDY0X1cAu8oyceBqfHBA==\" value=sha256:b248f374304c22f7f08e9639f32cd5651e4092684a874dac3396b9b19fb7ed10\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/meet.js|module/@lapxo/obligations/dist/field/observe.js role=writes scope=module/@lapxo/obligations/dist/views/field/self.js sig=\"ed25519:era1:r6bkOV+oSuR9CwUHGmRsgbk5z1ELYVOyQYRJogtoTDM5Kc6DvjU5JfprnAmgfZc559NdSYk2895ZhtpfVM5xBA==\" value=sha256:d8fe9cf3233c45cb87976097920da194cdfae9cd7da4e75f4bb15de533b258df\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/obligations/dist/views/field/wave.js sig=\"ed25519:era1:vczFBp0wC31BO4rD95HgeVyrFs1GuCF5Ji8qTwaFNVnRsLcxEi4mTqC0DBvvtcxmBY+SFMKVfcnJG7zZifp4Aw==\" value=sha256:ab030ffa1cf49b5b26a9e5b62a94d4f553c6313c5e7138f66016d7d12f620c0d\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/field/encounter.js role=writes scope=module/@lapxo/obligations/dist/views/product/reach.js sig=\"ed25519:era1:cbRMp/zyrhhJetOjwoz42vSxwld3imyAkrGquEJxgMSL1oez/fVjBu/owTgpeoi9hMPbmML7+g0uq95UL+EWBA==\" value=sha256:81ceeabdccb4451d03f307ca959caa0373512272715dcd46b70444c4ccbc4d61\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=none role=writes scope=module/@lapxo/bound/dist/engine/encoding.js sig=\"ed25519:era1:jIyYYP6ymoeFysdMUILEBNqU1RfQBouF6cXipa05dNYO2BAo92+MJ5Ww439uazKHvL7m7y0r5qC9o/d91ahfDQ==\" value=sha256:cbce4fc176442aaeba9e22ff64694a79b200cae39231328b90b980de8baa84aa\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/bound/dist/engine/object.js|module/@lapxo/bound/dist/engine/ports.js role=writes scope=module/@lapxo/bound/dist/engine/index.js sig=\"ed25519:era1:ZDbo1NoM1Fhv6W5MXR92EAs/mJiEeRAIemOo8HyqQhLXD55NQ3+VP47NDllT0relS92vr+wGh0NjptKBY5erAQ==\" value=sha256:e9012fd46c05050ed611878d1ea5eb108097430a741e161d58cf1dc72238db60\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/obligations/dist/views/field.js|module/@lapxo/topos/dist/wire/index.js role=writes scope=module/@lapxo/bound/dist/engine/object.js sig=\"ed25519:era1:sUU/G/QXQybF9BUdxk9bX/lAcGMp1Z/+VJ8ewQ5sBmiM21eEP7sVDMkBvqkGqrrSlzwxl2TtLFtSYEqDJ+kmCg==\" value=sha256:1d8e2a37d187b4370ad2fb86383727dbc17a09351ab77799047213ce15f33dfc\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/bound/dist/engine/encoding.js|module/@lapxo/bound/dist/host/refusals.js|module/@lapxo/topos/dist/wire/index.js role=writes scope=module/@lapxo/bound/dist/engine/ports.js sig=\"ed25519:era1:TIOZ6qi/HE/zv7kQXJSFT6CUkm9Ed/FCzmtQWjHXTG43uuDZjzZHsN7y5afcynF9STtakRexIFY9uvpjKffvBg==\" value=sha256:3f7162e409170fbda9be799a9058667d998b1308be9a46ca79c1a584693bb6a6\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity restsOn=module/@lapxo/topos/dist/wire/index.js role=writes scope=module/@lapxo/bound/dist/host/refusals.js sig=\"ed25519:era1:gmQHb8J+1YbEZlf8WmPBWshjtYKJ6btyLiBFfZYKbc+5FW6hBj9KNIlUUvUaDmo5kExg0zvFzXDd/t21fGdGAw==\" value=sha256:c6254ec234fb4d04eeca0f126a2d5df728a8eb2f61c60736d1f81438311b0eea\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=profile restsOn=module/@lapxo/bound/dist/engine/index.js|module/@lapxo/topos/dist/forms/index.js role=writes scope=profile/interval-min sig=\"ed25519:era1:x948OdKMD5DgbTyN3YF3ak1+GzPYQsed60oUBvTrKKfhbvGOsPZMV9EEf8O5hf57QJlB+KjwaKMBxZXZQWxbAw==\" value=esm-file-closure\nbound-lock/1 at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=identity role=writes scope=engine-inventory/interval-min shape=interval-min.inventory.json sig=\"ed25519:era1:ZY2r7L3RY4FQIKUPM92dPLQSK8HtMcBUrYR5GT2UbtIPeDq2IeDGIblMiStXwMoyl4VXPSfKlEzuNJ/XJIMlCw==\" value=sha256:9cfdb4622398a55fa23452278c0111085ea1a83a9fd8109a1e3418696d578890\nbound-lock/1 about=\"# E-P interval-min: declared module closure (proposal)\\n\\nA need selects the existing public entries @lapxo/bound/engine and @lapxo/topos/forms. The existing moduleClosure implementation computes a finite ESM file-level closure, retaining unchanged module bytes and their literal dependencies. No symbol pruning, new resolver, or duplicate algebra is introduced.\\n\\nEach module/<package>/<coordinate> declaration names the SHA-256 of that module's bytes. Its restsOn lists dependency coordinates, never archive digests or package snapshot hashes. The inventory digest identifies inventory bytes only; it is neither a canonical standing nor an executable bundle. Package snapshot identities in the inventory are experimental module-set identities, not admitted standings.\\n\\nThe profile's restsOn identifies entry regions. An unknown need refuses. The existing low-level verifier reports missing module bytes; public resolution must expose unavailable declared bytes as open needs/bytes/<digest>, and that public resolution remains pending. Altered module bytes refuse; an omitted dependency declaration refuses; unresolved executable loads refuse rather than claiming an empty dependency set. The executable walk must compare declarations to the loads discovered by the existing verifier; restsOn alone is not evidence that loads conform.\\n\\nThis profile consumes pre-admitted typed records and a host-selected interval form. It does not authenticate carriers, implement the full CLI, establish an execution sandbox, or pay portability L6. The measured gzip concatenation of source bytes is not a runnable bundle and establishes no QR capacity claim. Cycles are traversed with the existing visited-module rule, not a semantic fixed-point iteration.\\n\\nThis proposal is generated from the integrated no-hook interval-min.inventory.json. The syntax repair is outside this 87-module closure; the integrated comparison retains all 87 module digests, byte counts and dependency coordinates. The Bound snapshot identity changes because it also names the corrected reader outside this closure. No owner act or release readiness is claimed.\\n\" at=witness:engine-place-interval-min by=owner epoch=2 form=alphabet measure=text role=writes scope=prose/en/files/engine-place-interval-min shape=docs/contracts/engine-place-interval-min.md sig=\"ed25519:era1:uI/ruFLEqGKifBRk2uC4YsU1TD0Cs3ACuNfdQFk56y/2j4k4bA2+MsBT6vDhgUOgIiePL4ogTSmuAT3XFJl4AQ==\" value=lock\nbound-lock/1 at=witness:bound022/ep-library by=owner epoch=3 form=alphabet measure=digest role=writes scope=uses/ep-closure-library sig=\"ed25519:era1:6CW+3O4sapuDtO6rz6/JvtuCVw5ZlzPqNNxvqgfI3MSkz5HHltaguRmH121ntroo2vO8QJdKhum1ATnpKaF3AQ==\" value=sha256:469f1becac2767f651a1060313244cad5724052e724b6dc4a08c5eb139df491e\nbound-lock/1 at=witness:bound022/ep-library by=owner epoch=3 form=alphabet measure=digest role=writes scope=dep/runtime-ep-closure-library shape=reader/index.js sig=\"ed25519:era1:yZcTpCic1h9nM2L8DVf1IV85s1T/uKkn/WEnxUCbK2SjI4Ty0PrOgf+yEIHrBjn0LaGsQuNJbonyQ75eVqlhCg==\" value=sha256:2c368fa5b5e918ab388d4eeaeefac18bb7467473254bf4eab32cc7a79e9f2896\nbound-lock/1 at=policy:bound022-ep-library-delivery by=owner epoch=3 form=alphabet measure=id role=writes scope=sources/ep-closure-library sig=\"ed25519:era1:K03kag7Sab82XlIFrmnWbuP2YOiBK7zofPE4UDAbK2f1Bjzkb1Po6+TJc7EL4xlLONW/2FAUiML2r6Y89vgvBA==\" value=https://github.com/Lapxo/bound/releases/download/v0.2.2/E-P-library-standing.bound\nbound-lock/1 at=policy:bound022-ep-library-delivery by=owner epoch=3 form=alphabet measure=id role=writes scope=sources/runtime-ep-closure-library sig=\"ed25519:era1:kVAQfCk/LxWsxlznfgqHOX3HHSsMvTFrFLEovhY7oaC+LRgGFgpA080cgkOMZgjtiPKTjjojlpl9hAzXokocAg==\" value=https://github.com/Lapxo/bound/releases/download/v0.2.2/ep-closure-reader.tgz\n"}}