@codyswann/lisa 4.20.0 → 4.21.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/all/copy-contents/.gitattributes +2 -1
- package/all/create-only/.lisa/PROJECT_LEARNINGS.md +1 -1
- package/dist/core/learnings-alias.d.ts +26 -45
- package/dist/core/learnings-alias.d.ts.map +1 -1
- package/dist/core/learnings-alias.js +29 -48
- package/dist/core/learnings-alias.js.map +1 -1
- package/dist/core/learnings-budget-check.d.ts +2 -1
- package/dist/core/learnings-budget-check.d.ts.map +1 -1
- package/dist/core/learnings-budget-check.js +13 -11
- package/dist/core/learnings-budget-check.js.map +1 -1
- package/dist/core/learnings-contract.d.ts +27 -10
- package/dist/core/learnings-contract.d.ts.map +1 -1
- package/dist/core/learnings-contract.js +37 -9
- package/dist/core/learnings-contract.js.map +1 -1
- package/dist/core/learnings-document.d.ts +20 -1
- package/dist/core/learnings-document.d.ts.map +1 -1
- package/dist/core/learnings-document.js +81 -14
- package/dist/core/learnings-document.js.map +1 -1
- package/dist/core/learnings-entry.d.ts +11 -1
- package/dist/core/learnings-entry.d.ts.map +1 -1
- package/dist/core/learnings-entry.js +98 -24
- package/dist/core/learnings-entry.js.map +1 -1
- package/dist/core/learnings-merge-driver.d.ts +4 -2
- package/dist/core/learnings-merge-driver.d.ts.map +1 -1
- package/dist/core/learnings-merge-driver.js +6 -3
- package/dist/core/learnings-merge-driver.js.map +1 -1
- package/dist/core/learnings-merge.d.ts.map +1 -1
- package/dist/core/learnings-merge.js +96 -10
- package/dist/core/learnings-merge.js.map +1 -1
- package/dist/core/learnings-overflow.d.ts.map +1 -1
- package/dist/core/learnings-overflow.js +72 -3
- package/dist/core/learnings-overflow.js.map +1 -1
- package/dist/core/learnings-supersede.d.ts +56 -0
- package/dist/core/learnings-supersede.d.ts.map +1 -0
- package/dist/core/learnings-supersede.js +199 -0
- package/dist/core/learnings-supersede.js.map +1 -0
- package/dist/core/learnings-writer.d.ts +9 -7
- package/dist/core/learnings-writer.d.ts.map +1 -1
- package/dist/core/learnings-writer.js +31 -58
- package/dist/core/learnings-writer.js.map +1 -1
- package/dist/core/learnings.d.ts +3 -0
- package/dist/core/learnings.d.ts.map +1 -1
- package/dist/core/learnings.js +3 -0
- package/dist/core/learnings.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +15 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +3 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +2 -2
- package/plugins/lisa/agents/learner.md +7 -6
- package/plugins/lisa/rules/reference/project-learnings.md +34 -1
- package/plugins/lisa/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/lisa/skills/lisa-persist-learning/SKILL.md +2 -2
- package/plugins/lisa-agy/agents/learner.md +7 -6
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/lisa-agy/skills/lisa-persist-learning/SKILL.md +2 -2
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/learner.agent.md +7 -6
- package/plugins/lisa-copilot/rules/reference/project-learnings.md +34 -1
- package/plugins/lisa-copilot/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/lisa-copilot/skills/lisa-persist-learning/SKILL.md +2 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/learner.md +7 -6
- package/plugins/lisa-cursor/rules/project-learnings-reference.mdc +34 -1
- package/plugins/lisa-cursor/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/lisa-cursor/skills/lisa-persist-learning/SKILL.md +2 -2
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/learner.md +7 -6
- package/plugins/src/base/rules/reference/project-learnings.md +34 -1
- package/plugins/src/base/skills/lisa-debrief-apply/SKILL.md +5 -4
- package/plugins/src/base/skills/lisa-persist-learning/SKILL.md +2 -2
- package/scripts/verify-learner-frontmatter-built.mjs +1 -1
- package/scripts/verify-packed-learnings-contract.mjs +268 -0
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
# The project learnings ledger is written by concurrent learner passes that
|
|
4
4
|
# each run on their own branch. Git's default line merge corrupts it with
|
|
5
|
-
# conflict markers; this driver
|
|
5
|
+
# conflict markers; this driver merges entries by id and fingerprint. The
|
|
6
|
+
# driver preserves concurrent stable-id successors instead of guessing. Its
|
|
6
7
|
# command is machine-local — run `lisa install-merge-driver` to register it.
|
|
7
8
|
# `lisa doctor` already reports this as "Merge drivers registered?" when a
|
|
8
9
|
# mapping here has no registered driver — named at the symptom site on
|
|
@@ -1,53 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Reference survival across supersede-in-place consolidation.
|
|
2
|
+
* Reference survival across stamped supersede-in-place consolidation.
|
|
3
3
|
*
|
|
4
4
|
* ## The problem
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* cross-link from another learning)
|
|
11
|
-
* exists
|
|
6
|
+
* Learning ids are stable public references, while fingerprints are immutable
|
|
7
|
+
* content-version tokens. An exact stamped consolidation keeps the
|
|
8
|
+
* deterministic primary target id, but a multi-target consolidation removes
|
|
9
|
+
* the other live ids. Anything that cited one of those secondary ids (a
|
|
10
|
+
* tracker comment, a gardener ticket, or a cross-link from another learning)
|
|
11
|
+
* would otherwise point at an entry that no longer exists
|
|
12
|
+
* (CodySwannGT/lisa#1997).
|
|
12
13
|
*
|
|
13
|
-
* ## Why
|
|
14
|
+
* ## Why aliases still matter after stable-id carry-forward
|
|
14
15
|
*
|
|
15
|
-
* The
|
|
16
|
-
*
|
|
17
|
-
*
|
|
16
|
+
* The persisted v2 fingerprint is the compare-and-swap token that makes stable
|
|
17
|
+
* ids safe. Two learner passes racing from the same `{ id, fingerprint }`
|
|
18
|
+
* snapshot cannot overwrite one another: the first exact writer carries the id
|
|
19
|
+
* forward, the second sees a fingerprint mismatch and appends without removing
|
|
20
|
+
* the winner (#1995). A legitimate chained writer holding the winner's current
|
|
21
|
+
* fingerprint can replace it in place.
|
|
18
22
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
* consolidation was intended," exactly the cost the writer documents.
|
|
24
|
-
*
|
|
25
|
-
* Carry the id forward and that protection evaporates: the first writer lands
|
|
26
|
-
* under `base`, so the second writer's stale "supersede base" now MATCHES,
|
|
27
|
-
* removes the first writer's entry, and overwrites it. `learnings-supersede-race`
|
|
28
|
-
* proves the damage — nine writers consolidating one target went from nine
|
|
29
|
-
* preserved learnings to **one**, destroying eight. That is the #1995 data-loss
|
|
30
|
-
* symptom re-opened, which the brief explicitly forbids.
|
|
31
|
-
*
|
|
32
|
-
* The fix is undecidable from the seven fields alone: a stale "supersede base"
|
|
33
|
-
* and a legitimate chained "supersede base" are the same bytes. Telling them
|
|
34
|
-
* apart needs a real version token — the fingerprint retained as an eighth,
|
|
35
|
-
* disambiguating field, per the issue's parenthetical. That is a persisted-schema
|
|
36
|
-
* change: a contract version bump propagated through every reader, the merge
|
|
37
|
-
* driver, the CI budget gate, and all six plugin skill projections. It is the
|
|
38
|
-
* principled long-term answer and it deserves its own change.
|
|
39
|
-
*
|
|
40
|
-
* So this takes the issue's second option. Ids keep churning — the CAS token,
|
|
41
|
-
* the #1995 guarantee, and the fingerprint-is-the-id dedupe model are all left
|
|
42
|
-
* exactly as they are — and references survive because the consolidated entry
|
|
43
|
-
* *records what it replaced*.
|
|
23
|
+
* Stable carry-forward preserves the deterministic primary id. Aliases preserve
|
|
24
|
+
* every other exact target and inherited ancestor in a multi-entry
|
|
25
|
+
* consolidation. They are therefore a reference-history layer, never a stale
|
|
26
|
+
* write workaround and never a substitute for stamped compare-and-swap.
|
|
44
27
|
*
|
|
45
28
|
* ## Where the map lives
|
|
46
29
|
*
|
|
47
|
-
* In the entry's own `provenance`, as `supersedes:<old id>` references. No
|
|
48
|
-
*
|
|
49
|
-
* rendered, merged, budget-counted list of stable references, and
|
|
50
|
-
* replaced that one" is precisely a provenance claim.
|
|
30
|
+
* In the entry's own `provenance`, as `supersedes:<old id>` references. No
|
|
31
|
+
* additional schema field or sidecar is required: provenance is already a
|
|
32
|
+
* validated, rendered, merged, budget-counted list of stable references, and
|
|
33
|
+
* "this entry replaced that one" is precisely a provenance claim.
|
|
51
34
|
*
|
|
52
35
|
* Resolution is ONE HOP, never transitive. When an entry is consolidated, the
|
|
53
36
|
* writer copies the removed entries' own alias references forward, so a lineage
|
|
@@ -55,11 +38,9 @@
|
|
|
55
38
|
* There is no chain for a reader to walk and therefore no cycle or depth limit
|
|
56
39
|
* to get wrong.
|
|
57
40
|
*
|
|
58
|
-
* An alias is recorded ONLY for a target
|
|
59
|
-
* A
|
|
60
|
-
*
|
|
61
|
-
* in the nine-writer race, only the one writer that truly removed `base` claims
|
|
62
|
-
* `base`, and the reference stays unambiguous.
|
|
41
|
+
* An alias is recorded ONLY for a target whose exact stamp was present and
|
|
42
|
+
* removed. A stale all-or-nothing plan removes nothing and records no alias, so
|
|
43
|
+
* it cannot hijack a reference that the winning writer legitimately owns.
|
|
63
44
|
* @module core/learnings-alias
|
|
64
45
|
*/
|
|
65
46
|
import { type LearningEntry } from "./learnings-contract.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-alias.d.ts","sourceRoot":"","sources":["../../src/core/learnings-alias.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"learnings-alias.d.ts","sourceRoot":"","sources":["../../src/core/learnings-alias.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAEjC,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,aAAa,GACnB,KAAK,GAAG,SAAS,CASnB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,MAAM,EAAE,CAKzE;AA4BD,oEAAoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,SAAS,aAAa,EAAE,GAChC,oBAAoB,CActB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,EAAE,EAAE,MAAM,GACT,SAAS,aAAa,EAAE,CAS1B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,SAAS,aAAa,EAAE,EACjC,EAAE,EAAE,MAAM,GACT,aAAa,GAAG,SAAS,CAE3B"}
|
|
@@ -1,53 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Reference survival across supersede-in-place consolidation.
|
|
2
|
+
* Reference survival across stamped supersede-in-place consolidation.
|
|
3
3
|
*
|
|
4
4
|
* ## The problem
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* cross-link from another learning)
|
|
11
|
-
* exists
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* removes the first writer's entry, and overwrites it. `learnings-supersede-race`
|
|
28
|
-
* proves the damage — nine writers consolidating one target went from nine
|
|
29
|
-
* preserved learnings to **one**, destroying eight. That is the #1995 data-loss
|
|
30
|
-
* symptom re-opened, which the brief explicitly forbids.
|
|
31
|
-
*
|
|
32
|
-
* The fix is undecidable from the seven fields alone: a stale "supersede base"
|
|
33
|
-
* and a legitimate chained "supersede base" are the same bytes. Telling them
|
|
34
|
-
* apart needs a real version token — the fingerprint retained as an eighth,
|
|
35
|
-
* disambiguating field, per the issue's parenthetical. That is a persisted-schema
|
|
36
|
-
* change: a contract version bump propagated through every reader, the merge
|
|
37
|
-
* driver, the CI budget gate, and all six plugin skill projections. It is the
|
|
38
|
-
* principled long-term answer and it deserves its own change.
|
|
39
|
-
*
|
|
40
|
-
* So this takes the issue's second option. Ids keep churning — the CAS token,
|
|
41
|
-
* the #1995 guarantee, and the fingerprint-is-the-id dedupe model are all left
|
|
42
|
-
* exactly as they are — and references survive because the consolidated entry
|
|
43
|
-
* *records what it replaced*.
|
|
6
|
+
* Learning ids are stable public references, while fingerprints are immutable
|
|
7
|
+
* content-version tokens. An exact stamped consolidation keeps the
|
|
8
|
+
* deterministic primary target id, but a multi-target consolidation removes
|
|
9
|
+
* the other live ids. Anything that cited one of those secondary ids (a
|
|
10
|
+
* tracker comment, a gardener ticket, or a cross-link from another learning)
|
|
11
|
+
* would otherwise point at an entry that no longer exists
|
|
12
|
+
* (CodySwannGT/lisa#1997).
|
|
13
|
+
*
|
|
14
|
+
* ## Why aliases still matter after stable-id carry-forward
|
|
15
|
+
*
|
|
16
|
+
* The persisted v2 fingerprint is the compare-and-swap token that makes stable
|
|
17
|
+
* ids safe. Two learner passes racing from the same `{ id, fingerprint }`
|
|
18
|
+
* snapshot cannot overwrite one another: the first exact writer carries the id
|
|
19
|
+
* forward, the second sees a fingerprint mismatch and appends without removing
|
|
20
|
+
* the winner (#1995). A legitimate chained writer holding the winner's current
|
|
21
|
+
* fingerprint can replace it in place.
|
|
22
|
+
*
|
|
23
|
+
* Stable carry-forward preserves the deterministic primary id. Aliases preserve
|
|
24
|
+
* every other exact target and inherited ancestor in a multi-entry
|
|
25
|
+
* consolidation. They are therefore a reference-history layer, never a stale
|
|
26
|
+
* write workaround and never a substitute for stamped compare-and-swap.
|
|
44
27
|
*
|
|
45
28
|
* ## Where the map lives
|
|
46
29
|
*
|
|
47
|
-
* In the entry's own `provenance`, as `supersedes:<old id>` references. No
|
|
48
|
-
*
|
|
49
|
-
* rendered, merged, budget-counted list of stable references, and
|
|
50
|
-
* replaced that one" is precisely a provenance claim.
|
|
30
|
+
* In the entry's own `provenance`, as `supersedes:<old id>` references. No
|
|
31
|
+
* additional schema field or sidecar is required: provenance is already a
|
|
32
|
+
* validated, rendered, merged, budget-counted list of stable references, and
|
|
33
|
+
* "this entry replaced that one" is precisely a provenance claim.
|
|
51
34
|
*
|
|
52
35
|
* Resolution is ONE HOP, never transitive. When an entry is consolidated, the
|
|
53
36
|
* writer copies the removed entries' own alias references forward, so a lineage
|
|
@@ -55,11 +38,9 @@
|
|
|
55
38
|
* There is no chain for a reader to walk and therefore no cycle or depth limit
|
|
56
39
|
* to get wrong.
|
|
57
40
|
*
|
|
58
|
-
* An alias is recorded ONLY for a target
|
|
59
|
-
* A
|
|
60
|
-
*
|
|
61
|
-
* in the nine-writer race, only the one writer that truly removed `base` claims
|
|
62
|
-
* `base`, and the reference stays unambiguous.
|
|
41
|
+
* An alias is recorded ONLY for a target whose exact stamp was present and
|
|
42
|
+
* removed. A stale all-or-nothing plan removes nothing and records no alias, so
|
|
43
|
+
* it cannot hijack a reference that the winning writer legitimately owns.
|
|
63
44
|
* @module core/learnings-alias
|
|
64
45
|
*/
|
|
65
46
|
import { LEARNINGS_CONTRACT, } from "./learnings-contract.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-alias.js","sourceRoot":"","sources":["../../src/core/learnings-alias.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"learnings-alias.js","sourceRoot":"","sources":["../../src/core/learnings-alias.ts"],"names":[],"mappings":"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"}
|
|
@@ -95,9 +95,10 @@ export declare function checkLearningsBudget(file: string): Promise<LearningsBud
|
|
|
95
95
|
* failed. This verdict is the same fact, said before anyone pays for it.
|
|
96
96
|
* @param entryCount - Entries the document holds
|
|
97
97
|
* @param measuredTokens - Measured document size under the contract's measure
|
|
98
|
+
* @param maxTokens - Source-version byte ceiling used for saturation
|
|
98
99
|
* @returns Single-line saturation clause, or undefined when room remains
|
|
99
100
|
*/
|
|
100
|
-
export declare function describeLearningsSaturation(entryCount: number, measuredTokens: number): string | undefined;
|
|
101
|
+
export declare function describeLearningsSaturation(entryCount: number, measuredTokens: number, maxTokens?: number): string | undefined;
|
|
101
102
|
/**
|
|
102
103
|
* Render the one operator-facing verdict line for a within-budget document.
|
|
103
104
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-budget-check.d.ts","sourceRoot":"","sources":["../../src/core/learnings-budget-check.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"learnings-budget-check.d.ts","sourceRoot":"","sources":["../../src/core/learnings-budget-check.ts"],"names":[],"mappings":"AA+BA,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,gFAAgF;AAChF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8EAA8E;AAC9E,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,8CAA8C;AAC9C,MAAM,MAAM,qBAAqB,GAC7B,iBAAiB,GACjB,sBAAsB,GACtB,wBAAwB,CAAC;AAE7B;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,qBAAqB,CAAC,CAiChC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,SAAS,GAAE,MAAqC,GAC/C,MAAM,GAAG,SAAS,CAcpB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,iBAAiB,GACxB,MAAM,CAKR;AAiDD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYxD;AAoCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD"}
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { constants } from "node:fs";
|
|
18
18
|
import { open } from "node:fs/promises";
|
|
19
19
|
import { LEARNINGS_CONTRACT, PER_ENTRY_BYTE_ALLOWANCE, estimateLearningTokens, } from "./learnings-contract.js";
|
|
20
|
-
import { CONFLICT_MARKER_DIAGNOSIS, conflictMarkerError, findConflictMarkerInBytes,
|
|
20
|
+
import { CONFLICT_MARKER_DIAGNOSIS, conflictMarkerError, findConflictMarkerInBytes, parseLearningsDocument, } from "./learnings-document.js";
|
|
21
21
|
import { validateLearningEntry } from "./learnings-entry.js";
|
|
22
22
|
/**
|
|
23
23
|
* Check one already-resolved absolute learnings path against the shared hard
|
|
@@ -30,14 +30,12 @@ export async function checkLearningsBudget(file) {
|
|
|
30
30
|
try {
|
|
31
31
|
const content = await readBoundedRegularFile(file, LEARNINGS_CONTRACT.maxTokens);
|
|
32
32
|
const measuredTokens = estimateLearningTokens(content);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
const entries = parseLearningsFile(content);
|
|
33
|
+
const document = parseLearningsDocument(content);
|
|
34
|
+
const entries = document.entries;
|
|
37
35
|
for (const entry of entries) {
|
|
38
36
|
validateLearningEntry(entry);
|
|
39
37
|
}
|
|
40
|
-
if (
|
|
38
|
+
if (!document.canonicalSource) {
|
|
41
39
|
throw new Error("non-canonical project learnings format");
|
|
42
40
|
}
|
|
43
41
|
return {
|
|
@@ -45,8 +43,8 @@ export async function checkLearningsBudget(file) {
|
|
|
45
43
|
entryCount: entries.length,
|
|
46
44
|
maxEntries: LEARNINGS_CONTRACT.maxEntries,
|
|
47
45
|
measuredTokens,
|
|
48
|
-
maxTokens:
|
|
49
|
-
saturation: describeLearningsSaturation(entries.length, measuredTokens),
|
|
46
|
+
maxTokens: document.sourceMaxTokens,
|
|
47
|
+
saturation: describeLearningsSaturation(entries.length, measuredTokens, document.sourceMaxTokens),
|
|
50
48
|
};
|
|
51
49
|
}
|
|
52
50
|
catch (error) {
|
|
@@ -112,17 +110,21 @@ export async function checkLearningsBudget(file) {
|
|
|
112
110
|
* failed. This verdict is the same fact, said before anyone pays for it.
|
|
113
111
|
* @param entryCount - Entries the document holds
|
|
114
112
|
* @param measuredTokens - Measured document size under the contract's measure
|
|
113
|
+
* @param maxTokens - Source-version byte ceiling used for saturation
|
|
115
114
|
* @returns Single-line saturation clause, or undefined when room remains
|
|
116
115
|
*/
|
|
117
|
-
export function describeLearningsSaturation(entryCount, measuredTokens) {
|
|
116
|
+
export function describeLearningsSaturation(entryCount, measuredTokens, maxTokens = LEARNINGS_CONTRACT.maxTokens) {
|
|
117
|
+
const averageEntryAllowance = maxTokens === LEARNINGS_CONTRACT.maxTokens
|
|
118
|
+
? PER_ENTRY_BYTE_ALLOWANCE
|
|
119
|
+
: Math.floor(maxTokens / LEARNINGS_CONTRACT.maxEntries);
|
|
118
120
|
const entriesFull = entryCount >= LEARNINGS_CONTRACT.maxEntries;
|
|
119
|
-
const bytesFull = measuredTokens +
|
|
121
|
+
const bytesFull = measuredTokens + averageEntryAllowance > maxTokens;
|
|
120
122
|
if (!entriesFull && !bytesFull) {
|
|
121
123
|
return undefined;
|
|
122
124
|
}
|
|
123
125
|
const reason = entriesFull
|
|
124
126
|
? `every one of the ${LEARNINGS_CONTRACT.maxEntries} entry slots is taken`
|
|
125
|
-
: `fewer than ${
|
|
127
|
+
: `fewer than ${averageEntryAllowance} bytes remain, less than one average entry`;
|
|
126
128
|
return `${reason}, so the next learning captured here will be rejected. Retire or promote an entry with the gardener (\`/lisa:learnings:audit\`); raising the cap is not the remedy`;
|
|
127
129
|
}
|
|
128
130
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-budget-check.js","sourceRoot":"","sources":["../../src/core/learnings-budget-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAmB,MAAM,kBAAkB,CAAC;AACzD,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,
|
|
1
|
+
{"version":3,"file":"learnings-budget-check.js","sourceRoot":"","sources":["../../src/core/learnings-budget-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,19 +7,34 @@
|
|
|
7
7
|
export declare const LEARNING_CONFIDENCE_VALUES: readonly ["low", "medium", "high"];
|
|
8
8
|
/** Confidence vocabulary persisted in every learning entry. */
|
|
9
9
|
export type LearningConfidence = (typeof LEARNING_CONFIDENCE_VALUES)[number];
|
|
10
|
+
/** Exact persisted fields accepted from the compatibility-window v1 schema. */
|
|
11
|
+
export declare const LEGACY_LEARNING_ENTRY_FIELDS: readonly ["id", "rule", "why", "provenance", "first_learned", "last_confirmed", "confidence"];
|
|
12
|
+
/** Historical v1 byte ceiling, retained only for source-version validation. */
|
|
13
|
+
export declare const LEGACY_LEARNINGS_MAX_TOKENS = 12000;
|
|
14
|
+
/**
|
|
15
|
+
* Maximum UTF-8 bytes in a persisted id or fingerprint.
|
|
16
|
+
*
|
|
17
|
+
* Stable tokens are machine keys, not prose. Bounding them keeps comparison
|
|
18
|
+
* and diagnostics cheap and, critically, closes the v1 compatibility window:
|
|
19
|
+
* v1 duplicated every id into the new fingerprint field during migration.
|
|
20
|
+
*/
|
|
21
|
+
export declare const MAX_STABLE_TOKEN_BYTES = 128;
|
|
10
22
|
/**
|
|
11
23
|
* Average per-entry byte allowance used to DERIVE the whole-file byte budget
|
|
12
24
|
* (`maxTokens = maxEntries * PER_ENTRY_BYTE_ALLOWANCE`), so the entry cap and
|
|
13
|
-
* the byte cap can never contradict.
|
|
25
|
+
* the byte cap can never contradict. It is the historical v1 average plus the
|
|
26
|
+
* maximum bytes v2 adds when migration persists `fingerprint = id`:
|
|
27
|
+
* `600 + 17 + 128 = 745`. Therefore every accepted 12,000-byte v1 document
|
|
28
|
+
* with at most 20 bounded ids renders as v2 within 14,900 bytes.
|
|
14
29
|
*
|
|
15
30
|
* This is an AVERAGE budget, not a per-entry maximum: `maxTokens` is enforced
|
|
16
31
|
* against the whole rendered document — every entry plus the ```jsonl framing
|
|
17
|
-
* (~72 B observed) — and there is
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
32
|
+
* (~72 B observed) — and there is no aggregate per-entry byte cap (machine
|
|
33
|
+
* identity tokens have their migration bound, `rule` is char-capped at
|
|
34
|
+
* `maxRuleCharacters`, and `why` is bounded only by the document total). The
|
|
35
|
+
* v2 allowance includes the persisted fingerprint while preserving meaningful
|
|
36
|
+
* framing and variance headroom at the full 20-entry ceiling. A single
|
|
37
|
+
* pathologically large `why` can
|
|
23
38
|
* consume a disproportionate share; that is intended — the document total is the
|
|
24
39
|
* real constraint, and the near-boundary regression test pins that behavior.
|
|
25
40
|
*
|
|
@@ -28,10 +43,10 @@ export type LearningConfidence = (typeof LEARNING_CONFIDENCE_VALUES)[number];
|
|
|
28
43
|
* valid captures far under the entry ceiling (CodySwannGT/lisa#1959). Deriving
|
|
29
44
|
* the byte cap from the entry cap removes that contradiction at the source.
|
|
30
45
|
*/
|
|
31
|
-
export declare const PER_ENTRY_BYTE_ALLOWANCE
|
|
46
|
+
export declare const PER_ENTRY_BYTE_ALLOWANCE: number;
|
|
32
47
|
export declare const LEARNINGS_CONTRACT: Readonly<{
|
|
33
|
-
readonly version:
|
|
34
|
-
readonly fields: readonly ["id", "rule", "why", "provenance", "first_learned", "last_confirmed", "confidence"];
|
|
48
|
+
readonly version: 2;
|
|
49
|
+
readonly fields: readonly ["id", "fingerprint", "rule", "why", "provenance", "first_learned", "last_confirmed", "confidence"];
|
|
35
50
|
readonly maxRuleCharacters: 240;
|
|
36
51
|
readonly maxRuleLines: 2;
|
|
37
52
|
readonly maxProvenanceReferences: 20;
|
|
@@ -42,6 +57,8 @@ export declare const LEARNINGS_CONTRACT: Readonly<{
|
|
|
42
57
|
/** Complete persisted schema for one project learning. */
|
|
43
58
|
export interface LearningEntry {
|
|
44
59
|
readonly id: string;
|
|
60
|
+
/** Content-version token used for exact supersede compare-and-swap. */
|
|
61
|
+
readonly fingerprint: string;
|
|
45
62
|
readonly rule: string;
|
|
46
63
|
readonly why: string;
|
|
47
64
|
readonly provenance: readonly string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-contract.d.ts","sourceRoot":"","sources":["../../src/core/learnings-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,0BAA0B,oCAAqC,CAAC;AAE7E,+DAA+D;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAK7E
|
|
1
|
+
{"version":3,"file":"learnings-contract.d.ts","sourceRoot":"","sources":["../../src/core/learnings-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,0BAA0B,oCAAqC,CAAC;AAE7E,+DAA+D;AAC/D,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,0BAA0B,CAAC,CAAC,MAAM,CAAC,CAAC;AAK7E,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,+FAQ9B,CAAC;AAEZ,+EAA+E;AAC/E,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAK1C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,wBAAwB,QAGb,CAAC;AAEzB,eAAO,MAAM,kBAAkB;;;;;;;;;EAkBpB,CAAC;AAEZ,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D"}
|
|
@@ -7,19 +7,44 @@
|
|
|
7
7
|
export const LEARNING_CONFIDENCE_VALUES = ["low", "medium", "high"];
|
|
8
8
|
/** Maximum number of durable entries the ledger retains. */
|
|
9
9
|
const MAX_ENTRIES = 20;
|
|
10
|
+
/** Exact persisted fields accepted from the compatibility-window v1 schema. */
|
|
11
|
+
export const LEGACY_LEARNING_ENTRY_FIELDS = Object.freeze([
|
|
12
|
+
"id",
|
|
13
|
+
"rule",
|
|
14
|
+
"why",
|
|
15
|
+
"provenance",
|
|
16
|
+
"first_learned",
|
|
17
|
+
"last_confirmed",
|
|
18
|
+
"confidence",
|
|
19
|
+
]);
|
|
20
|
+
/** Historical v1 byte ceiling, retained only for source-version validation. */
|
|
21
|
+
export const LEGACY_LEARNINGS_MAX_TOKENS = 12_000;
|
|
22
|
+
/**
|
|
23
|
+
* Maximum UTF-8 bytes in a persisted id or fingerprint.
|
|
24
|
+
*
|
|
25
|
+
* Stable tokens are machine keys, not prose. Bounding them keeps comparison
|
|
26
|
+
* and diagnostics cheap and, critically, closes the v1 compatibility window:
|
|
27
|
+
* v1 duplicated every id into the new fingerprint field during migration.
|
|
28
|
+
*/
|
|
29
|
+
export const MAX_STABLE_TOKEN_BYTES = 128;
|
|
30
|
+
/** JSON bytes v2 adds around each migrated v1 id: `,"fingerprint":""`. */
|
|
31
|
+
const FINGERPRINT_FIELD_BYTE_OVERHEAD = 17;
|
|
10
32
|
/**
|
|
11
33
|
* Average per-entry byte allowance used to DERIVE the whole-file byte budget
|
|
12
34
|
* (`maxTokens = maxEntries * PER_ENTRY_BYTE_ALLOWANCE`), so the entry cap and
|
|
13
|
-
* the byte cap can never contradict.
|
|
35
|
+
* the byte cap can never contradict. It is the historical v1 average plus the
|
|
36
|
+
* maximum bytes v2 adds when migration persists `fingerprint = id`:
|
|
37
|
+
* `600 + 17 + 128 = 745`. Therefore every accepted 12,000-byte v1 document
|
|
38
|
+
* with at most 20 bounded ids renders as v2 within 14,900 bytes.
|
|
14
39
|
*
|
|
15
40
|
* This is an AVERAGE budget, not a per-entry maximum: `maxTokens` is enforced
|
|
16
41
|
* against the whole rendered document — every entry plus the ```jsonl framing
|
|
17
|
-
* (~72 B observed) — and there is
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
42
|
+
* (~72 B observed) — and there is no aggregate per-entry byte cap (machine
|
|
43
|
+
* identity tokens have their migration bound, `rule` is char-capped at
|
|
44
|
+
* `maxRuleCharacters`, and `why` is bounded only by the document total). The
|
|
45
|
+
* v2 allowance includes the persisted fingerprint while preserving meaningful
|
|
46
|
+
* framing and variance headroom at the full 20-entry ceiling. A single
|
|
47
|
+
* pathologically large `why` can
|
|
23
48
|
* consume a disproportionate share; that is intended — the document total is the
|
|
24
49
|
* real constraint, and the near-boundary regression test pins that behavior.
|
|
25
50
|
*
|
|
@@ -28,11 +53,14 @@ const MAX_ENTRIES = 20;
|
|
|
28
53
|
* valid captures far under the entry ceiling (CodySwannGT/lisa#1959). Deriving
|
|
29
54
|
* the byte cap from the entry cap removes that contradiction at the source.
|
|
30
55
|
*/
|
|
31
|
-
export const PER_ENTRY_BYTE_ALLOWANCE =
|
|
56
|
+
export const PER_ENTRY_BYTE_ALLOWANCE = LEGACY_LEARNINGS_MAX_TOKENS / MAX_ENTRIES +
|
|
57
|
+
FINGERPRINT_FIELD_BYTE_OVERHEAD +
|
|
58
|
+
MAX_STABLE_TOKEN_BYTES;
|
|
32
59
|
export const LEARNINGS_CONTRACT = Object.freeze({
|
|
33
|
-
version:
|
|
60
|
+
version: 2,
|
|
34
61
|
fields: Object.freeze([
|
|
35
62
|
"id",
|
|
63
|
+
"fingerprint",
|
|
36
64
|
"rule",
|
|
37
65
|
"why",
|
|
38
66
|
"provenance",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-contract.js","sourceRoot":"","sources":["../../src/core/learnings-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAK7E,4DAA4D;AAC5D,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB
|
|
1
|
+
{"version":3,"file":"learnings-contract.js","sourceRoot":"","sources":["../../src/core/learnings-contract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAU,CAAC;AAK7E,4DAA4D;AAC5D,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,+EAA+E;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,CAAC;IACxD,IAAI;IACJ,MAAM;IACN,KAAK;IACL,YAAY;IACZ,eAAe;IACf,gBAAgB;IAChB,YAAY;CACJ,CAAC,CAAC;AAEZ,+EAA+E;AAC/E,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,0EAA0E;AAC1E,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,2BAA2B,GAAG,WAAW;IACzC,+BAA+B;IAC/B,sBAAsB,CAAC;AAEzB,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,IAAI;QACJ,aAAa;QACb,MAAM;QACN,KAAK;QACL,YAAY;QACZ,eAAe;QACf,gBAAgB;QAChB,YAAY;KACJ,CAAC;IACX,iBAAiB,EAAE,GAAG;IACtB,YAAY,EAAE,CAAC;IACf,uBAAuB,EAAE,EAAE;IAC3B,UAAU,EAAE,WAAW;IACvB,SAAS,EAAE,WAAW,GAAG,wBAAwB;IACjD,WAAW,EAAE,wBAAwB;CAC7B,CAAC,CAAC;AAeZ;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -11,12 +11,30 @@ export declare const CONFLICT_MARKER_DIAGNOSIS = "Project learnings file contain
|
|
|
11
11
|
* @returns Canonical Markdown plus JSONL document
|
|
12
12
|
*/
|
|
13
13
|
export declare function renderLearningsFile(entries: readonly LearningEntry[]): string;
|
|
14
|
+
/** Metadata-preserving parse result for one supported source version. */
|
|
15
|
+
export interface ParsedLearningsDocument {
|
|
16
|
+
/** Contract version declared by the source bytes. */
|
|
17
|
+
readonly sourceVersion: 1 | 2;
|
|
18
|
+
/** Entries normalized to the current exact eight-field schema. */
|
|
19
|
+
readonly entries: readonly LearningEntry[];
|
|
20
|
+
/** Whether the bytes are canonical for their declared source version. */
|
|
21
|
+
readonly canonicalSource: boolean;
|
|
22
|
+
/** Byte ceiling that governed the source version before normalization. */
|
|
23
|
+
readonly sourceMaxTokens: number;
|
|
24
|
+
}
|
|
14
25
|
/**
|
|
15
26
|
* Parse and revalidate an existing file before it participates in a write.
|
|
16
27
|
* @param content - Existing learnings document
|
|
17
28
|
* @returns Revalidated entries from the document
|
|
18
29
|
*/
|
|
19
30
|
export declare function parseLearningsFile(content: string): LearningEntry[];
|
|
31
|
+
/**
|
|
32
|
+
* Parse a v1 or v2 document while retaining the source-version facts writers
|
|
33
|
+
* need to migrate only when they already have a reason to mutate.
|
|
34
|
+
* @param content - Existing learnings document
|
|
35
|
+
* @returns Normalized entries plus source-version and canonicality metadata
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseLearningsDocument(content: string): ParsedLearningsDocument;
|
|
20
38
|
/**
|
|
21
39
|
* A document that does not fit the hard entry-count or token budget.
|
|
22
40
|
*
|
|
@@ -40,8 +58,9 @@ export declare class LearningsBudgetError extends Error {
|
|
|
40
58
|
* @param content - Canonical document
|
|
41
59
|
* @param entryCount - Number of entries in the document
|
|
42
60
|
* @param context - Error-message prefix
|
|
61
|
+
* @param maxTokens - Source-version byte ceiling to enforce
|
|
43
62
|
*/
|
|
44
|
-
export declare function assertDocumentBudget(content: string, entryCount: number, context: string): void;
|
|
63
|
+
export declare function assertDocumentBudget(content: string, entryCount: number, context: string, maxTokens?: number): void;
|
|
45
64
|
/**
|
|
46
65
|
* Locate the first line git left a conflict marker on.
|
|
47
66
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-document.d.ts","sourceRoot":"","sources":["../../src/core/learnings-document.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,
|
|
1
|
+
{"version":3,"file":"learnings-document.d.ts","sourceRoot":"","sources":["../../src/core/learnings-document.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,yBAAyB,CAAC;AAsCjC;;;GAGG;AACH,eAAO,MAAM,yBAAyB,0DACmB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAG7E;AAED,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,qDAAqD;IACrD,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;IAC9B,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,yEAAyE;IACzE,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAEnE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,GACd,uBAAuB,CAsEzB;AAoCD;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C;;;OAGG;gBACS,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAqC,GAC/C,IAAI,CAYN;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAK1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAIvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,SAAS,CAEpB"}
|