@lapxo/obligations 0.4.2 → 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +4 -0
  2. package/TARGET.bound +68 -11
  3. package/dist/measures/cofailure-pairs.d.ts +113 -0
  4. package/dist/measures/cofailure-pairs.js +129 -0
  5. package/dist/measures/index.d.ts +10 -0
  6. package/dist/measures/index.js +5 -0
  7. package/dist/measures/marginal-information.d.ts +78 -0
  8. package/dist/measures/marginal-information.js +71 -0
  9. package/dist/measures/mix-loss.d.ts +187 -0
  10. package/dist/measures/mix-loss.js +101 -0
  11. package/dist/measures/phase-defect.d.ts +40 -0
  12. package/dist/measures/phase-defect.js +33 -0
  13. package/dist/measures/tolerant-subsets.d.ts +79 -0
  14. package/dist/measures/tolerant-subsets.js +60 -0
  15. package/docs/measures.md +24 -0
  16. package/docs/paper.md +2 -2
  17. package/docs/reference.md +6 -1
  18. package/package.json +1 -1
  19. package/proofs/cofailure-pairs.json +26 -0
  20. package/proofs/coordination.json +27 -0
  21. package/proofs/helly-comb.json +17 -0
  22. package/proofs/lean/Obligations/Cell.lean +159 -0
  23. package/proofs/lean/Obligations/HellyComb.lean +19 -0
  24. package/proofs/lineage-ceiling.json +41 -0
  25. package/proofs/marginal-information.json +30 -0
  26. package/proofs/resolution-encounters.json +23 -0
  27. package/receipts.bound +507 -118
  28. package/samples/laws/cofailure-pairs/no/sample.json +1 -0
  29. package/samples/laws/cofailure-pairs/yes/sample.json +20 -0
  30. package/samples/laws/linage-rest/no/sample.json +19 -0
  31. package/samples/laws/linage-rest/yes/sample.json +100 -0
  32. package/samples/laws/lineage-ceiling/no/sample.json +8 -0
  33. package/samples/laws/lineage-ceiling/yes/sample.json +30 -0
  34. package/samples/laws/marginal-information/no/sample.json +17 -0
  35. package/samples/laws/marginal-information/yes/sample.json +459 -0
  36. package/samples/laws/semilattice/no/sample.json +18 -0
  37. package/samples/laws/semilattice/yes/sample.json +29 -0
  38. package/samples/measures/l7-tolerant-k.json +90 -0
  39. package/samples/measures/l8-phase-defect.json +19 -0
  40. package/samples/measures/l9-mix-loss.json +36 -0
  41. package/samples/no/H1-uncertainty.json +24 -0
  42. package/samples/no/installed-artifact.json +103 -12
  43. package/samples/yes/H1-uncertainty.json +25 -0
  44. package/samples/yes/installed-artifact.json +36 -60
  45. package/vectors/laws/cofailure-pairs.json +2580 -0
  46. package/vectors/laws/cofailure-pairs.native.json +267 -0
  47. package/vectors/laws/coordination.json +386 -0
  48. package/vectors/laws/f1/finite-arithmetic.json +66 -0
  49. package/vectors/laws/f1/path-witness.json +242 -0
  50. package/vectors/laws/helly-comb.json +95 -0
  51. package/vectors/laws/helly-comb.lean.json +94 -0
  52. package/vectors/laws/implementation-043.json +98 -0
  53. package/vectors/laws/l7-tolerant-k.json +253 -0
  54. package/vectors/laws/l8-phase-defect.json +214 -0
  55. package/vectors/laws/l9-mix-loss.json +130 -0
  56. package/vectors/laws/linage-rest.native.json +335 -0
  57. package/vectors/laws/lineage-ceiling.json +790 -0
  58. package/vectors/laws/lineage-ceiling.native.json +291 -0
  59. package/vectors/laws/marginal-information.json +868 -0
  60. package/vectors/laws/marginal-information.native.json +259 -0
  61. package/vectors/laws/meet-semilattice.json +244 -0
  62. package/vectors/laws/meet-semilattice.native.json +265 -0
  63. package/vectors/laws/policy.json +22 -0
  64. package/vectors/laws/resolution-encounters.json +171 -0
  65. package/vectors/measures/installed-artifact.cli.json +8 -8
@@ -0,0 +1,101 @@
1
+ import { add, div, one, pack, probability, rational, zero } from "./rational.js";
2
+ const refuse = (why) => { throw Error('REFUSE·mix-loss ' + why); };
3
+ const exact = (input, asProbability = false) => {
4
+ try {
5
+ return asProbability ? probability(input) : rational(input);
6
+ }
7
+ catch {
8
+ return refuse('invalid ' + (asProbability ? 'prior probability' : 'factor weight'));
9
+ }
10
+ };
11
+ const logInteger = (n) => { const shift = Math.max(0, n.toString(2).length - 53); return Math.log2(Number(n >> BigInt(shift))) + shift; };
12
+ const logQ = (p) => logInteger(p[0]) - logInteger(p[1]);
13
+ const numeric = (p) => p[0] === 0n ? 0 : 2 ** logQ(p);
14
+ const entropy = (ps) => ps.reduce((sum, p) => p[0] === 0n ? sum : sum - numeric(p) * logQ(p), 0);
15
+ const uniqueNames = (names, what) => {
16
+ if (!Array.isArray(names) || !names.length || names.some(n => typeof n !== 'string' || !n.trim()) || new Set(names).size !== names.length)
17
+ refuse('distinct nonempty ' + what + ' required');
18
+ };
19
+ export function mixProjectionLoss(model, policy) {
20
+ if (!policy || policy.logarithm !== 'binary64-log2' || typeof policy.budget !== 'string' || !/^\d+$/.test(policy.budget))
21
+ refuse('logarithm and work budget required');
22
+ if (!model || !Array.isArray(model.factors) || !Array.isArray(model.alphabet) || !Array.isArray(model.configurations))
23
+ refuse('declared factors, alphabet and configuration support required');
24
+ uniqueNames(model.factors.map(f => f?.id), 'factor IDs');
25
+ uniqueNames(model.alphabet, 'alphabet values');
26
+ uniqueNames(model.configurations.map(c => c?.id), 'configuration IDs');
27
+ const alphabet = new Set(model.alphabet);
28
+ const patterns = new Set();
29
+ for (const c of model.configurations) {
30
+ if (!Array.isArray(c.values) || c.values.length !== model.factors.length || c.values.some(v => !alphabet.has(v)))
31
+ refuse('configuration outside declared factor/alphabet domain');
32
+ const pattern = JSON.stringify(c.values);
33
+ if (patterns.has(pattern))
34
+ refuse('duplicate named-factor configuration');
35
+ patterns.add(pattern);
36
+ }
37
+ const weights = model.factors.map(f => exact(f.weight));
38
+ if (weights.some(w => w[0] < 0n) || weights.every(w => w[0] === 0n))
39
+ refuse('nonnegative weights with positive total required');
40
+ const parameters = { m: model.factors.length, factors: model.factors.map((f, i) => ({ id: f.id, weight: pack(weights[i]) })),
41
+ alphabet: [...model.alphabet], configurations: model.configurations.map(c => ({ id: c.id, values: [...c.values] })) };
42
+ if (!model.prior)
43
+ return { status: 'unmeasured', cause: 'mix-loss/prior-required', parameters, policy };
44
+ const required = BigInt(model.configurations.length);
45
+ if (required > BigInt(policy.budget))
46
+ return { status: 'unmeasured', cause: 'mix-loss/work-budget',
47
+ parameters, policy, required: String(required), workUnit: 'declared-configurations' };
48
+ let prior;
49
+ if (model.prior.kind === 'uniform')
50
+ prior = model.configurations.map(() => div(one, [BigInt(model.configurations.length), 1n]));
51
+ else if (model.prior.kind === 'explicit') {
52
+ const entries = model.prior.probabilities;
53
+ if (!Array.isArray(entries) || entries.length !== model.configurations.length || entries.some(e => !e || typeof e.configuration !== 'string') ||
54
+ new Set(entries.map(e => e.configuration)).size !== entries.length)
55
+ refuse('one prior probability per configuration required');
56
+ const byId = new Map(entries.map(e => [e.configuration, exact(e.p, true)]));
57
+ if (model.configurations.some(c => !byId.has(c.id)))
58
+ refuse('prior support differs from declared configurations');
59
+ prior = model.configurations.map(c => byId.get(c.id));
60
+ const total = prior.reduce(add, zero);
61
+ if (total[0] !== total[1])
62
+ refuse('prior probabilities must sum exactly to one');
63
+ }
64
+ else
65
+ return refuse('declared prior kind required');
66
+ const fibers = new Map();
67
+ const configurations = model.configurations.map((c, i) => {
68
+ const totals = new Map(model.alphabet.map(v => [v, zero]));
69
+ c.values.forEach((v, j) => totals.set(v, add(totals.get(v), weights[j])));
70
+ let best = zero;
71
+ for (const total of totals.values())
72
+ if (total[0] * best[1] > best[0] * total[1])
73
+ best = total;
74
+ const winners = model.alphabet.filter(v => { const t = totals.get(v); return t[0] * best[1] === best[0] * t[1]; });
75
+ const output = winners.length === 1 ? { kind: 'value', value: winners[0] } : { kind: 'tie', values: winners };
76
+ const key = output.kind === 'tie' ? 'tie' : JSON.stringify(['value', output.value]);
77
+ const fiber = fibers.get(key) ?? { output: output.kind === 'tie' ? { kind: 'tie', values: [] } : output, indices: [] };
78
+ fiber.indices.push(i);
79
+ fibers.set(key, fiber);
80
+ return { id: c.id, probability: pack(prior[i]), mix: output.kind === 'tie' ? { kind: 'tie' } : output,
81
+ fork: model.factors.map((f, j) => ({ factor: f.id, value: c.values[j] })) };
82
+ });
83
+ const outputs = [...fibers.values()].map(f => {
84
+ const mass = f.indices.map(i => prior[i]).reduce(add, zero);
85
+ const posterior = mass[0] === 0n ? [] : f.indices.map(i => ({ configuration: model.configurations[i].id, p: div(prior[i], mass) }));
86
+ return { output: f.output.kind === 'tie' ? { kind: 'tie' } : f.output, probability: pack(mass),
87
+ configurations: f.indices.map(i => model.configurations[i].id),
88
+ posterior: posterior.map(p => ({ configuration: p.configuration, p: pack(p.p) })),
89
+ conditionalBits: mass[0] === 0n ? null : entropy(posterior.map(p => p.p)), mass };
90
+ });
91
+ const configurationBits = entropy(prior), mixBits = entropy(outputs.map(o => o.mass));
92
+ const lossBits = outputs.reduce((sum, o) => sum + (o.conditionalBits === null ? 0 : numeric(o.mass) * o.conditionalBits), 0);
93
+ return { status: 'measured', model: 'declared-weighted-mix-projection@1', parameters,
94
+ prior: { kind: model.prior.kind, probabilities: model.configurations.map((c, i) => ({ configuration: c.id, p: pack(prior[i]) })) },
95
+ policy, unit: 'bits', approximation: 'binary64-log2', configurationBits, mixBits, lossBits,
96
+ entropyDifferenceBits: configurationBits - mixBits, forkLossBits: 0,
97
+ mixInjectiveOnConfigurations: [...fibers.values()].every(f => f.indices.length === 1),
98
+ mixInjectiveOnPositiveSupport: [...fibers.values()].every(f => f.indices.filter(i => prior[i][0] > 0n).length <= 1),
99
+ configurations, outputs: outputs.map(({ mass, ...o }) => o),
100
+ meaning: 'conditional entropy of the declared configuration given its deterministic mix output; named fork is injective' };
101
+ }
@@ -0,0 +1,40 @@
1
+ import type { LogarithmPolicy } from './capacity.ts';
2
+ export type PhaseDefectInterpretation = 'phase-defect' | 'information';
3
+ export declare function phaseDefect(n: number, p: number, s: number, policy: LogarithmPolicy, interpretation?: PhaseDefectInterpretation): {
4
+ model: "F4-integer-phase-defect@1";
5
+ parameters: {
6
+ n: number;
7
+ p: number;
8
+ s: number;
9
+ };
10
+ policy: Readonly<{
11
+ logarithm: "binary64-log2";
12
+ }>;
13
+ status: "measured";
14
+ meaning: "phase defect; information interpretation open";
15
+ regime: "nonnegative" | "may-be-negative";
16
+ value: number;
17
+ };
18
+ export declare function phaseDefectExtrema(n: number, p: number, policy: LogarithmPolicy): {
19
+ model: "F4-integer-phase-defect@1";
20
+ parameters: {
21
+ n: number;
22
+ p: number;
23
+ };
24
+ policy: Readonly<{
25
+ logarithm: "binary64-log2";
26
+ }>;
27
+ status: "measured";
28
+ minimum: {
29
+ value: number;
30
+ shifts: number[];
31
+ };
32
+ maximum: {
33
+ value: number;
34
+ shifts: number[];
35
+ };
36
+ nonzeroMaximum: {
37
+ value: number;
38
+ shifts: number[];
39
+ } | null;
40
+ };
@@ -0,0 +1,33 @@
1
+ const refuse = (cause) => { throw new Error('REFUSE·phase-defect ' + cause); };
2
+ function domain(n, p, policy) {
3
+ if (!Number.isSafeInteger(n) || n < 1 || !Number.isSafeInteger(p) || p < 1 || n % p !== 0)
4
+ refuse('positive integer divisor domain required');
5
+ if (!policy || policy.logarithm !== 'binary64-log2')
6
+ refuse('logarithm policy required');
7
+ }
8
+ function shift(p, s) {
9
+ if (!Number.isSafeInteger(s) || s < 0 || s >= p)
10
+ refuse('integer shift domain required');
11
+ }
12
+ function binaryEntropy(t) {
13
+ return t === 0 || t === 1 ? 0 : -t * Math.log2(t) - (1 - t) * Math.log2(1 - t);
14
+ }
15
+ export function phaseDefect(n, p, s, policy, interpretation = 'phase-defect') {
16
+ domain(n, p, policy);
17
+ shift(p, s);
18
+ if (interpretation !== 'phase-defect')
19
+ refuse('information interpretation unsupported');
20
+ return { model: 'F4-integer-phase-defect@1', parameters: { n, p, s }, policy,
21
+ status: 'measured', meaning: 'phase defect; information interpretation open',
22
+ regime: n / p >= 2 ? 'nonnegative' : 'may-be-negative',
23
+ value: Math.log2(n / p) - binaryEntropy(s / p) };
24
+ }
25
+ export function phaseDefectExtrema(n, p, policy) {
26
+ domain(n, p, policy);
27
+ const middle = Math.floor(p / 2), minimumShifts = p === 1 ? [0] : p % 2 === 0 ? [middle] : [middle, middle + 1];
28
+ return { model: 'F4-integer-phase-defect@1', parameters: { n, p }, policy,
29
+ status: 'measured',
30
+ minimum: { value: Math.log2(n / p) - binaryEntropy(middle / p), shifts: minimumShifts },
31
+ maximum: { value: Math.log2(n / p), shifts: [0] },
32
+ nonzeroMaximum: p === 1 ? null : { value: Math.log2(n / p) - binaryEntropy(1 / p), shifts: p === 2 ? [1] : [1, p - 1] } };
33
+ }
@@ -0,0 +1,79 @@
1
+ import { type DeclaredFailure } from './confidence.ts';
2
+ export declare function tolerantSubsetConfidence(failures: readonly DeclaredFailure[], k: number, probabilitySpace: string): {
3
+ model: "declared-failure-subset-bound@1";
4
+ status: "conditional-bound";
5
+ unit: "probability";
6
+ probabilitySpace: string;
7
+ declarations: {
8
+ id: string;
9
+ p: Readonly<{
10
+ numerator: string;
11
+ denominator: string;
12
+ }>;
13
+ justification: string;
14
+ }[];
15
+ allowedFailures: number;
16
+ totalDeclarations: number;
17
+ conditions: readonly ["common-probability-space", "declared-marginal-upper-bounds"];
18
+ referencesVerified: false;
19
+ terms: {
20
+ id: string;
21
+ subsets: string;
22
+ contribution: Readonly<{
23
+ numerator: string;
24
+ denominator: string;
25
+ }>;
26
+ }[];
27
+ uncappedFailureBound: Readonly<{
28
+ numerator: string;
29
+ denominator: string;
30
+ }>;
31
+ failureUpperBound: Readonly<{
32
+ numerator: string;
33
+ denominator: string;
34
+ }>;
35
+ value: Readonly<{
36
+ numerator: string;
37
+ denominator: string;
38
+ }>;
39
+ trivial: boolean;
40
+ };
41
+ export type JointIndependenceDeclaration = Readonly<{
42
+ probabilitySpace: string;
43
+ jointIndependence: true;
44
+ justification: string;
45
+ }>;
46
+ export declare function independentCountConfidence(failures: readonly DeclaredFailure[], k: number, declaration: JointIndependenceDeclaration): {
47
+ model: "declared-joint-independent-count-bound@1";
48
+ status: "conditional-bound";
49
+ unit: "probability";
50
+ probabilitySpace: string;
51
+ declarations: {
52
+ id: string;
53
+ p: Readonly<{
54
+ numerator: string;
55
+ denominator: string;
56
+ }>;
57
+ justification: string;
58
+ }[];
59
+ allowedFailures: number;
60
+ totalDeclarations: number;
61
+ jointIndependence: {
62
+ declared: true;
63
+ justification: string;
64
+ };
65
+ referencesVerified: false;
66
+ bernoulliEnvelope: Readonly<{
67
+ numerator: string;
68
+ denominator: string;
69
+ }>[];
70
+ failureUpperBound: Readonly<{
71
+ numerator: string;
72
+ denominator: string;
73
+ }>;
74
+ value: Readonly<{
75
+ numerator: string;
76
+ denominator: string;
77
+ }>;
78
+ trivial: boolean;
79
+ };
@@ -0,0 +1,60 @@
1
+ import { unionBoundConfidence } from "./confidence.js";
2
+ import { add, sub, mul, q, rational, zero, one, pack } from "./rational.js";
3
+ const refuse = (cause) => { throw new Error('REFUSE·L7 ' + cause); };
4
+ function inputs(failures, k, probabilitySpace) {
5
+ if (typeof probabilitySpace !== 'string' || probabilitySpace.trim() === '')
6
+ refuse('common-probability-space-required');
7
+ const base = unionBoundConfidence(failures), m = base.declarations.length;
8
+ if (!Number.isSafeInteger(k) || k < 0 || k > m)
9
+ refuse('allowed-failure-count-outside-0..m');
10
+ return { base, m };
11
+ }
12
+ function choose(n, k) {
13
+ if (k > n)
14
+ return 0n;
15
+ let c = 1n;
16
+ for (let j = 1; j <= Math.min(k, n - k); j++)
17
+ c = c * BigInt(n - j + 1) / BigInt(j);
18
+ return c;
19
+ }
20
+ export function tolerantSubsetConfidence(failures, k, probabilitySpace) {
21
+ const { base, m } = inputs(failures, k, probabilitySpace);
22
+ const ordered = base.declarations.map(entry => ({ entry, p: rational(entry.p) })).sort((a, b) => {
23
+ const d = a.p[0] * b.p[1] - b.p[0] * a.p[1];
24
+ return d < 0n ? -1 : d > 0n ? 1 : 0;
25
+ });
26
+ let sum = zero;
27
+ const terms = k === m ? [] : ordered.slice(0, m - k).map(({ entry, p }, j) => {
28
+ const coefficient = choose(m - j - 1, k), contribution = mul(p, q(coefficient));
29
+ sum = add(sum, contribution);
30
+ return { id: entry.id, subsets: String(coefficient), contribution: pack(contribution) };
31
+ });
32
+ const trivial = sum[0] >= sum[1], upper = trivial ? one : sum;
33
+ return { model: 'declared-failure-subset-bound@1', status: 'conditional-bound',
34
+ unit: 'probability', probabilitySpace, declarations: base.declarations,
35
+ allowedFailures: k, totalDeclarations: m, conditions: ['common-probability-space', 'declared-marginal-upper-bounds'],
36
+ referencesVerified: false, terms, uncappedFailureBound: pack(sum), failureUpperBound: pack(upper),
37
+ value: pack(sub(one, upper)), trivial };
38
+ }
39
+ export function independentCountConfidence(failures, k, declaration) {
40
+ if (!declaration || declaration.jointIndependence !== true)
41
+ refuse('joint-independence-required');
42
+ if (typeof declaration.justification !== 'string' || declaration.justification.trim() === '')
43
+ refuse('joint-independence-justification-required');
44
+ const { base, m } = inputs(failures, k, declaration.probabilitySpace);
45
+ let distribution = [one];
46
+ for (const entry of base.declarations) {
47
+ const p = rational(entry.p), next = Array.from({ length: distribution.length + 1 }, () => zero);
48
+ for (let j = 0; j < distribution.length; j++) {
49
+ next[j] = add(next[j], mul(distribution[j], sub(one, p)));
50
+ next[j + 1] = add(next[j + 1], mul(distribution[j], p));
51
+ }
52
+ distribution = next;
53
+ }
54
+ const upper = distribution.slice(k + 1).reduce(add, zero);
55
+ return { model: 'declared-joint-independent-count-bound@1', status: 'conditional-bound',
56
+ unit: 'probability', probabilitySpace: declaration.probabilitySpace, declarations: base.declarations,
57
+ allowedFailures: k, totalDeclarations: m, jointIndependence: { declared: true, justification: declaration.justification },
58
+ referencesVerified: false, bernoulliEnvelope: distribution.map(pack), failureUpperBound: pack(upper),
59
+ value: pack(sub(one, upper)), trivial: upper[0] === upper[1] };
60
+ }
package/docs/measures.md CHANGED
@@ -211,3 +211,27 @@ These operations compute conditional probability bounds. They select neither a g
211
211
  At n=4,c=1,q=1/4 the bound is exactly zero; q=0 gives log2(4/3), and q=1 gives two bits. Missing q refuses. The operational declaration or detection of activation remains open in identification.model. Unconditioned coincidence does not identify q.
212
212
 
213
213
  M/3 and M/4 retain their existing definitions. Partial-factor governance proposals do not supply a conditional joint observation and selection law. The information carried by dissent, including a bottom symbol, is open for those unspecified proposals.
214
+
215
+ ## Obligations 0.4.3 — proposed conditional measures
216
+
217
+ L7: conditional bound on one declared common probability space: P(N>k)<=min(1,sum over |S|=k+1 of min p_i), with rational declared marginal failure upper bounds and 0<=k<=m. Trivial iff computed upper bound is one. Counterexamples refute the former top-k+1 success guarantee. Joint-independent Bernoulli convolution is a separate declared hypothesis; rho=0 and pairwise independence do not supply it. Existing stronger 0.4.2 count bound is unchanged and needs no joint independence.
218
+
219
+ L8: law by enumeration only for 3<=n<=64, positive integer divisors p|n and integer 0<=s<p. D=log2(n/p)-h(s/p), explicit binary64-log2 approximation. Odd-period minimum uses h(floor(p/2)/p), even-period minimum uses one. Complete maximum at zero; nonzero domain has endpoints 1,p-1, empty when p=1. No information or worst-case interpretation follows from nonnegativity. T87 retains its separate wrapped-phase amplitude identity.
220
+
221
+ L9: law by counterexample of existence of noninjective weighted mix, and measure with a declared prior on a finite explicitly supplied set of named-factor configurations. Equal-weight ab and ba give the same bottom tie and different named forks. Loss is H(configuration | mix)=H(configuration)-H(mix); a uniform prior must be explicitly selected, absent prior is unmeasured. The four-state uniform example has mean loss 0.5 bits and one bit conditioned on tie; the injective named fork has zero loss. Defines no new algebraic act, governance selection, M/3 or M/4 law, or destroyed field.
222
+
223
+ ## Lineage and delivery: distinct scopes
224
+
225
+ For n>=2, uniform truth X, the declared n-ary symmetric channel X->Z with crossover probability c in [0,1], and X->Z->reports->aggregate A,
226
+
227
+ ```text
228
+ H(X|Z) = h2(c) + c*log2(n-1) >= h2(c)
229
+ H(X|A) >= H(X|Z)
230
+ I(X;A) <= log2(n) - h2(c) - c*log2(n-1)
231
+ ```
232
+
233
+ Here h2 is binary entropy, with 0*log2(0)=0. The uncertainty floor and information ceiling follow from this symmetric-channel equality and the declared Markov bottleneck. The reports and aggregation have no additional access to truth or a revealed error/cause indicator. This reuses capacityP0; it neither replaces capacityBound nor changes M/3 or M/4. An error rate alone, an asymmetric channel or the existing private-error model does not establish this ceiling. The distinguishing counterexamples and relation to F1 are in [the conditional lineage contract](../proofs/lineage-ceiling.json).
234
+
235
+ The parameter c denotes the mixture activation or channel crossover specified by the selected model. It is not identified from unanimity without that model, and no equality with the genetic inbreeding coefficient F is asserted. No genetic law follows here.
236
+
237
+ Cell vacuity is a property of a region under the algebra. Delivery asks whether the bytes named by a digest are available and match it. A vacuous cell neither certifies delivery nor proves that a delivered package is admissible. The relation between these predicates remains the named vacuity-versus-delivery tension.
package/docs/paper.md CHANGED
@@ -63,7 +63,7 @@ claims that meet outside the bounds FORBIDDEN ✕
63
63
  | D7-fork | definition | lattice | A2-meet | two incomparable bounds on one cell from two signers; rendered with both, closed only by a signature | | none | derived by the reader | not a derivation |
64
64
  | D8-present | definition | field | A4-epoch, A3-resolution | the present is the meet of overlapping observation bands; there is no instant to certify | | [yes](../samples/yes/D8-present.json) | derived by the reader | not a derivation |
65
65
  | D9-yield | definition | valuation | A5-origin-is-extension, D4-debit-in-bits | an origin's yield is bits it closed minus bits reopened against it, per act, over an epoch | | [yes](../samples/yes/D9-yield.json) | derived by the reader | not a derivation |
66
- | H1-uncertainty | conjecture | chain | A3-resolution, A1-encounter | resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates | | [yes](../samples/yes/H1-uncertainty.json) | The falsifier: a cell read at four resolutions whose product of resolution and independent encounters comes out above the floor while the encounters fall away with the sharpening. A product that rises as the reading sharpens would say the floor is not a floor but an accident of how coarsely the cell was read. | not a derivation |
66
+ | H1-uncertainty | conjecture | chain | A3-resolution, A1-encounter | resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates | | [yes](../samples/yes/H1-uncertainty.json) | The falsifier: after declaring a counting model, population, units and a fixed positive floor c before observing the sample, an admissible cell whose resolution times encounters per cell falls below c. A rising product does not refute a lower bound. A decrease refutes monotonicity and an exceedance refutes an upper bound only under their separately declared contracts. H1 remains open without the counting/refinement model and fixed parameters; the increasing sample is an experiment, not a universal bound. | not a derivation |
67
67
  | H10-the-period-is-a-line-of-the-region | conjecture | field | T48-epoch-is-phase, T87-the-quarter-turn | the period a phase is read against, the one T48 and T87 turn on, is a line of the region and never a fact of the instrument: a concert, a match and a sensor-s cadence each define theirs, and two heads that read one region with its period agree on its coherence with no clock between them; structural resemblance, one origin, not a claim about the world | | [yes](../samples/yes/H10-the-period-is-a-line-of-the-region.json) | The falsifier: two heads that read one region, each with the period of its own clock, and agree on its coherence. A period each instrument brought would be the instrument's, and the heads would need a clock between them to agree. | not a derivation |
68
68
  | H2-density-attracts | conjecture | field | A1-encounter, A6-vacuity | where reading already is, the next reading lands: over eight epochs of placement in proportion to the origins a cell already carries, the ratio between the densest tenth and the sparsest rises at every epoch and the deserts stay empty, while the same budget placed blind to density holds that ratio near two and touches three times as many cells | | [yes](../samples/yes/H2-density-attracts.json) | The falsifier: encounters that land independently of the density already there. Then the ratio does not rise with the epochs and the cells touched grow with the budget, which is what the blind placement in the yes sample shows. | not a derivation |
69
69
  | H3-a-distant-signature-moves-a-cell-that-did-not-move | conjecture | lattice | T46-a-bound-moves-cells-no-walk-reaches, T47-a-two-pole-object | stated as a hint and never as a claim about the world: if what is is a field of floors and ceilings, a distant signature changes a cell whose own record never moved, and in two hundred trials of one cell holding one value the verdict came out both ways, so nothing stored at the cell explains the difference and what explains it is the bound the cell rests on; the resemblance is structural and never arithmetic, with no continuous amplitudes and no inequality violated by number; structural resemblance, one origin, not a claim about the world | | [yes](../samples/yes/H3-a-distant-signature-moves-a-cell-that-did-not-move.json) | The falsifier: one act that is both local and non-local — a change that travels a distance and also reaches a cell that does not rest on its bound. The two poles would then be one, and this would be a claim about the world rather than a hint. | not a derivation |
@@ -191,7 +191,7 @@ Five readings:
191
191
 
192
192
  <details><summary>Every conjecture in full</summary>
193
193
 
194
- Resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates. The falsifier: a cell read at four resolutions whose product of resolution and independent encounters comes out above the floor while the encounters fall away with the sharpening. A product that rises as the reading sharpens would say the floor is not a floor but an accident of how coarsely the cell was read.
194
+ Resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates. The falsifier: after declaring a counting model, population, units and a fixed positive floor c before observing the sample, an admissible cell whose resolution times encounters per cell falls below c. A rising product does not refute a lower bound. A decrease refutes monotonicity and an exceedance refutes an upper bound only under their separately declared contracts. H1 remains open without the counting/refinement model and fixed parameters; the increasing sample is an experiment, not a universal bound.
195
195
 
196
196
  Where reading already is, the next reading lands: over eight epochs of placement in proportion to the origins a cell already carries, the ratio between the densest tenth and the sparsest rises at every epoch and the deserts stay empty, while the same budget placed blind to density holds that ratio near two and touches three times as many cells. The falsifier: encounters that land independently of the density already there. Then the ratio does not rise with the epochs and the cells touched grow with the budget, which is what the blind placement in the yes sample shows.
197
197
 
package/docs/reference.md CHANGED
@@ -361,7 +361,7 @@ flowchart BT
361
361
  | D7-fork | definition | lattice | A2-meet | two incomparable bounds on one cell from two signers; rendered with both, closed only by a signature | | none | derived by the reader | not a derivation |
362
362
  | D8-present | definition | field | A4-epoch, A3-resolution | the present is the meet of overlapping observation bands; there is no instant to certify | | [yes](../samples/yes/D8-present.json) | derived by the reader | not a derivation |
363
363
  | D9-yield | definition | valuation | A5-origin-is-extension, D4-debit-in-bits | an origin's yield is bits it closed minus bits reopened against it, per act, over an epoch | | [yes](../samples/yes/D9-yield.json) | derived by the reader | not a derivation |
364
- | H1-uncertainty | conjecture | chain | A3-resolution, A1-encounter | resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates | | [yes](../samples/yes/H1-uncertainty.json) | The falsifier: a cell read at four resolutions whose product of resolution and independent encounters comes out above the floor while the encounters fall away with the sharpening. A product that rises as the reading sharpens would say the floor is not a floor but an accident of how coarsely the cell was read. | not a derivation |
364
+ | H1-uncertainty | conjecture | chain | A3-resolution, A1-encounter | resolution times independent encounters per cell stays above a floor c; the sufficient resolution is where the product saturates | | [yes](../samples/yes/H1-uncertainty.json) | The falsifier: after declaring a counting model, population, units and a fixed positive floor c before observing the sample, an admissible cell whose resolution times encounters per cell falls below c. A rising product does not refute a lower bound. A decrease refutes monotonicity and an exceedance refutes an upper bound only under their separately declared contracts. H1 remains open without the counting/refinement model and fixed parameters; the increasing sample is an experiment, not a universal bound. | not a derivation |
365
365
  | H10-the-period-is-a-line-of-the-region | conjecture | field | T48-epoch-is-phase, T87-the-quarter-turn | the period a phase is read against, the one T48 and T87 turn on, is a line of the region and never a fact of the instrument: a concert, a match and a sensor-s cadence each define theirs, and two heads that read one region with its period agree on its coherence with no clock between them; structural resemblance, one origin, not a claim about the world | | [yes](../samples/yes/H10-the-period-is-a-line-of-the-region.json) | The falsifier: two heads that read one region, each with the period of its own clock, and agree on its coherence. A period each instrument brought would be the instrument's, and the heads would need a clock between them to agree. | not a derivation |
366
366
  | H2-density-attracts | conjecture | field | A1-encounter, A6-vacuity | where reading already is, the next reading lands: over eight epochs of placement in proportion to the origins a cell already carries, the ratio between the densest tenth and the sparsest rises at every epoch and the deserts stay empty, while the same budget placed blind to density holds that ratio near two and touches three times as many cells | | [yes](../samples/yes/H2-density-attracts.json) | The falsifier: encounters that land independently of the density already there. Then the ratio does not rise with the epochs and the cells touched grow with the budget, which is what the blind placement in the yes sample shows. | not a derivation |
367
367
  | H3-a-distant-signature-moves-a-cell-that-did-not-move | conjecture | lattice | T46-a-bound-moves-cells-no-walk-reaches, T47-a-two-pole-object | stated as a hint and never as a claim about the world: if what is is a field of floors and ceilings, a distant signature changes a cell whose own record never moved, and in two hundred trials of one cell holding one value the verdict came out both ways, so nothing stored at the cell explains the difference and what explains it is the bound the cell rests on; the resemblance is structural and never arithmetic, with no continuous amplitudes and no inequality violated by number; structural resemblance, one origin, not a claim about the world | | [yes](../samples/yes/H3-a-distant-signature-moves-a-cell-that-did-not-move.json) | The falsifier: one act that is both local and non-local — a change that travels a distance and also reaches a cell that does not rest on its bound. The two poles would then be one, and this would be a claim about the world rather than a hint. | not a derivation |
@@ -493,3 +493,8 @@ flowchart BT
493
493
  | (o, φ) | Origin |
494
494
  | s | Act |
495
495
  | state | State |
496
+
497
+
498
+ ## Executable Lean evidence
499
+
500
+ The Lean proof reading executes the declared compiler against handed source bytes after image preparation. Its input identity includes all Lean sources, lean-toolchain, lakefile.toml, lake-manifest.json, both policy vectors and the selected reader implementation. It checks the compiler version/commit and every dependency revision and tracked worktree. A successful receipt means the declared 16 theorem audits and both negative causes passed. No dependencies are installed inside the reading. Native read/open counters distinguish execution from verified reuse. This proof place is separate from npm consumption: consumers verify portable historical readings without installing Lean. Compiler and cache preparation is reported separately, never charged to an existing proof-reader ceiling. Native reading uses the existing 25-second global limit, with the existing 65536-byte capture boundary. Changes to declared inputs reopen the reading; no prose claim closes it.
package/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"@lapxo/obligations","version":"0.4.2","description":"The algebra of a cell: two poles, origins with phase, eight acts.","type":"module","license":"MIT","author":"Lapxo","repository":{"type":"git","url":"git+https://github.com/Lapxo/obligations.git"},"keywords":["obligations","lattice","provenance"],"sideEffects":false,"engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/lattice/index.d.ts","default":"./dist/lattice/index.js"},"./debit":{"types":"./dist/debit/debit.d.ts","default":"./dist/debit/debit.js"},"./encounter":{"types":"./dist/field/encounter.d.ts","default":"./dist/field/encounter.js"},"./field":{"types":"./dist/field/field.d.ts","default":"./dist/field/field.js"},"./forms":{"types":"./dist/lattice/forms.d.ts","default":"./dist/lattice/forms.js"},"./lattice":{"types":"./dist/lattice/lattice.d.ts","default":"./dist/lattice/lattice.js"},"./measures":{"types":"./dist/measures/index.d.ts","default":"./dist/measures/index.js"},"./packed":{"types":"./dist/debit/packed.d.ts","default":"./dist/debit/packed.js"},"./present":{"types":"./dist/field/present.d.ts","default":"./dist/field/present.js"},"./price":{"types":"./dist/lattice/price/index.d.ts","default":"./dist/lattice/price/index.js"},"./replay":{"types":"./dist/replay.d.ts","default":"./dist/replay.js"},"./shuffle":{"types":"./dist/debit/shuffle.d.ts","default":"./dist/debit/shuffle.js"},"./signatures":{"types":"./dist/field/signatures.d.ts","default":"./dist/field/signatures.js"},"./views/field":{"types":"./dist/views/field.d.ts","default":"./dist/views/field.js"},"./views/product":{"types":"./dist/views/product.d.ts","default":"./dist/views/product.js"},"./package.json":"./package.json"},"files":["dist","README.md","LICENSE","TARGET.bound","receipts.bound","docs/measures.md","samples/measures","vectors/measures","samples/yes/algebra-is-closed.json","samples/yes/field-uses-price-and-debit.json","samples/yes/three-theories-one-algebra.json","src/lattice/index.ts","src/field/motion.ts","samples/yes/installed-artifact.json","samples/no/installed-artifact.json","vectors/measures/installed-artifact.cli.json","docs/img","docs/paper.md","docs/reference.md","docs/learn/in-phase.md","docs/learn/price.md","docs/learn/signature.md","docs/learn/thermometer.md","docs/learn/withdrawal.md"],"scripts":{"build":"tsc --build","test":"node --import ./test/setup.ts --test --test-concurrency=2 test/*.test.ts test/measures/*.test.ts"},"devDependencies":{"@types/node":"^22","typescript":"^5.9.3"}}
1
+ {"name":"@lapxo/obligations","version":"0.4.4","description":"The algebra of a cell: two poles, origins with phase, eight acts.","type":"module","license":"MIT","author":"Lapxo","repository":{"type":"git","url":"git+https://github.com/Lapxo/obligations.git"},"keywords":["obligations","lattice","provenance"],"sideEffects":false,"engines":{"node":">=22.12"},"exports":{".":{"types":"./dist/lattice/index.d.ts","default":"./dist/lattice/index.js"},"./debit":{"types":"./dist/debit/debit.d.ts","default":"./dist/debit/debit.js"},"./encounter":{"types":"./dist/field/encounter.d.ts","default":"./dist/field/encounter.js"},"./field":{"types":"./dist/field/field.d.ts","default":"./dist/field/field.js"},"./forms":{"types":"./dist/lattice/forms.d.ts","default":"./dist/lattice/forms.js"},"./lattice":{"types":"./dist/lattice/lattice.d.ts","default":"./dist/lattice/lattice.js"},"./measures":{"types":"./dist/measures/index.d.ts","default":"./dist/measures/index.js"},"./packed":{"types":"./dist/debit/packed.d.ts","default":"./dist/debit/packed.js"},"./present":{"types":"./dist/field/present.d.ts","default":"./dist/field/present.js"},"./price":{"types":"./dist/lattice/price/index.d.ts","default":"./dist/lattice/price/index.js"},"./replay":{"types":"./dist/replay.d.ts","default":"./dist/replay.js"},"./shuffle":{"types":"./dist/debit/shuffle.d.ts","default":"./dist/debit/shuffle.js"},"./signatures":{"types":"./dist/field/signatures.d.ts","default":"./dist/field/signatures.js"},"./views/field":{"types":"./dist/views/field.d.ts","default":"./dist/views/field.js"},"./views/product":{"types":"./dist/views/product.d.ts","default":"./dist/views/product.js"},"./package.json":"./package.json"},"files":["dist","README.md","LICENSE","TARGET.bound","receipts.bound","docs/measures.md","samples/measures","vectors/measures","samples/yes/algebra-is-closed.json","samples/yes/field-uses-price-and-debit.json","samples/yes/three-theories-one-algebra.json","src/lattice/index.ts","src/field/motion.ts","samples/yes/installed-artifact.json","samples/no/installed-artifact.json","vectors/measures/installed-artifact.cli.json","docs/img","docs/paper.md","docs/reference.md","docs/learn/in-phase.md","docs/learn/price.md","docs/learn/signature.md","docs/learn/thermometer.md","docs/learn/withdrawal.md","vectors/laws/policy.json","vectors/laws/l7-tolerant-k.json","vectors/laws/l8-phase-defect.json","vectors/laws/l9-mix-loss.json","vectors/laws/implementation-043.json","samples/laws/cofailure-pairs/no/sample.json","samples/laws/cofailure-pairs/yes/sample.json","samples/laws/linage-rest/no/sample.json","samples/laws/linage-rest/yes/sample.json","samples/laws/lineage-ceiling/no/sample.json","samples/laws/lineage-ceiling/yes/sample.json","samples/laws/marginal-information/no/sample.json","samples/laws/marginal-information/yes/sample.json","samples/laws/semilattice/no/sample.json","samples/laws/semilattice/yes/sample.json","vectors/laws/cofailure-pairs.json","vectors/laws/cofailure-pairs.native.json","vectors/laws/coordination.json","vectors/laws/f1/finite-arithmetic.json","vectors/laws/f1/path-witness.json","vectors/laws/helly-comb.json","vectors/laws/helly-comb.lean.json","vectors/laws/linage-rest.native.json","vectors/laws/lineage-ceiling.json","vectors/laws/lineage-ceiling.native.json","vectors/laws/marginal-information.json","vectors/laws/marginal-information.native.json","vectors/laws/meet-semilattice.json","vectors/laws/meet-semilattice.native.json","vectors/laws/resolution-encounters.json","proofs/lineage-ceiling.json","proofs/cofailure-pairs.json","proofs/marginal-information.json","proofs/helly-comb.json","proofs/resolution-encounters.json","proofs/coordination.json","proofs/lean/Obligations/Cell.lean","proofs/lean/Obligations/HellyComb.lean","samples/yes/H1-uncertainty.json","samples/no/H1-uncertainty.json","vectors/laws/f1/path-witness.json","vectors/laws/f1/finite-arithmetic.json"],"scripts":{"build":"tsc --build","test":"node --import ./test/setup.ts --test --test-concurrency=2 test/*.test.ts test/measures/*.test.ts"},"devDependencies":{"@types/node":"^22","typescript":"^5.9.3"}}
@@ -0,0 +1,26 @@
1
+ {
2
+ "id":"cofailure-pairs/two-declared-observables",
3
+ "classification":"two descriptive measures with declared models; finite counterexamples, not a law identifying causes",
4
+ "oracle":{"score":"number of complete cells with Y_i=Y_j!=truth divided by declared T","reference":"Published coincidenceExcess supplies this pair rate and its independent-uniform-wrong baseline, with handed or truth-estimated error marginals. The graph uses the raw false rate, not the excess.","thetaUnit":"false-coincidence probability"},
5
+ "withoutTruth":{"score":"number of complete cells with Y_i=Y_j divided by T, minus sum_v q_i(v)*q_j(v)","reference":"independent-categorical@1 with fixed, normalized, handed per-origin categorical marginals over the named alphabet. No truth or estimated error marginal is read.","thetaUnit":"excess probability, in [-1,1]","absentReference":"unmeasured; never silently estimate a null from this batch","Head":"This is the candidate observable available without truth; no Head or Bound change is made, and no causal interpretation is supplied."},
6
+ "existingBoundary":"The published coincidenceExcess itself requires truth. Its no-truth reading stays unmeasured. This candidate is a different observable, not a relabel of that API.",
7
+ "frame":"T and theta are explicit and mandatory: absence is unmeasured. T counts distinct complete selected events. Missing cells are unmeasured; identical redelivery is idempotent; conflicting event/origin values refuse by name. Budget is checked before indexing rows.",
8
+ "graph":"An edge is score>theta. Connected components are a descriptive projection; a path of above-threshold edges does not establish a common cause or a clique.",
9
+ "populationRecovery":"For a handed target partition, require max score_outside < theta < min score_inside over every pair. A threshold between the two means is insufficient. The partition itself and population scores are not inferred by this rule.",
10
+ "finiteUncertainty":{
11
+ "sampling":"Optional iid-cells@1, with epsilon in (0,1], fixed frame, selected origins, epsilon and (for the non-oracle observable) null marginals fixed before observing the batch. The caller supplies these premises; the instrument does not verify them.",
12
+ "chain":["For each pair's Bernoulli event, Var(mean)<=1/(4T) under the declared independent cells.","Chebyshev gives P(|observed-population|>=epsilon)<=min(1,1/(4*T*epsilon^2)). Subtracting a fixed handed baseline preserves the deviation.","The existing unionBoundConfidence combines these failures for all M=m(m-1)/2 pairs; no independence between pairs is required.","Exact rational intervals score+-epsilon are clipped to their probability support. Resolve an edge only if the whole interval is strictly above or below theta. Unresolved intervals and trivial bounds stay visible.","This bounds simultaneous threshold decisions under the handed model. Causal recovery requires the separate population partition and strict gap premises."],
13
+ "arithmetic":"rational, no logarithmic or directed-rounding approximation; conservative Chebyshev bound, not an optimal interval",
14
+ "reference":"https://theory.stanford.edu/~blynn/pr/markov.html"
15
+ },
16
+ "counterexamples":[
17
+ {"id":"truth-relabel","claimRefuted":"the no-truth statistic identifies which coincidences are wrong","witness":"Identical response rows, truth all zero versus truth copied from a: observational output is unchanged but oracle edges differ."},
18
+ {"id":"shared-question","claimRefuted":"positive categorical excess proves shared error lineage","witness":"All sources answer a balanced binary question correctly. Oracle false rate is zero; a handed marginal 1/2 reference gives observed agreement 1 and excess 1/2. Conditional errors are degenerate zero, while the shared question drives unconditional agreement."},
19
+ {"id":"between-means","claimRefuted":"threshold between mean within and outside rates suffices","witness":"Within rates 0.8 and 0.2; outside 0.21,0.21,0,0. Theta=0.15 lies between means 0.5 and 0.105 but merges the handed groups; max outside exceeds min inside."},
20
+ {"id":"c-e-finite-confusion","claimRefuted":"finite exact subgroup recovery whenever shared c is comparable to private e","witness":"With c=e=1/4, the all-correct T=4 batch has probability [(3/4)^5]^4>0; it has no above-threshold oracle edges. Its confidence bound is trivial, not a certificate of no common factor."}
21
+ ],
22
+ "alreadyKnown":"Cooccurrence relative to a declared null, Chebyshev concentration and union bounds are standard. The published package already has truth-conditioned coincidenceExcess and exact unionBoundConfidence.",
23
+ "addsHere":"The oracle-free observable and its explicit null, pair graph with threshold units, and model-separating fixtures. No c is identified, no M/3-M/4 hypothesis changes, and no algebraic act or wire field is introduced.",
24
+ "publication":"new candidate module only; existing signed public exports, TARGET, receipts and derived docs remain unchanged",
25
+ "open":["Choice of an adequate observable-context reference for Head; this marginal null can be confounded by shared questions.","No causal subgroup identification from these statistics alone.","No iid certificate, population-margin estimate, or guarantee without the declared sampling premises."]
26
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "coordination@1",
3
+ "policy": "vectors/laws/policy.json",
4
+ "classification": "measure with declared conditional model and exact finite enumeration",
5
+ "statement": "For all L selected sources under a shared activation of probability f, active outputs equal one named wrong value. Otherwise source errors are jointly independent conditional on truth with rate e, uniform among n-1 wrong labels. Then U_L=f+(1-f)*((1-e)^L+e^L/(n-1)^(L-1)), and wrong unanimity W_L=f+(1-f)*e^L/(n-1)^(L-1).",
6
+ "hypotheses": [
7
+ "n>=2, L>=1, declared f and e, fixed truth for wrong-label enumeration; symmetry permits uniform truth extension.",
8
+ "Activation affects every selected source, no other unmodeled activation or observation channel.",
9
+ "Joint conditional independence is a model declaration for inactive draws, not inferred from pairwise statistics.",
10
+ "If n>2 and 0<e<=1, or n=2 and 0<e<1, both private unanimity terms tend to zero, giving limit f; finite values generally exceed f."
11
+ ],
12
+ "existing": "U_L is exactly the published fitUnanimityModel single-dominant-factor curve, not a new algebraic law or identification method.",
13
+ "adds": "Explicit equivalence of scheduled coordinated outputs and a shared-cause output distribution under this specified mixture, exact small-L enumeration, wrong-unanimity distinction and named invalid readings.",
14
+ "nonIdentification": "The activation schedule is itself a common variable in the joint distribution. No inference about a shared physical process, intent or causal origin follows from the same curve; c_total is a compatible model parameter, not model-free truth.",
15
+ "negative": [
16
+ "At e=0 all outputs are unanimously correct when inactive: U_L=1 for every L, so U does not identify f. W_L still equals f.",
17
+ "Two disjoint groups independently activated at rate f/2 do not obey the all-source single-activation curve with mass f.",
18
+ "Marginal error rate e without joint conditional independence does not determine private unanimity; n=2, e=1/2, identical private errors give U=1 while iid predicts 2^(1-L)."
19
+ ],
20
+ "status": "declared-model measure; finite vectors, no causal identification",
21
+ "unmeasured": "Missing joint-independence declaration refuses curve interpretation by name; unknown mechanism remains unmeasured.",
22
+ "references": [
23
+ "https://www.stat.berkeley.edu/~aldous/206-Exch/"
24
+ ],
25
+ "signatures": 0,
26
+ "admission": false
27
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "id": "helly-comb@1",
3
+ "policy": "vectors/laws/policy.json",
4
+ "classification": "law by finite counterexample, Lean kernel checked",
5
+ "statement": "Pairwise intersection does not imply joint intersection for arbitrary finite nonconvex subsets (combs).",
6
+ "domain": "Finite carrier {0,1,2}; A={0,1}, B={1,2}, C={0,2}. Witnesses AB=1, AC=0, BC=2; ABC empty.",
7
+ "hypotheses": "No convexity/interval assumption. C has a hole. Does not refute the interval-only T38.",
8
+ "negative": "Reject promoting pairwise compatibility of these combs to a global witness.",
9
+ "existing": "Classical Helly theory needs convexity; finite intervals on a line are 2-Helly. The elementary nonconvex counterexample is not a new discovery.",
10
+ "adds": "Exact finite subset witness and compiled Lean certificate tied to Obligations candidate bytes; no new form or wire encoding.",
11
+ "references": [
12
+ "https://www.math.ucdavis.edu/~deloera/TEACHING/MATH114/convexitythy.pdf"
13
+ ],
14
+ "status": "finite witness checked; no generalized theorem",
15
+ "signatures": 0,
16
+ "admission": false
17
+ }