@dzhechkov/harness-core 0.7.0 → 0.7.3
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/.dz-manifest.json +116 -56
- package/README.md +3 -0
- package/dist/event-chain.d.ts +50 -0
- package/dist/event-chain.d.ts.map +1 -1
- package/dist/event-chain.js +31 -0
- package/dist/event-chain.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/name-check.d.ts +98 -0
- package/dist/name-check.d.ts.map +1 -0
- package/dist/name-check.js +333 -0
- package/dist/name-check.js.map +1 -0
- package/dist/operations.d.ts.map +1 -1
- package/dist/operations.js +25 -4
- package/dist/operations.js.map +1 -1
- package/dist/provenance.d.ts +100 -92
- package/dist/provenance.d.ts.map +1 -1
- package/dist/provenance.js +122 -122
- package/dist/provenance.js.map +1 -1
- package/dist/recall-domain-boost.d.ts +10 -3
- package/dist/recall-domain-boost.d.ts.map +1 -1
- package/dist/recall-domain-boost.js +7 -0
- package/dist/recall-domain-boost.js.map +1 -1
- package/dist/recall-hook-policy.d.ts +15 -0
- package/dist/recall-hook-policy.d.ts.map +1 -1
- package/dist/recall-hook-policy.js +59 -0
- package/dist/recall-hook-policy.js.map +1 -1
- package/dist/recap.d.ts +146 -0
- package/dist/recap.d.ts.map +1 -0
- package/dist/recap.js +346 -0
- package/dist/recap.js.map +1 -0
- package/dist/retro.d.ts +131 -0
- package/dist/retro.d.ts.map +1 -0
- package/dist/retro.js +207 -0
- package/dist/retro.js.map +1 -0
- package/dist/score.d.ts +21 -0
- package/dist/score.d.ts.map +1 -1
- package/dist/score.js +44 -3
- package/dist/score.js.map +1 -1
- package/dist/sign.d.ts +14 -2
- package/dist/sign.d.ts.map +1 -1
- package/dist/sign.js +140 -7
- package/dist/sign.js.map +1 -1
- package/dist/vector-tier.d.ts +54 -0
- package/dist/vector-tier.d.ts.map +1 -1
- package/dist/vector-tier.js +69 -8
- package/dist/vector-tier.js.map +1 -1
- package/package.json +6 -6
- package/sbom.json +205 -55
- package/src/event-chain.ts +64 -0
- package/src/index.ts +12 -0
- package/src/name-check.ts +331 -0
- package/src/operations.ts +26 -5
- package/src/provenance.ts +217 -0
- package/src/recall-domain-boost.ts +10 -3
- package/src/recall-hook-policy.ts +60 -0
- package/src/recap.ts +462 -0
- package/src/score.ts +53 -3
- package/src/sign.ts +129 -7
- package/src/vector-tier.ts +109 -10
package/dist/recap.d.ts
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dz recap` — what was done over a day, a week or a month.
|
|
3
|
+
*
|
|
4
|
+
* This module is PURE: no filesystem, no network, and — load-bearing — no clock. The window arrives
|
|
5
|
+
* as a parameter, because a window you cannot pin in a test is a window whose arithmetic errors you
|
|
6
|
+
* cannot catch. MEASURED in this project 2026-08-22: an agent's timestamp was off by a YEAR, the
|
|
7
|
+
* query returned 15 530 "hits" for a "week", and nothing about the output looked wrong.
|
|
8
|
+
*
|
|
9
|
+
* Its second job is refusing. Half of an honest report is declining to answer what the data cannot
|
|
10
|
+
* support, and those refusals live here as behaviour — types that cannot express a quarter, a
|
|
11
|
+
* decision function that names the real span in days, and a three-state section verdict where
|
|
12
|
+
* "the source said nothing" and "the source was not read" can never collapse into one zero.
|
|
13
|
+
*
|
|
14
|
+
* See features/dz-recap/03_adr/ for the decisions and the measurements behind them.
|
|
15
|
+
*/
|
|
16
|
+
/** The only horizons this project has the data for. A quarter or a year is NOT SPELLABLE (ADR-001). */
|
|
17
|
+
export type RecapHorizon = 'day' | 'week' | 'month';
|
|
18
|
+
/** Horizons a user may ASK for — recognised so they are refused loudly, never swallowed. */
|
|
19
|
+
export type RefusedHorizon = 'quarter' | 'half-year' | 'year';
|
|
20
|
+
export declare const REFUSED_HORIZONS: readonly RefusedHorizon[];
|
|
21
|
+
export declare const RECAP_HORIZONS: readonly RecapHorizon[];
|
|
22
|
+
export interface RecapWindow {
|
|
23
|
+
readonly horizon: RecapHorizon;
|
|
24
|
+
/** Inclusive ISO date (YYYY-MM-DD) of the first day in the window. */
|
|
25
|
+
readonly startIso: string;
|
|
26
|
+
/** Inclusive ISO date of the last day — the anchor. */
|
|
27
|
+
readonly endIso: string;
|
|
28
|
+
readonly days: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The window for a horizon, anchored on an EXPLICIT date. Never reads the clock.
|
|
32
|
+
* `atIso` may be a full timestamp; only its date part is used.
|
|
33
|
+
*/
|
|
34
|
+
export declare function recapWindow(horizon: RecapHorizon, atIso: string): RecapWindow;
|
|
35
|
+
/** Is this instant inside the window? Compared in UTC, never as strings (ADR/AM-5). */
|
|
36
|
+
export declare function withinWindow(w: RecapWindow, isoInstant: string): boolean;
|
|
37
|
+
export interface HorizonDecision {
|
|
38
|
+
readonly action: 'report' | 'refuse';
|
|
39
|
+
readonly reason: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* May we report over the requested horizon at all?
|
|
43
|
+
*
|
|
44
|
+
* `spanDays` is the age of the LONGEST record we actually hold. Asking for a year over 174 days of
|
|
45
|
+
* data is not a thin report — it is an invented one, so it is refused and the real span is named.
|
|
46
|
+
*/
|
|
47
|
+
export declare function decideHorizon(input: {
|
|
48
|
+
requested: string;
|
|
49
|
+
spanDays: number;
|
|
50
|
+
}): HorizonDecision;
|
|
51
|
+
export type SectionStatus = 'full' | 'partial' | 'unavailable';
|
|
52
|
+
export interface SectionVerdict {
|
|
53
|
+
readonly status: SectionStatus;
|
|
54
|
+
/** The date this source's records begin — computed from the source itself, never hardcoded. */
|
|
55
|
+
readonly dataStart: string | null;
|
|
56
|
+
readonly note: string;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Does this source cover the whole window?
|
|
60
|
+
*
|
|
61
|
+
* `dataStart: null` means the source was NOT READ — a different fact from "read, and empty".
|
|
62
|
+
* Collapsing the two is how a report says "nothing happened" about a week it could not see.
|
|
63
|
+
*/
|
|
64
|
+
export declare function sectionStatus(input: {
|
|
65
|
+
dataStart: string | null;
|
|
66
|
+
windowStart: string;
|
|
67
|
+
windowEnd?: string;
|
|
68
|
+
}): SectionVerdict;
|
|
69
|
+
export interface ForbiddenMetric {
|
|
70
|
+
readonly name: string;
|
|
71
|
+
/** The measurement that disqualifies it. A bare ban decays into a word list. */
|
|
72
|
+
readonly reason: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Measures of the INSTRUMENT, not of the work (ADR-003). Each will be proposed again precisely
|
|
76
|
+
* because each is a one-liner to compute, so each carries the measurement that refutes it.
|
|
77
|
+
*/
|
|
78
|
+
export declare const FORBIDDEN_METRICS: readonly ForbiddenMetric[];
|
|
79
|
+
/**
|
|
80
|
+
* A delivery, with the grade its report STATES.
|
|
81
|
+
*
|
|
82
|
+
* A discriminated union, not a status plus a nullable field: the pair `{gradeStatus: 'unique',
|
|
83
|
+
* grade: null}` used to be spellable, and it printed `1 carry a grade …: null×1` — a count of
|
|
84
|
+
* graded deliveries backed by no grade (cross-family QE round 4, codex gpt-5.6-sol, 2026-08-22).
|
|
85
|
+
* The union makes that pair a compile error, and `normaliseDelivery` catches it at runtime for
|
|
86
|
+
* callers who reach this from JavaScript.
|
|
87
|
+
*/
|
|
88
|
+
export type Delivery = {
|
|
89
|
+
readonly slug: string;
|
|
90
|
+
readonly createdIso: string;
|
|
91
|
+
readonly gradeStatus: 'unique';
|
|
92
|
+
readonly grade: string;
|
|
93
|
+
} | {
|
|
94
|
+
readonly slug: string;
|
|
95
|
+
readonly createdIso: string;
|
|
96
|
+
readonly gradeStatus: 'ambiguous' | 'none' | 'no-report';
|
|
97
|
+
readonly grade: null;
|
|
98
|
+
};
|
|
99
|
+
export interface Publish {
|
|
100
|
+
readonly pkg: string;
|
|
101
|
+
readonly version: string;
|
|
102
|
+
readonly iso: string;
|
|
103
|
+
}
|
|
104
|
+
export interface GuardRun {
|
|
105
|
+
readonly iso: string;
|
|
106
|
+
readonly verdict: string;
|
|
107
|
+
readonly rules: readonly string[];
|
|
108
|
+
}
|
|
109
|
+
export interface ReuseFacts {
|
|
110
|
+
readonly dataStart: string | null;
|
|
111
|
+
readonly eventsInWindow: number;
|
|
112
|
+
readonly lessonsEverRecalled: number;
|
|
113
|
+
readonly lessonsTotal: number;
|
|
114
|
+
}
|
|
115
|
+
export interface SourceFacts<T> {
|
|
116
|
+
readonly dataStart: string | null;
|
|
117
|
+
readonly items: readonly T[];
|
|
118
|
+
}
|
|
119
|
+
export interface RecapFacts {
|
|
120
|
+
readonly window: RecapWindow;
|
|
121
|
+
/** The longest record we hold, in days — what `decideHorizon` judges against. */
|
|
122
|
+
readonly spanDays: number;
|
|
123
|
+
/** `null` means NOT READ. An empty `items` means read-and-empty. The type keeps them apart. */
|
|
124
|
+
readonly deliveries: SourceFacts<Delivery> | null;
|
|
125
|
+
readonly publishes: SourceFacts<Publish> | null;
|
|
126
|
+
readonly guard: SourceFacts<GuardRun> | null;
|
|
127
|
+
readonly reuse: ReuseFacts | null;
|
|
128
|
+
/** Feature dirs on disk that git has never seen — the report is blind to them, and says so. */
|
|
129
|
+
readonly uncommittedSlugs: readonly string[];
|
|
130
|
+
}
|
|
131
|
+
export interface RecapSection {
|
|
132
|
+
readonly id: 'deliveries' | 'publishes' | 'discipline' | 'reuse';
|
|
133
|
+
readonly title: string;
|
|
134
|
+
readonly verdict: SectionVerdict;
|
|
135
|
+
readonly lines: readonly string[];
|
|
136
|
+
}
|
|
137
|
+
export interface RecapReport {
|
|
138
|
+
readonly window: RecapWindow;
|
|
139
|
+
readonly spanDays: number;
|
|
140
|
+
readonly sections: readonly RecapSection[];
|
|
141
|
+
readonly caveats: readonly string[];
|
|
142
|
+
}
|
|
143
|
+
export declare function buildRecap(facts: RecapFacts): RecapReport;
|
|
144
|
+
/** The human rendering. `--json` prints the SAME `RecapReport` — one structure, two spellings (FR-6). */
|
|
145
|
+
export declare function renderRecap(report: RecapReport): string[];
|
|
146
|
+
//# sourceMappingURL=recap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recap.d.ts","sourceRoot":"","sources":["../src/recap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,uGAAuG;AACvG,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEpD,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;AAE9D,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAAqC,CAAC;AAE5F,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAA6B,CAAC;AAKhF,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAqBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAc7E;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAUxE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,eAAe,CAqD7F;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;AAE/D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,cAAc,CAwB1H;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,eAAe,EAOvD,CAAC;AAIF;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9G;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAU3I,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAClC,+FAA+F;IAC/F,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAiDD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,CAsGzD;AAQD,yGAAyG;AACzG,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CAazD"}
|
package/dist/recap.js
ADDED
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `dz recap` — what was done over a day, a week or a month.
|
|
3
|
+
*
|
|
4
|
+
* This module is PURE: no filesystem, no network, and — load-bearing — no clock. The window arrives
|
|
5
|
+
* as a parameter, because a window you cannot pin in a test is a window whose arithmetic errors you
|
|
6
|
+
* cannot catch. MEASURED in this project 2026-08-22: an agent's timestamp was off by a YEAR, the
|
|
7
|
+
* query returned 15 530 "hits" for a "week", and nothing about the output looked wrong.
|
|
8
|
+
*
|
|
9
|
+
* Its second job is refusing. Half of an honest report is declining to answer what the data cannot
|
|
10
|
+
* support, and those refusals live here as behaviour — types that cannot express a quarter, a
|
|
11
|
+
* decision function that names the real span in days, and a three-state section verdict where
|
|
12
|
+
* "the source said nothing" and "the source was not read" can never collapse into one zero.
|
|
13
|
+
*
|
|
14
|
+
* See features/dz-recap/03_adr/ for the decisions and the measurements behind them.
|
|
15
|
+
*/
|
|
16
|
+
export const REFUSED_HORIZONS = ['quarter', 'half-year', 'year'];
|
|
17
|
+
export const RECAP_HORIZONS = ['day', 'week', 'month'];
|
|
18
|
+
const HORIZON_DAYS = { day: 1, week: 7, month: 30 };
|
|
19
|
+
const REFUSED_DAYS = { quarter: 90, 'half-year': 182, year: 365 };
|
|
20
|
+
const DAY_MS = 86_400_000;
|
|
21
|
+
function isoDay(value) {
|
|
22
|
+
return value.slice(0, 10);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Does this calendar day exist?
|
|
26
|
+
*
|
|
27
|
+
* `Date.parse` ROLLS OVER an impossible day — 2026-02-31 becomes 2026-03-03 — so a NaN check alone
|
|
28
|
+
* lets a nonexistent date behave like a real one. It bit twice: once producing a reversed window
|
|
29
|
+
* (round 1) and once letting a record dated 2026-02-31 be counted inside a March window (round 10,
|
|
30
|
+
* cross-family QE, codex gpt-5.6-sol, 2026-08-22).
|
|
31
|
+
*/
|
|
32
|
+
function isRealIsoDay(day) {
|
|
33
|
+
const ms = Date.parse(`${day}T00:00:00.000Z`);
|
|
34
|
+
return !Number.isNaN(ms) && new Date(ms).toISOString().slice(0, 10) === day;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The window for a horizon, anchored on an EXPLICIT date. Never reads the clock.
|
|
38
|
+
* `atIso` may be a full timestamp; only its date part is used.
|
|
39
|
+
*/
|
|
40
|
+
export function recapWindow(horizon, atIso) {
|
|
41
|
+
const end = isoDay(atIso);
|
|
42
|
+
const endMs = Date.parse(`${end}T00:00:00.000Z`);
|
|
43
|
+
if (Number.isNaN(endMs))
|
|
44
|
+
throw new Error(`recapWindow: not an ISO date: ${JSON.stringify(atIso)}`);
|
|
45
|
+
// A NaN check is not enough: `Date.parse` ROLLS OVER an impossible day, so '2026-02-31' parses to
|
|
46
|
+
// 2026-03-03 and produced a window whose start was AFTER its end — an internally reversed window
|
|
47
|
+
// that reported on nothing and said nothing about it (cross-family QE, codex gpt-5.6-sol,
|
|
48
|
+
// 2026-08-22, grade F finding 1). The date must survive the round trip to be that date.
|
|
49
|
+
if (new Date(endMs).toISOString().slice(0, 10) !== end) {
|
|
50
|
+
throw new Error(`recapWindow: no such date: ${JSON.stringify(atIso)}`);
|
|
51
|
+
}
|
|
52
|
+
const days = HORIZON_DAYS[horizon];
|
|
53
|
+
const startMs = endMs - (days - 1) * DAY_MS;
|
|
54
|
+
return { horizon, startIso: new Date(startMs).toISOString().slice(0, 10), endIso: end, days };
|
|
55
|
+
}
|
|
56
|
+
/** Is this instant inside the window? Compared in UTC, never as strings (ADR/AM-5). */
|
|
57
|
+
export function withinWindow(w, isoInstant) {
|
|
58
|
+
// A record dated on a day that does not exist is not a record about any day in this window. Left
|
|
59
|
+
// to `Date.parse` alone, 2026-02-31 rolls to 2026-03-03 and would be counted in a March window
|
|
60
|
+
// (round 10) — a count backed by a date nobody could have written.
|
|
61
|
+
if (!isRealIsoDay(isoDay(isoInstant)))
|
|
62
|
+
return false;
|
|
63
|
+
const t = Date.parse(isoInstant);
|
|
64
|
+
if (Number.isNaN(t))
|
|
65
|
+
return false;
|
|
66
|
+
const from = Date.parse(`${w.startIso}T00:00:00.000Z`);
|
|
67
|
+
const to = Date.parse(`${w.endIso}T00:00:00.000Z`) + DAY_MS;
|
|
68
|
+
return t >= from && t < to;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* May we report over the requested horizon at all?
|
|
72
|
+
*
|
|
73
|
+
* `spanDays` is the age of the LONGEST record we actually hold. Asking for a year over 174 days of
|
|
74
|
+
* data is not a thin report — it is an invented one, so it is refused and the real span is named.
|
|
75
|
+
*/
|
|
76
|
+
export function decideHorizon(input) {
|
|
77
|
+
const req = input.requested.trim().toLowerCase();
|
|
78
|
+
// An unknown span is NOT a span of zero. Coercing NaN to 0 made the refusal say "we hold 0",
|
|
79
|
+
// which is a claim about the records; all we know is that we could not measure them (round 14,
|
|
80
|
+
// codex gpt-5.6-sol, 2026-08-22). The refusal itself was already correct — only its reason lied.
|
|
81
|
+
const known = Number.isFinite(input.spanDays);
|
|
82
|
+
const span = known ? Math.max(0, Math.floor(input.spanDays)) : 0;
|
|
83
|
+
const held = known ? `${span} day(s)` : 'an unmeasurable amount';
|
|
84
|
+
if (!known) {
|
|
85
|
+
return { action: 'refuse', reason: `the span of the records could not be measured, so no horizon can be supported — ${JSON.stringify(input.spanDays)} is not a number of days` };
|
|
86
|
+
}
|
|
87
|
+
// `in` walks the PROTOTYPE CHAIN, so `'constructor'` and `'toString'` passed as supported
|
|
88
|
+
// horizons and the reason came back as `function Object() { [native code] } day(s)` — a report
|
|
89
|
+
// authorised for a horizon that does not exist (round 11, codex gpt-5.6-sol, 2026-08-22).
|
|
90
|
+
if (RECAP_HORIZONS.includes(req)) {
|
|
91
|
+
const need = HORIZON_DAYS[req];
|
|
92
|
+
if (span < need) {
|
|
93
|
+
return {
|
|
94
|
+
action: 'refuse',
|
|
95
|
+
reason: `a ${req} needs ${need} day(s) of records and we hold ${held} — reporting it would invent the difference`,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
return { action: 'report', reason: `${req}: ${need} day(s) against ${span} day(s) of records` };
|
|
99
|
+
}
|
|
100
|
+
if (REFUSED_HORIZONS.includes(req)) {
|
|
101
|
+
const need = REFUSED_DAYS[req];
|
|
102
|
+
// The reason is DERIVED from the span, never asserted. The first version hardcoded "there is
|
|
103
|
+
// exactly one complete quarter" — true of this repository on the day it was written, false for
|
|
104
|
+
// any other span, and printed verbatim even when the records held a single day (cross-family QE
|
|
105
|
+
// round 5, codex gpt-5.6-sol, 2026-08-22). A refusal that over-claims is the same defect as a
|
|
106
|
+
// report that over-claims.
|
|
107
|
+
// TWO DIFFERENT refusals, and conflating them made the message false in one of them (round 6):
|
|
108
|
+
// with 180 days of records a quarter is NOT short of data, so "it would invent the difference"
|
|
109
|
+
// claimed a difference that does not exist. The horizon is refused BY DESIGN — this tool reports
|
|
110
|
+
// day, week and month — and only sometimes ALSO short of data.
|
|
111
|
+
if (span < need) {
|
|
112
|
+
return {
|
|
113
|
+
action: 'refuse',
|
|
114
|
+
reason: `a ${req} needs about ${need} days of records and the longest record here spans ${span} day(s), so reporting it would invent the difference`,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Round 7: the previous wording asserted that "the sections here begin on DIFFERENT dates" —
|
|
118
|
+
// true of this repository, but NOT DERIVABLE from anything this function receives. It is given
|
|
119
|
+
// a horizon and a span; a reason built from anything else is a claim its own inputs cannot
|
|
120
|
+
// support, which is the very failure this module exists to prevent. So it says only that, and
|
|
121
|
+
// the design rationale lives where the evidence for it lives (ADR-001, and each section's own
|
|
122
|
+
// data-start date in the report).
|
|
123
|
+
return {
|
|
124
|
+
action: 'refuse',
|
|
125
|
+
reason: `a ${req} is not a supported horizon — this reports a day, a week or a month. The records span ${span} day(s)`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return { action: 'refuse', reason: `unknown horizon ${JSON.stringify(input.requested)} — use --day, --week or --month` };
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Does this source cover the whole window?
|
|
132
|
+
*
|
|
133
|
+
* `dataStart: null` means the source was NOT READ — a different fact from "read, and empty".
|
|
134
|
+
* Collapsing the two is how a report says "nothing happened" about a week it could not see.
|
|
135
|
+
*/
|
|
136
|
+
export function sectionStatus(input) {
|
|
137
|
+
if (input.dataStart === null) {
|
|
138
|
+
return { status: 'unavailable', dataStart: null, note: 'source not read — this section says nothing, which is not the same as zero' };
|
|
139
|
+
}
|
|
140
|
+
const start = isoDay(input.dataStart);
|
|
141
|
+
// Round 13: an impossible `dataStart` (2026-02-31) was accepted and reported as covering the
|
|
142
|
+
// whole window. A date that does not exist cannot support a coverage claim — the same rule
|
|
143
|
+
// already applied to the window anchor and to record membership, now applied here too.
|
|
144
|
+
if (!isRealIsoDay(start)) {
|
|
145
|
+
return { status: 'unavailable', dataStart: null, note: `the recorded start date ${JSON.stringify(input.dataStart)} is not a real date — this section cannot be trusted to cover anything` };
|
|
146
|
+
}
|
|
147
|
+
if (start <= isoDay(input.windowStart)) {
|
|
148
|
+
return { status: 'full', dataStart: start, note: `records cover the whole window (from ${start})` };
|
|
149
|
+
}
|
|
150
|
+
// Round 8 (codex gpt-5.6-sol, 2026-08-22): the note said the records begin "inside the window",
|
|
151
|
+
// which this function could not know — it was never given the window's END. Two consequences:
|
|
152
|
+
// the wording now claims only what the inputs support, and when the end IS supplied, records
|
|
153
|
+
// that begin after it are reported as covering nothing rather than as a partial view.
|
|
154
|
+
const end = input.windowEnd === undefined ? null : isoDay(input.windowEnd);
|
|
155
|
+
if (end !== null && start > end) {
|
|
156
|
+
return { status: 'unavailable', dataStart: start, note: `records only begin ${start}, after this window ends — this source says nothing about it` };
|
|
157
|
+
}
|
|
158
|
+
const where = end === null ? 'after this window starts' : 'inside the window';
|
|
159
|
+
return { status: 'partial', dataStart: start, note: `records only begin ${start}, ${where} — everything before that is unknown, not absent` };
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Measures of the INSTRUMENT, not of the work (ADR-003). Each will be proposed again precisely
|
|
163
|
+
* because each is a one-liner to compute, so each carries the measurement that refutes it.
|
|
164
|
+
*/
|
|
165
|
+
export const FORBIDDEN_METRICS = [
|
|
166
|
+
{ name: 'commit count', reason: 'this project mandates a commit per logical change; 1318 commits over 66 active days measures compliance with that rule, not output (MEASURED 2026-08-22)' },
|
|
167
|
+
{ name: 'lines changed', reason: 'generated artifacts dominate — 352 of 1318 commits are docs, and one pipeline run writes 8-10 files before a line of product code exists' },
|
|
168
|
+
{ name: 'token spend', reason: 'self-declared an estimate, once wrong sixfold, covers 17 days, and 20 of 86 ledger rows carry no number by construction' },
|
|
169
|
+
{ name: 'learning event volume', reason: '640 in May against 10454 in August, but the sources are post-edit and post-command hooks: the curve measures when hooks were installed' },
|
|
170
|
+
{ name: 'inventory counts', reason: 'skills, packages and tests only ever grow, so they can only ever flatter' },
|
|
171
|
+
{ name: 'learned lesson count', reason: 'already refuted by this project’s own dz compounding: 54% of the pool has never been read by anyone' },
|
|
172
|
+
];
|
|
173
|
+
/** A `unique` with no usable grade is not a graded delivery; it is a report we could not read. */
|
|
174
|
+
function normaliseDelivery(d) {
|
|
175
|
+
if (d.gradeStatus === 'unique' && (typeof d.grade !== 'string' || d.grade.trim() === '')) {
|
|
176
|
+
return { slug: d.slug, createdIso: d.createdIso, gradeStatus: 'none', grade: null };
|
|
177
|
+
}
|
|
178
|
+
return d;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The window narrowed to what this source's records actually cover.
|
|
182
|
+
*
|
|
183
|
+
* Round 3 of the cross-family review (codex gpt-5.6-sol, 2026-08-22): labelling the covered range
|
|
184
|
+
* was not enough while the COUNT was still taken over the whole window. An item dated inside the
|
|
185
|
+
* window but before the records begin was counted, under a label promising a later range — an
|
|
186
|
+
* unsupported number wearing an honest caption. Filtering on the narrowed window makes the count
|
|
187
|
+
* and the caption agree BY CONSTRUCTION, which no assertion can undo.
|
|
188
|
+
*/
|
|
189
|
+
function coveredWindow(v, w) {
|
|
190
|
+
if (v.status !== 'partial' || v.dataStart === null)
|
|
191
|
+
return w;
|
|
192
|
+
const startIso = v.dataStart > w.startIso ? v.dataStart : w.startIso;
|
|
193
|
+
const days = Math.round((Date.parse(`${w.endIso}T00:00:00Z`) - Date.parse(`${startIso}T00:00:00Z`)) / DAY_MS) + 1;
|
|
194
|
+
return { horizon: w.horizon, startIso, endIso: w.endIso, days: Math.max(0, days) };
|
|
195
|
+
}
|
|
196
|
+
const UNAVAILABLE_LINES = ['not read — this section cannot say anything about this window'];
|
|
197
|
+
function emptyOrUnavailable(v, emptyLine) {
|
|
198
|
+
return v.status === 'unavailable' ? [...UNAVAILABLE_LINES] : [emptyLine];
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The safety property, enforced at ONE place rather than trusted at four.
|
|
202
|
+
*
|
|
203
|
+
* A source with no `dataStart` was NOT READ, and a section that was not read must not present
|
|
204
|
+
* counts — whatever items happen to sit alongside. The first version branched on `items.length`
|
|
205
|
+
* first, so `{dataStart: null, items: [...]}` printed "1 feature directory created" under an
|
|
206
|
+
* `unavailable` verdict: unsupported numbers, which is exactly what this feature exists to prevent
|
|
207
|
+
* (cross-family QE, codex gpt-5.6-sol, 2026-08-22, grade F finding 2).
|
|
208
|
+
*/
|
|
209
|
+
function sectionLines(v, window, compute) {
|
|
210
|
+
if (v.status === 'unavailable')
|
|
211
|
+
return [...UNAVAILABLE_LINES];
|
|
212
|
+
if (v.status === 'partial') {
|
|
213
|
+
// Round 2 of the same review found the identical honesty failure one level up: a `partial`
|
|
214
|
+
// section printed WHOLE-WINDOW counts, and a zero read as "nothing happened all week" when the
|
|
215
|
+
// first days of the week simply have no records. A count here is supported only over the range
|
|
216
|
+
// the records actually cover, so it is labelled with that range and never with the window.
|
|
217
|
+
const covered = `${v.dataStart} … ${window.endIso}`;
|
|
218
|
+
return [
|
|
219
|
+
`these numbers cover ONLY ${covered} — ${window.startIso} to the day before ${v.dataStart} has no records, so it is unknown, not zero`,
|
|
220
|
+
...compute(`the covered range (${covered})`),
|
|
221
|
+
];
|
|
222
|
+
}
|
|
223
|
+
return compute('this window');
|
|
224
|
+
}
|
|
225
|
+
export function buildRecap(facts) {
|
|
226
|
+
const ws = facts.window.startIso;
|
|
227
|
+
const we = facts.window.endIso;
|
|
228
|
+
const sections = [];
|
|
229
|
+
// 1. Deliveries
|
|
230
|
+
{
|
|
231
|
+
const v = sectionStatus({ dataStart: facts.deliveries?.dataStart ?? null, windowStart: ws, windowEnd: we });
|
|
232
|
+
const covered = coveredWindow(v, facts.window);
|
|
233
|
+
const items = (facts.deliveries?.items ?? []).map(normaliseDelivery).filter((d) => withinWindow(covered, d.createdIso));
|
|
234
|
+
const graded = items.filter((d) => d.gradeStatus === 'unique');
|
|
235
|
+
const ambiguous = items.filter((d) => d.gradeStatus === 'ambiguous');
|
|
236
|
+
const ungraded = items.filter((d) => d.gradeStatus === 'none' || d.gradeStatus === 'no-report');
|
|
237
|
+
const lines = sectionLines(v, facts.window, (scope) => items.length === 0
|
|
238
|
+
? emptyOrUnavailable(v, `no feature directories were created in ${scope}`)
|
|
239
|
+
: [
|
|
240
|
+
`${items.length} feature director${items.length === 1 ? 'y' : 'ies'} created in ${scope}`,
|
|
241
|
+
`${graded.length} carry a grade an independent review stated unambiguously${graded.length > 0 ? `: ${tally(graded.map((d) => d.grade))}` : ''}`,
|
|
242
|
+
`${ambiguous.length} have a report that states MORE THAN ONE grade — reported as ambiguous, never guessed`,
|
|
243
|
+
`${ungraded.length} have no letter grade in their report, or no report at all`,
|
|
244
|
+
'cadence is not value: this counts deliveries, not what they were worth',
|
|
245
|
+
]);
|
|
246
|
+
sections.push({ id: 'deliveries', title: 'Deliveries', verdict: v, lines });
|
|
247
|
+
}
|
|
248
|
+
// 2. Publishes
|
|
249
|
+
{
|
|
250
|
+
const v = sectionStatus({ dataStart: facts.publishes?.dataStart ?? null, windowStart: ws, windowEnd: we });
|
|
251
|
+
const covered = coveredWindow(v, facts.window);
|
|
252
|
+
const items = (facts.publishes?.items ?? []).filter((p) => withinWindow(covered, p.iso));
|
|
253
|
+
const pkgs = new Set(items.map((p) => p.pkg));
|
|
254
|
+
const lines = sectionLines(v, facts.window, (scope) => items.length === 0
|
|
255
|
+
? emptyOrUnavailable(v, `no versions were accepted by the registry in ${scope}`)
|
|
256
|
+
: [
|
|
257
|
+
`${items.length} version(s) accepted by the registry across ${pkgs.size} package(s) in ${scope}`,
|
|
258
|
+
'timestamps are the registry’s own — this is the one record here nobody local can backdate',
|
|
259
|
+
]);
|
|
260
|
+
sections.push({ id: 'publishes', title: 'Publishes', verdict: v, lines });
|
|
261
|
+
}
|
|
262
|
+
// 3. Discipline — DESCRIBES, never compares (ADR-004)
|
|
263
|
+
{
|
|
264
|
+
const v = sectionStatus({ dataStart: facts.guard?.dataStart ?? null, windowStart: ws, windowEnd: we });
|
|
265
|
+
const covered = coveredWindow(v, facts.window);
|
|
266
|
+
const runs = (facts.guard?.items ?? []).filter((g) => withinWindow(covered, g.iso));
|
|
267
|
+
const byVerdict = new Map();
|
|
268
|
+
const byRule = new Map();
|
|
269
|
+
for (const r of runs) {
|
|
270
|
+
byVerdict.set(r.verdict, (byVerdict.get(r.verdict) ?? 0) + 1);
|
|
271
|
+
for (const rule of r.rules)
|
|
272
|
+
byRule.set(rule, (byRule.get(rule) ?? 0) + 1);
|
|
273
|
+
}
|
|
274
|
+
const lines = sectionLines(v, facts.window, (scope) => runs.length === 0
|
|
275
|
+
? emptyOrUnavailable(v, `no gate runs were recorded in ${scope}`)
|
|
276
|
+
: [
|
|
277
|
+
`${runs.length} gate run(s) in ${scope}: ${[...byVerdict.entries()].map(([k, n]) => `${k} ${n}`).join(', ')}`,
|
|
278
|
+
byRule.size === 0
|
|
279
|
+
? `no rule was violated in ${scope}`
|
|
280
|
+
: `violations by rule: ${[...byRule.entries()].sort((a, b) => b[1] - a[1]).map(([k, n]) => `${k} ${n}`).join(', ')}`,
|
|
281
|
+
]);
|
|
282
|
+
// The caveat is mandatory for every section that HAS data — but not for one that has none.
|
|
283
|
+
// Round 9 (codex gpt-5.6-sol, 2026-08-22): pushed unconditionally, an unread section claimed "a
|
|
284
|
+
// missing rule was never violated or did not yet exist", when with no log a missing rule may
|
|
285
|
+
// simply have fired unseen; and "this section describes the window" was false of a section
|
|
286
|
+
// describing nothing. A caveat that over-claims is still an over-claim.
|
|
287
|
+
if (v.status !== 'unavailable') {
|
|
288
|
+
// The caveat must be exactly as strong as the coverage. On a PARTIAL section a missing rule
|
|
289
|
+
// has a THIRD possible history — violated in the part these records do not reach — and the
|
|
290
|
+
// two-option wording denied it (round 12, codex gpt-5.6-sol, 2026-08-22).
|
|
291
|
+
lines.push(v.status === 'partial'
|
|
292
|
+
? 'a rule missing from this list was never violated in the covered range, did not yet exist, or was violated before these records begin — the log records a rule only when it fires, so it cannot tell those apart'
|
|
293
|
+
: 'a rule missing from this list was either never violated or did not yet exist — the log records a rule only when it fires, so it cannot tell those apart');
|
|
294
|
+
lines.push('this section describes the records it has; it deliberately computes no comparison between periods');
|
|
295
|
+
}
|
|
296
|
+
sections.push({ id: 'discipline', title: 'Discipline', verdict: v, lines });
|
|
297
|
+
}
|
|
298
|
+
// 4. Knowledge reuse
|
|
299
|
+
{
|
|
300
|
+
const v = sectionStatus({ dataStart: facts.reuse?.dataStart ?? null, windowStart: ws, windowEnd: we });
|
|
301
|
+
const r = facts.reuse;
|
|
302
|
+
// `eventsInWindow` arrives ALREADY aggregated over the requested window, so unlike every other
|
|
303
|
+
// section it cannot be re-filtered to the covered range here. A partial reuse section therefore
|
|
304
|
+
// withholds the event count rather than captioning it with a range it does not match.
|
|
305
|
+
const lines = sectionLines(v, facts.window, (scope) => r === null || r.lessonsTotal === 0
|
|
306
|
+
? emptyOrUnavailable(v, `no lessons are stored, so there is nothing to reuse in ${scope}`)
|
|
307
|
+
: [
|
|
308
|
+
v.status === 'partial'
|
|
309
|
+
? 'the recall-event count is withheld: it was aggregated over the whole window, which these records do not cover'
|
|
310
|
+
: `${r.eventsInWindow} recall event(s) in ${scope}`,
|
|
311
|
+
`${r.lessonsEverRecalled} of ${r.lessonsTotal} stored lessons have ever been read (${Math.round((r.lessonsEverRecalled / r.lessonsTotal) * 100)}%)`,
|
|
312
|
+
'this is a ratio with a hostile denominator: storing more unread lessons makes it worse, not better',
|
|
313
|
+
]);
|
|
314
|
+
sections.push({ id: 'reuse', title: 'Knowledge reuse', verdict: v, lines });
|
|
315
|
+
}
|
|
316
|
+
const caveats = [];
|
|
317
|
+
if (facts.uncommittedSlugs.length > 0) {
|
|
318
|
+
caveats.push(`${facts.uncommittedSlugs.length} feature director${facts.uncommittedSlugs.length === 1 ? 'y is' : 'ies are'} not committed yet and therefore invisible to this report: ${facts.uncommittedSlugs.join(', ')}`);
|
|
319
|
+
}
|
|
320
|
+
caveats.push('none of the following is computed here, and each carries the measurement that disqualifies it: ' + FORBIDDEN_METRICS.map((m) => m.name).join(', '));
|
|
321
|
+
return { window: facts.window, spanDays: facts.spanDays, sections, caveats };
|
|
322
|
+
}
|
|
323
|
+
function tally(values) {
|
|
324
|
+
const m = new Map();
|
|
325
|
+
for (const v of values)
|
|
326
|
+
m.set(v, (m.get(v) ?? 0) + 1);
|
|
327
|
+
return [...m.entries()].sort((a, b) => (a[0] < b[0] ? -1 : 1)).map(([k, n]) => `${k}×${n}`).join(' ');
|
|
328
|
+
}
|
|
329
|
+
/** The human rendering. `--json` prints the SAME `RecapReport` — one structure, two spellings (FR-6). */
|
|
330
|
+
export function renderRecap(report) {
|
|
331
|
+
const out = [];
|
|
332
|
+
out.push(`dz recap — ${report.window.horizon}: ${report.window.startIso} … ${report.window.endIso} (${report.window.days} day(s))`);
|
|
333
|
+
out.push(`records held: ${report.spanDays} day(s)`);
|
|
334
|
+
for (const s of report.sections) {
|
|
335
|
+
out.push('');
|
|
336
|
+
out.push(`${s.title} [${s.verdict.status}]${s.verdict.dataStart !== null ? ` · records from ${s.verdict.dataStart}` : ''}`);
|
|
337
|
+
out.push(` ${s.verdict.note}`);
|
|
338
|
+
for (const l of s.lines)
|
|
339
|
+
out.push(` · ${l}`);
|
|
340
|
+
}
|
|
341
|
+
out.push('');
|
|
342
|
+
for (const c of report.caveats)
|
|
343
|
+
out.push(`! ${c}`);
|
|
344
|
+
return out;
|
|
345
|
+
}
|
|
346
|
+
//# sourceMappingURL=recap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recap.js","sourceRoot":"","sources":["../src/recap.ts"],"names":[],"mappings":"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"}
|