@izagood/avcs 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +221 -0
- package/dist/api/repo.d.ts +616 -0
- package/dist/api/repo.d.ts.map +1 -0
- package/dist/api/repo.js +1772 -0
- package/dist/api/repo.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +660 -0
- package/dist/cli.js.map +1 -0
- package/dist/concurrency/lease.d.ts +27 -0
- package/dist/concurrency/lease.d.ts.map +1 -0
- package/dist/concurrency/lease.js +63 -0
- package/dist/concurrency/lease.js.map +1 -0
- package/dist/core/canonical.d.ts +16 -0
- package/dist/core/canonical.d.ts.map +1 -0
- package/dist/core/canonical.js +66 -0
- package/dist/core/canonical.js.map +1 -0
- package/dist/core/cbor.d.ts +9 -0
- package/dist/core/cbor.d.ts.map +1 -0
- package/dist/core/cbor.js +213 -0
- package/dist/core/cbor.js.map +1 -0
- package/dist/core/clock.d.ts +18 -0
- package/dist/core/clock.d.ts.map +1 -0
- package/dist/core/clock.js +32 -0
- package/dist/core/clock.js.map +1 -0
- package/dist/core/identity.d.ts +34 -0
- package/dist/core/identity.d.ts.map +1 -0
- package/dist/core/identity.js +62 -0
- package/dist/core/identity.js.map +1 -0
- package/dist/hub/hubClient.d.ts +38 -0
- package/dist/hub/hubClient.d.ts.map +1 -0
- package/dist/hub/hubClient.js +157 -0
- package/dist/hub/hubClient.js.map +1 -0
- package/dist/hub/hubServer.d.ts +28 -0
- package/dist/hub/hubServer.d.ts.map +1 -0
- package/dist/hub/hubServer.js +365 -0
- package/dist/hub/hubServer.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/objects/types.d.ts +352 -0
- package/dist/objects/types.d.ts.map +1 -0
- package/dist/objects/types.js +17 -0
- package/dist/objects/types.js.map +1 -0
- package/dist/observe/logger.d.ts +27 -0
- package/dist/observe/logger.d.ts.map +1 -0
- package/dist/observe/logger.js +37 -0
- package/dist/observe/logger.js.map +1 -0
- package/dist/observe/metrics.d.ts +20 -0
- package/dist/observe/metrics.d.ts.map +1 -0
- package/dist/observe/metrics.js +42 -0
- package/dist/observe/metrics.js.map +1 -0
- package/dist/policy/owners.d.ts +5 -0
- package/dist/policy/owners.d.ts.map +1 -0
- package/dist/policy/owners.js +38 -0
- package/dist/policy/owners.js.map +1 -0
- package/dist/policy/reliability.d.ts +7 -0
- package/dist/policy/reliability.d.ts.map +1 -0
- package/dist/policy/reliability.js +41 -0
- package/dist/policy/reliability.js.map +1 -0
- package/dist/query/diff.d.ts +16 -0
- package/dist/query/diff.d.ts.map +1 -0
- package/dist/query/diff.js +32 -0
- package/dist/query/diff.js.map +1 -0
- package/dist/reducer/incremental.d.ts +2 -0
- package/dist/reducer/incremental.d.ts.map +1 -0
- package/dist/reducer/incremental.js +14 -0
- package/dist/reducer/incremental.js.map +1 -0
- package/dist/reducer/policy.d.ts +17 -0
- package/dist/reducer/policy.d.ts.map +1 -0
- package/dist/reducer/policy.js +143 -0
- package/dist/reducer/policy.js.map +1 -0
- package/dist/reducer/reducer.d.ts +155 -0
- package/dist/reducer/reducer.d.ts.map +1 -0
- package/dist/reducer/reducer.js +849 -0
- package/dist/reducer/reducer.js.map +1 -0
- package/dist/release/sbom.d.ts +7 -0
- package/dist/release/sbom.d.ts.map +1 -0
- package/dist/release/sbom.js +26 -0
- package/dist/release/sbom.js.map +1 -0
- package/dist/semantic/contract.d.ts +32 -0
- package/dist/semantic/contract.d.ts.map +1 -0
- package/dist/semantic/contract.js +150 -0
- package/dist/semantic/contract.js.map +1 -0
- package/dist/semantic/symbols.d.ts +45 -0
- package/dist/semantic/symbols.d.ts.map +1 -0
- package/dist/semantic/symbols.js +323 -0
- package/dist/semantic/symbols.js.map +1 -0
- package/dist/store/applyRedactions.d.ts +16 -0
- package/dist/store/applyRedactions.d.ts.map +1 -0
- package/dist/store/applyRedactions.js +60 -0
- package/dist/store/applyRedactions.js.map +1 -0
- package/dist/store/lock.d.ts +12 -0
- package/dist/store/lock.d.ts.map +1 -0
- package/dist/store/lock.js +63 -0
- package/dist/store/lock.js.map +1 -0
- package/dist/store/objectStore.d.ts +127 -0
- package/dist/store/objectStore.d.ts.map +1 -0
- package/dist/store/objectStore.js +549 -0
- package/dist/store/objectStore.js.map +1 -0
- package/dist/validation/repair.d.ts +31 -0
- package/dist/validation/repair.d.ts.map +1 -0
- package/dist/validation/repair.js +37 -0
- package/dist/validation/repair.js.map +1 -0
- package/dist/validation/runner.d.ts +20 -0
- package/dist/validation/runner.d.ts.map +1 -0
- package/dist/validation/runner.js +90 -0
- package/dist/validation/runner.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReductionResult } from "../reducer/reducer.ts";
|
|
2
|
+
export interface TreeDiff {
|
|
3
|
+
added: string[];
|
|
4
|
+
removed: string[];
|
|
5
|
+
modified: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function diffTrees(a: ReductionResult, b: ReductionResult): TreeDiff;
|
|
8
|
+
export interface OpSetDiff {
|
|
9
|
+
/** Accepted in b but not a. */
|
|
10
|
+
added: string[];
|
|
11
|
+
/** Accepted in a but not b. */
|
|
12
|
+
removed: string[];
|
|
13
|
+
}
|
|
14
|
+
/** Symmetric difference of the accepted operation sets of two reductions. */
|
|
15
|
+
export declare function diffAcceptedOps(a: ReductionResult, b: ReductionResult): OpSetDiff;
|
|
16
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/query/diff.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,QAAQ,CAU1E;AAED,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,GAAG,SAAS,CASjF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// Phase 10: diffing two materialized states.
|
|
2
|
+
//
|
|
3
|
+
// Tree entries are content-addressed (put_file blob oids and synth oids are both
|
|
4
|
+
// content-derived), so a path whose oid is unchanged is unchanged — diffing is just
|
|
5
|
+
// a map comparison. The AVCS-only axis is a *policy diff*: reduce the same ops under
|
|
6
|
+
// two policies and diff the trees to see what the policy change alone did.
|
|
7
|
+
export function diffTrees(a, b) {
|
|
8
|
+
const added = [];
|
|
9
|
+
const removed = [];
|
|
10
|
+
const modified = [];
|
|
11
|
+
for (const [path, oid] of b.tree) {
|
|
12
|
+
if (!a.tree.has(path))
|
|
13
|
+
added.push(path);
|
|
14
|
+
else if (a.tree.get(path) !== oid)
|
|
15
|
+
modified.push(path);
|
|
16
|
+
}
|
|
17
|
+
for (const path of a.tree.keys())
|
|
18
|
+
if (!b.tree.has(path))
|
|
19
|
+
removed.push(path);
|
|
20
|
+
return { added: added.sort(), removed: removed.sort(), modified: modified.sort() };
|
|
21
|
+
}
|
|
22
|
+
/** Symmetric difference of the accepted operation sets of two reductions. */
|
|
23
|
+
export function diffAcceptedOps(a, b) {
|
|
24
|
+
const accepted = (r) => new Set([...r.statuses].filter(([, s]) => s === "accepted").map(([oid]) => oid));
|
|
25
|
+
const sa = accepted(a);
|
|
26
|
+
const sb = accepted(b);
|
|
27
|
+
return {
|
|
28
|
+
added: [...sb].filter((o) => !sa.has(o)).sort(),
|
|
29
|
+
removed: [...sa].filter((o) => !sb.has(o)).sort(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=diff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/query/diff.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,iFAAiF;AACjF,oFAAoF;AACpF,qFAAqF;AACrF,2EAA2E;AAU3E,MAAM,UAAU,SAAS,CAAC,CAAkB,EAAE,CAAkB;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACnC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5E,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;AACrF,CAAC;AASD,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,CAAkB,EAAE,CAAkB;IACpE,MAAM,QAAQ,GAAG,CAAC,CAAkB,EAAE,EAAE,CACtC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnF,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAC/C,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;KAClD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.d.ts","sourceRoot":"","sources":["../../src/reducer/incremental.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Incremental reduce (docs/11 Track A, stage A0).
|
|
2
|
+
//
|
|
3
|
+
// Public entry points for O(Δ) re-reduce. The implementation lives in reducer.ts so it
|
|
4
|
+
// can reuse the file-private decision/materialization helpers without widening the
|
|
5
|
+
// module's API surface (determinism-critical code stays encapsulated). This module is
|
|
6
|
+
// the stable boundary the rest of the system imports.
|
|
7
|
+
//
|
|
8
|
+
// Contract: `reduceIncremental(snapshotReduce(base), next)` is structurally identical to
|
|
9
|
+
// `reduce(next)` whenever `next` is an append-superset of `base` (same policy/authority/
|
|
10
|
+
// materializeStatuses). The differential property harness (test/incremental-equivalence)
|
|
11
|
+
// enforces this. When the preconditions don't hold it throws NonIncrementalError and the
|
|
12
|
+
// caller falls back to a full reduce — never a silent divergence.
|
|
13
|
+
export { reduceIncremental, snapshotReduce, NonIncrementalError, serializeSnapshot, deserializeSnapshot, } from "./reducer.js";
|
|
14
|
+
//# sourceMappingURL=incremental.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incremental.js","sourceRoot":"","sources":["../../src/reducer/incremental.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,uFAAuF;AACvF,mFAAmF;AACnF,sFAAsF;AACtF,sDAAsD;AACtD,EAAE;AACF,yFAAyF;AACzF,yFAAyF;AACzF,yFAAyF;AACzF,yFAAyF;AACzF,kEAAkE;AAClE,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GAIpB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Evidence, Operation, Policy } from "../objects/types.ts";
|
|
2
|
+
export declare const MATERIALIZER_VERSION = "avcs-text-mvp/0.0.1";
|
|
3
|
+
/** A sane built-in policy used when a repo has not authored its own. */
|
|
4
|
+
export declare function defaultPolicy(): Policy;
|
|
5
|
+
export interface OpEvaluation {
|
|
6
|
+
blocked: boolean;
|
|
7
|
+
blockedReason?: string;
|
|
8
|
+
requiresHuman: boolean;
|
|
9
|
+
score: number;
|
|
10
|
+
notes: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Evaluate one operation under a policy, given the evidence attached to it and
|
|
14
|
+
* whether it is currently contended.
|
|
15
|
+
*/
|
|
16
|
+
export declare function evaluateOp(policy: Policy, op: Operation, evidenceForOp: Evidence[], inConflict: boolean, intentConstraintsSatisfied: boolean, reliabilityBonus?: number): OpEvaluation;
|
|
17
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/reducer/policy.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAEV,QAAQ,EACR,SAAS,EACT,MAAM,EAEP,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,oBAAoB,wBAAwB,CAAC;AAE1D,wEAAwE;AACxE,wBAAgB,aAAa,IAAI,MAAM,CAiCtC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAkBD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,SAAS,EACb,aAAa,EAAE,QAAQ,EAAE,EACzB,UAAU,EAAE,OAAO,EACnB,0BAA0B,EAAE,OAAO,EACnC,gBAAgB,SAAI,GACnB,YAAY,CAqEd"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// Policy engine.
|
|
2
|
+
//
|
|
3
|
+
// AVCS never defaults to last-write-wins for code. When concurrent operations
|
|
4
|
+
// contend for the same entity, a *policy* decides — deterministically and with a
|
|
5
|
+
// recorded rationale — using this ladder (highest first):
|
|
6
|
+
//
|
|
7
|
+
// 1. safety/security (rule-driven)
|
|
8
|
+
// 2. explicit human decision (a Decision object; handled in the reducer)
|
|
9
|
+
// 3. code-owner / human actor (actorTrust + prefer_actor)
|
|
10
|
+
// 4. intent constraints satisfied (declared effects vs intent constraints)
|
|
11
|
+
// 5. verified by evidence (require_evidence gating + bonus)
|
|
12
|
+
// 6. actor trust level (actorTrust ladder)
|
|
13
|
+
// 7. smaller blast radius (advisory)
|
|
14
|
+
// 8. recency (Lamport) (final tie-break — applied in the reducer's
|
|
15
|
+
// ranking comparator, NOT added to the score;
|
|
16
|
+
// adding it lets time overwhelm the ladder)
|
|
17
|
+
//
|
|
18
|
+
// Evidence trust: an operation's own author cannot vouch for it. require_evidence
|
|
19
|
+
// gates and the passing-test bonus only count evidence produced by a non-authoring
|
|
20
|
+
// trusted actor (ci_bot / human). Self-reported ai_agent evidence is ignored until
|
|
21
|
+
// signing lands (Phase 3). See docs/04-policy.md.
|
|
22
|
+
export const MATERIALIZER_VERSION = "avcs-text-mvp/0.0.1";
|
|
23
|
+
/** A sane built-in policy used when a repo has not authored its own. */
|
|
24
|
+
export function defaultPolicy() {
|
|
25
|
+
return {
|
|
26
|
+
type: "policy",
|
|
27
|
+
version: "default/2026.06",
|
|
28
|
+
actorTrust: ["ai_agent", "ci_bot", "human"], // human most trusted
|
|
29
|
+
rules: [
|
|
30
|
+
// A change that alters runtime behavior must carry a passing test.
|
|
31
|
+
{
|
|
32
|
+
name: "behavior_change_requires_test",
|
|
33
|
+
when: { changesBehavior: true },
|
|
34
|
+
effect: { type: "require_evidence", evidence: "unit_test", result: "pass" },
|
|
35
|
+
},
|
|
36
|
+
// Breaking the public API is never auto-merged — a human must decide.
|
|
37
|
+
{
|
|
38
|
+
name: "public_api_break_requires_human",
|
|
39
|
+
when: { breaksPublicApi: true },
|
|
40
|
+
effect: { type: "require_human" },
|
|
41
|
+
},
|
|
42
|
+
// Pure formatting loses every contest.
|
|
43
|
+
{
|
|
44
|
+
name: "formatting_low_priority",
|
|
45
|
+
when: { opKind: "note" },
|
|
46
|
+
effect: { type: "priority", weight: -50 },
|
|
47
|
+
},
|
|
48
|
+
// On any conflict, prefer the human's operation.
|
|
49
|
+
{
|
|
50
|
+
name: "human_wins_conflicts",
|
|
51
|
+
when: { onConflict: true },
|
|
52
|
+
effect: { type: "prefer_actor", kind: "human" },
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
createdAt: new Date().toISOString(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function actorTrustScore(policy, actor) {
|
|
59
|
+
const idx = policy.actorTrust.indexOf(actor.kind);
|
|
60
|
+
return (idx < 0 ? 0 : idx + 1) * 100;
|
|
61
|
+
}
|
|
62
|
+
function ruleMatches(rule, op, inConflict) {
|
|
63
|
+
const w = rule.when;
|
|
64
|
+
if (w.opKind !== undefined && op.body.kind !== w.opKind)
|
|
65
|
+
return false;
|
|
66
|
+
if (w.breaksPublicApi !== undefined && !!op.effects?.breaksPublicApi !== w.breaksPublicApi)
|
|
67
|
+
return false;
|
|
68
|
+
if (w.changesBehavior !== undefined && !!op.effects?.changesBehavior !== w.changesBehavior)
|
|
69
|
+
return false;
|
|
70
|
+
if (w.onConflict !== undefined && w.onConflict !== inConflict)
|
|
71
|
+
return false;
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Evaluate one operation under a policy, given the evidence attached to it and
|
|
76
|
+
* whether it is currently contended.
|
|
77
|
+
*/
|
|
78
|
+
export function evaluateOp(policy, op, evidenceForOp, inConflict, intentConstraintsSatisfied, reliabilityBonus = 0) {
|
|
79
|
+
const ev = {
|
|
80
|
+
blocked: false,
|
|
81
|
+
requiresHuman: false,
|
|
82
|
+
score: actorTrustScore(policy, op.actor),
|
|
83
|
+
notes: [],
|
|
84
|
+
};
|
|
85
|
+
// Phase 5: learned trust nudge (bounded; cannot overpower the ladder — cf. C1).
|
|
86
|
+
if (reliabilityBonus !== 0) {
|
|
87
|
+
ev.score += reliabilityBonus * 30;
|
|
88
|
+
ev.notes.push(`reliability ${reliabilityBonus > 0 ? "+" : ""}${reliabilityBonus}`);
|
|
89
|
+
}
|
|
90
|
+
// Only evidence the operation's own author did NOT produce can vouch for it, and
|
|
91
|
+
// evidence from an untrusted (outsider-CI) runner never counts until re-run (Phase 11).
|
|
92
|
+
const trusted = evidenceForOp.filter((e) => !e.fromUntrustedRunner &&
|
|
93
|
+
(e.producedBy.kind !== "ai_agent" || e.producedBy.id !== op.actor.id));
|
|
94
|
+
const ignored = evidenceForOp.length - trusted.length;
|
|
95
|
+
if (ignored > 0)
|
|
96
|
+
ev.notes.push(`${ignored} self-reported evidence ignored`);
|
|
97
|
+
// Base signals.
|
|
98
|
+
if (intentConstraintsSatisfied) {
|
|
99
|
+
ev.score += 200;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
ev.score -= 200;
|
|
103
|
+
ev.notes.push("violates intent constraints");
|
|
104
|
+
}
|
|
105
|
+
// A passing test is worth more than self-reported confidence.
|
|
106
|
+
if (trusted.some((e) => e.result === "pass" && e.kind.endsWith("test"))) {
|
|
107
|
+
ev.score += 150;
|
|
108
|
+
ev.notes.push("has passing tests");
|
|
109
|
+
}
|
|
110
|
+
for (const rule of policy.rules) {
|
|
111
|
+
if (!ruleMatches(rule, op, inConflict))
|
|
112
|
+
continue;
|
|
113
|
+
const e = rule.effect;
|
|
114
|
+
switch (e.type) {
|
|
115
|
+
case "require_human":
|
|
116
|
+
ev.requiresHuman = true;
|
|
117
|
+
ev.notes.push(`rule ${rule.name}: requires human decision`);
|
|
118
|
+
break;
|
|
119
|
+
case "require_evidence": {
|
|
120
|
+
const ok = trusted.some((x) => x.kind === e.evidence && x.result === e.result);
|
|
121
|
+
if (!ok) {
|
|
122
|
+
ev.blocked = true;
|
|
123
|
+
ev.blockedReason = `rule ${rule.name}: missing trusted ${e.evidence}=${e.result}`;
|
|
124
|
+
ev.notes.push(ev.blockedReason);
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case "priority":
|
|
129
|
+
ev.score += e.weight;
|
|
130
|
+
break;
|
|
131
|
+
case "prefer_actor":
|
|
132
|
+
if (op.actor.kind === e.kind) {
|
|
133
|
+
ev.score += 500;
|
|
134
|
+
ev.notes.push(`rule ${rule.name}: preferred actor ${e.kind}`);
|
|
135
|
+
}
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// NOTE: lamport is deliberately NOT added here. Recency is a tie-break only,
|
|
140
|
+
// applied by the reducer when scores are equal.
|
|
141
|
+
return ev;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/reducer/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { Decision, Evidence, Intent, Operation, OperationStatus, Policy } from "../objects/types.ts";
|
|
2
|
+
export interface ConflictOption {
|
|
3
|
+
opOid: string;
|
|
4
|
+
actor: string;
|
|
5
|
+
purpose: string;
|
|
6
|
+
evidence: string[];
|
|
7
|
+
score: number;
|
|
8
|
+
blocked: boolean;
|
|
9
|
+
requiresHuman: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface Conflict {
|
|
12
|
+
id: string;
|
|
13
|
+
key: string;
|
|
14
|
+
kind: "concurrent_write" | "needs_human";
|
|
15
|
+
options: ConflictOption[];
|
|
16
|
+
/** Policy's provisional recommendation (never set when a human is required). */
|
|
17
|
+
recommendedOp: string | null;
|
|
18
|
+
reason: string;
|
|
19
|
+
/** Actor ids that own this scope and should make the call (Phase 5). */
|
|
20
|
+
requiredOwners?: string[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A merge that is text-clean but meaning-broken: one op changed a public contract
|
|
24
|
+
* while another depends on the old one. Detected (and escalated) by the repo's
|
|
25
|
+
* semantic pass, not the core grouping.
|
|
26
|
+
*/
|
|
27
|
+
export interface SemanticConflict {
|
|
28
|
+
kind: "contract_break";
|
|
29
|
+
symbol: string;
|
|
30
|
+
breakingOp: string;
|
|
31
|
+
dependentOps: string[];
|
|
32
|
+
reason: string;
|
|
33
|
+
}
|
|
34
|
+
/** A contest the policy resolved by itself — recorded so auto-merges are auditable. */
|
|
35
|
+
export interface AutoDecision {
|
|
36
|
+
key: string;
|
|
37
|
+
conflictId: string;
|
|
38
|
+
chosenOp: string;
|
|
39
|
+
rejectedOps: string[];
|
|
40
|
+
reason: string;
|
|
41
|
+
policyVersion: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ReductionResult {
|
|
44
|
+
/** path → blobOid */
|
|
45
|
+
tree: Map<string, string>;
|
|
46
|
+
treeHash: string;
|
|
47
|
+
statuses: Map<string, OperationStatus>;
|
|
48
|
+
conflicts: Conflict[];
|
|
49
|
+
autoDecisions: AutoDecision[];
|
|
50
|
+
/** Text-clean but meaning-broken merges, escalated by the repo's semantic pass. */
|
|
51
|
+
semanticConflicts: SemanticConflict[];
|
|
52
|
+
/** Frontier op ids: accepted ops that no other accepted op descends from. */
|
|
53
|
+
headOps: string[];
|
|
54
|
+
/**
|
|
55
|
+
* Content for blob oids synthesized during reduction (symbol-level merges produce
|
|
56
|
+
* file content that is not any single stored blob). oid → content. The caller
|
|
57
|
+
* persists or writes these directly. Synthetic oids are content-derived, so the
|
|
58
|
+
* treeHash that references them stays deterministic.
|
|
59
|
+
*/
|
|
60
|
+
synthBlobs: Map<string, string>;
|
|
61
|
+
}
|
|
62
|
+
export interface ReduceInput {
|
|
63
|
+
ops: Operation[];
|
|
64
|
+
evidence: Evidence[];
|
|
65
|
+
decisions: Decision[];
|
|
66
|
+
intents: Map<string, Intent>;
|
|
67
|
+
policy: Policy;
|
|
68
|
+
/** Which statuses get projected into the tree. Default: accepted only. */
|
|
69
|
+
materializeStatuses?: OperationStatus[];
|
|
70
|
+
/** blob oid → content, for ops that need file text (set_symbol). */
|
|
71
|
+
blobContent?: Map<string, string>;
|
|
72
|
+
/** actorId → bounded reliability nudge (Phase 5 trust learning). */
|
|
73
|
+
reliability?: Map<string, number>;
|
|
74
|
+
/** deciderId → role weight; resolves contradictory decisions by authority (docs/08 §4). */
|
|
75
|
+
authority?: Map<string, number>;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The contended keys an op occupies. A rename reads its source and writes its
|
|
79
|
+
* destination, so it contends on BOTH — otherwise a concurrent write to either
|
|
80
|
+
* path would slip through unmerged. note ops contend on nothing.
|
|
81
|
+
*/
|
|
82
|
+
export declare function keysOf(op: Operation): string[];
|
|
83
|
+
export declare function conflictIdFor(key: string): string;
|
|
84
|
+
export interface CrossConflict {
|
|
85
|
+
file: string;
|
|
86
|
+
ops: string[];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* A whole-file op (put_file/delete/rename) and a set_symbol on the SAME file are keyed
|
|
90
|
+
* differently (file:… vs symbol:…#…), so the reducer's grouping never makes them
|
|
91
|
+
* contend. When they are CONCURRENT (neither a causal ancestor of the other), letting
|
|
92
|
+
* both apply makes the result depend on kahnOrder's lamport (authoring-order) tie-break
|
|
93
|
+
* — non-deterministic. This finds those pairs among ACCEPTED ops so the repo can hold
|
|
94
|
+
* them back (re-reduce) and surface a conflict. Ancestor relations (scaffold→edit) are
|
|
95
|
+
* intentionally not flagged.
|
|
96
|
+
*/
|
|
97
|
+
export declare function detectCrossGranularity(ops: Operation[], result: ReductionResult): CrossConflict[];
|
|
98
|
+
/** A single group's locally-decided statuses + the conflicts/autoDecisions it emitted. */
|
|
99
|
+
export interface PerKeyDecision {
|
|
100
|
+
local: Map<string, OperationStatus>;
|
|
101
|
+
conflicts: Conflict[];
|
|
102
|
+
autoDecisions: AutoDecision[];
|
|
103
|
+
}
|
|
104
|
+
/** Observability for an incremental re-reduce: how much work the dirty-set skipped.
|
|
105
|
+
* Does not affect the result; purely for benchmarks/metrics (docs/11 A1). */
|
|
106
|
+
export interface IncrementalStats {
|
|
107
|
+
groupsTotal: number;
|
|
108
|
+
groupsRecomputed: number;
|
|
109
|
+
groupsReused: number;
|
|
110
|
+
dirtyKeys: number;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* A full reduce plus the per-group bookkeeping an incremental re-reduce needs to reuse
|
|
114
|
+
* clean groups (see incremental.ts / docs/11). The `result` is exactly `reduce(input)`.
|
|
115
|
+
*/
|
|
116
|
+
export interface ReduceSnapshot {
|
|
117
|
+
input: ReduceInput;
|
|
118
|
+
result: ReductionResult;
|
|
119
|
+
perKey: Map<string, PerKeyDecision>;
|
|
120
|
+
groupOrder: string[];
|
|
121
|
+
groupMembers: Map<string, string[]>;
|
|
122
|
+
/** Set by `reduceIncremental` (a full `snapshotReduce` recomputes every group). */
|
|
123
|
+
stats: IncrementalStats;
|
|
124
|
+
}
|
|
125
|
+
export declare function reduce(input: ReduceInput): ReductionResult;
|
|
126
|
+
export declare function snapshotReduce(input: ReduceInput): ReduceSnapshot;
|
|
127
|
+
/** Thrown when an incremental re-reduce's preconditions don't hold; the caller must
|
|
128
|
+
* fall back to a full `reduce`. Never indicates a correctness failure — only that the
|
|
129
|
+
* fast path doesn't apply (policy/authority/materializeStatuses changed, or `next` is
|
|
130
|
+
* not an append-superset of the snapshot's input). */
|
|
131
|
+
export declare class NonIncrementalError extends Error {
|
|
132
|
+
constructor(reason: string);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Incremental re-reduce (docs/11 Track A). Given a prior `snapshotReduce` and a `next`
|
|
136
|
+
* input that is an APPEND-SUPERSET of the snapshot's input (same policy/authority/
|
|
137
|
+
* materializeStatuses; ops/decisions/evidence only added), recompute only the groups
|
|
138
|
+
* whose decision could have changed (the "dirty set") and reuse every clean group's
|
|
139
|
+
* cached decision verbatim. The returned result is structurally identical to
|
|
140
|
+
* `reduce(next)` — this is the invariant the differential harness enforces.
|
|
141
|
+
*
|
|
142
|
+
* Dirty keys (see docs/11): keys of new ops; keys of ops targeted by new decisions or
|
|
143
|
+
* new evidence (these can flip blocked/accept regardless of contention); keys whose
|
|
144
|
+
* group membership changed or are brand new; and the keys of any op whose actor's
|
|
145
|
+
* reliability changed (a needs_human conflict embeds the op's reliability-derived score,
|
|
146
|
+
* so reliability changes are not gated by contention here — A1 may tighten this).
|
|
147
|
+
*
|
|
148
|
+
* Throws {@link NonIncrementalError} when the preconditions don't hold; the caller then
|
|
149
|
+
* falls back to a full reduce. tree/headOps are rebuilt fully (cheap, in-memory) in A0;
|
|
150
|
+
* A3 will make the tree update incremental too.
|
|
151
|
+
*/
|
|
152
|
+
export declare function reduceIncremental(snap: ReduceSnapshot, next: ReduceInput): ReduceSnapshot;
|
|
153
|
+
export declare function serializeSnapshot(snap: ReduceSnapshot): unknown;
|
|
154
|
+
export declare function deserializeSnapshot(raw: unknown): ReduceSnapshot;
|
|
155
|
+
//# sourceMappingURL=reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../src/reducer/reducer.ts"],"names":[],"mappings":"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"}
|