@dzhechkov/harness-core 0.7.11 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/.dz-manifest.json +287 -87
  2. package/README.md +60 -1
  3. package/dist/amendment-trace.d.ts +12 -1
  4. package/dist/amendment-trace.d.ts.map +1 -1
  5. package/dist/amendment-trace.js +22 -4
  6. package/dist/amendment-trace.js.map +1 -1
  7. package/dist/book-kb.d.ts.map +1 -1
  8. package/dist/book-kb.js +17 -0
  9. package/dist/book-kb.js.map +1 -1
  10. package/dist/feature-adr-checkpoints.d.ts +61 -0
  11. package/dist/feature-adr-checkpoints.d.ts.map +1 -1
  12. package/dist/feature-adr-checkpoints.js +116 -2
  13. package/dist/feature-adr-checkpoints.js.map +1 -1
  14. package/dist/feature-adr-routing.d.ts +69 -12
  15. package/dist/feature-adr-routing.d.ts.map +1 -1
  16. package/dist/feature-adr-routing.js +117 -7
  17. package/dist/feature-adr-routing.js.map +1 -1
  18. package/dist/index.d.ts +23 -6
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +23 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/learning-backend.d.ts +39 -0
  23. package/dist/learning-backend.d.ts.map +1 -1
  24. package/dist/learning-backend.js +31 -11
  25. package/dist/learning-backend.js.map +1 -1
  26. package/dist/lesson-bandit.d.ts +116 -0
  27. package/dist/lesson-bandit.d.ts.map +1 -0
  28. package/dist/lesson-bandit.js +235 -0
  29. package/dist/lesson-bandit.js.map +1 -0
  30. package/dist/lesson-payoff.d.ts +260 -0
  31. package/dist/lesson-payoff.d.ts.map +1 -0
  32. package/dist/lesson-payoff.js +597 -0
  33. package/dist/lesson-payoff.js.map +1 -0
  34. package/dist/loop-blobs.generated.js +2 -2
  35. package/dist/loop-blobs.generated.js.map +1 -1
  36. package/dist/mutation-gate.d.ts +31 -8
  37. package/dist/mutation-gate.d.ts.map +1 -1
  38. package/dist/mutation-gate.js +57 -16
  39. package/dist/mutation-gate.js.map +1 -1
  40. package/dist/named-lock.d.ts.map +1 -1
  41. package/dist/named-lock.js +11 -9
  42. package/dist/named-lock.js.map +1 -1
  43. package/dist/native-dep-probe.d.ts +11 -0
  44. package/dist/native-dep-probe.d.ts.map +1 -0
  45. package/dist/native-dep-probe.js +100 -0
  46. package/dist/native-dep-probe.js.map +1 -0
  47. package/dist/operations.d.ts.map +1 -1
  48. package/dist/operations.js +82 -1
  49. package/dist/operations.js.map +1 -1
  50. package/dist/parser-safe-region.d.ts +47 -0
  51. package/dist/parser-safe-region.d.ts.map +1 -0
  52. package/dist/parser-safe-region.js +47 -0
  53. package/dist/parser-safe-region.js.map +1 -0
  54. package/dist/patterns.d.ts +21 -0
  55. package/dist/patterns.d.ts.map +1 -1
  56. package/dist/patterns.js +52 -4
  57. package/dist/patterns.js.map +1 -1
  58. package/dist/profile.d.ts +202 -0
  59. package/dist/profile.d.ts.map +1 -0
  60. package/dist/profile.js +536 -0
  61. package/dist/profile.js.map +1 -0
  62. package/dist/project-skills-root.d.ts +44 -0
  63. package/dist/project-skills-root.d.ts.map +1 -0
  64. package/dist/project-skills-root.js +62 -0
  65. package/dist/project-skills-root.js.map +1 -0
  66. package/dist/publish.d.ts +5 -3
  67. package/dist/publish.d.ts.map +1 -1
  68. package/dist/publish.js +46 -8
  69. package/dist/publish.js.map +1 -1
  70. package/dist/qe-rounds.d.ts +75 -0
  71. package/dist/qe-rounds.d.ts.map +1 -0
  72. package/dist/qe-rounds.js +174 -0
  73. package/dist/qe-rounds.js.map +1 -0
  74. package/dist/registry.d.ts.map +1 -1
  75. package/dist/registry.js +5 -1
  76. package/dist/registry.js.map +1 -1
  77. package/dist/run-records.d.ts.map +1 -1
  78. package/dist/run-records.js +8 -1
  79. package/dist/run-records.js.map +1 -1
  80. package/dist/setup.d.ts +35 -4
  81. package/dist/setup.d.ts.map +1 -1
  82. package/dist/setup.js +86 -23
  83. package/dist/setup.js.map +1 -1
  84. package/dist/sign.d.ts +29 -24
  85. package/dist/sign.d.ts.map +1 -1
  86. package/dist/sign.js +183 -61
  87. package/dist/sign.js.map +1 -1
  88. package/dist/store-location.d.ts +56 -0
  89. package/dist/store-location.d.ts.map +1 -0
  90. package/dist/store-location.js +56 -0
  91. package/dist/store-location.js.map +1 -0
  92. package/dist/store-lock.d.ts +1 -0
  93. package/dist/store-lock.d.ts.map +1 -1
  94. package/dist/store-lock.js +7 -1
  95. package/dist/store-lock.js.map +1 -1
  96. package/dist/store-merge.d.ts +55 -0
  97. package/dist/store-merge.d.ts.map +1 -0
  98. package/dist/store-merge.js +77 -0
  99. package/dist/store-merge.js.map +1 -0
  100. package/dist/teach-target.d.ts +61 -0
  101. package/dist/teach-target.d.ts.map +1 -0
  102. package/dist/teach-target.js +105 -0
  103. package/dist/teach-target.js.map +1 -0
  104. package/dist/vector-tier.d.ts +30 -0
  105. package/dist/vector-tier.d.ts.map +1 -1
  106. package/dist/vector-tier.js +178 -20
  107. package/dist/vector-tier.js.map +1 -1
  108. package/package.json +13 -13
  109. package/sbom.json +591 -87
  110. package/src/amendment-trace.ts +34 -4
  111. package/src/book-kb.ts +17 -0
  112. package/src/feature-adr-checkpoints.ts +111 -2
  113. package/src/feature-adr-routing.ts +146 -7
  114. package/src/index.ts +55 -3
  115. package/src/learning-backend.ts +62 -11
  116. package/src/lesson-bandit.ts +279 -0
  117. package/src/lesson-payoff.ts +728 -0
  118. package/src/loop-blobs.generated.ts +2 -2
  119. package/src/mutation-gate.ts +74 -17
  120. package/src/named-lock.ts +10 -8
  121. package/src/native-dep-probe.ts +118 -0
  122. package/src/operations.ts +77 -1
  123. package/src/parser-safe-region.ts +65 -0
  124. package/src/patterns.ts +76 -6
  125. package/src/profile.ts +593 -0
  126. package/src/project-skills-root.ts +63 -0
  127. package/src/publish.ts +43 -7
  128. package/src/qe-rounds.ts +226 -0
  129. package/src/registry.ts +5 -1
  130. package/src/run-records.ts +9 -1
  131. package/src/setup.ts +87 -23
  132. package/src/sign.ts +180 -60
  133. package/src/store-location.ts +76 -0
  134. package/src/store-lock.ts +8 -1
  135. package/src/store-merge.ts +91 -0
  136. package/src/teach-target.ts +126 -0
  137. package/src/vector-tier.ts +236 -21
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Operator profile (feature operator-profile, ADR-001) — WHO the assistant is talking to,
3
+ * stored per USER and delivered as a marked block in `~/.claude/CLAUDE.md`.
4
+ *
5
+ * The profile is a FILE the runtime loads, not a rule the agent remembers: a rule in agent
6
+ * memory is layer 4 of the cost-of-detection ladder and failed three times in this repo before
7
+ * this feature existed. The block lives at layer 2 — loaded once per session, in EVERY project
8
+ * on the machine, including projects with no `.dz/` at all.
9
+ *
10
+ * Two axes (ADR Decision 2): a global register plus named domains that move it. `deepDomains`
11
+ * upgrade to full pro; `weakDomains` make a plain sentence MANDATORY, not merely default — the
12
+ * weak list is the load-bearing one, because there NOT explaining is the failure mode.
13
+ *
14
+ * Boundaries baked into every rendered block (ADR Decision 3), at every register:
15
+ * - the register governs dialogue and owner-facing surfaces only — never ADRs, commit messages,
16
+ * code comments, QE reports or npm READMEs;
17
+ * - the register changes FORM, never FACTS — numbers, caveats, risks and refutations survive
18
+ * every level. Without that sentence "simpler please" is a hole in the Integrity Rule.
19
+ *
20
+ * The store is per-user under `homedir()` — NEVER under a project root (`.dz/config.json` is
21
+ * committed in this very repo; a personal file there leaks by construction) — and mode 0600
22
+ * (the key-custody lesson of 2026-07-15 was a 0644 world-readable key).
23
+ *
24
+ * Nothing in this module throws on bad input: a missing file, unreadable JSON or a wrong shape
25
+ * is an honest verdict (`problem`), never an exception.
26
+ *
27
+ * @packageDocumentation
28
+ */
29
+ /** Marker pair delimiting the profile block inside `~/.claude/CLAUDE.md`. The redaction in
30
+ * feature-adr-checkpoints.ts keeps its OWN copies of these literals (that file stays import-free
31
+ * so the workflow can mirror it inline); `test/profile-redaction.test.ts` pins the two pairs equal. */
32
+ export declare const PROFILE_MARKER_START = "<!-- dz:profile:start -->";
33
+ export declare const PROFILE_MARKER_END = "<!-- dz:profile:end -->";
34
+ /** Dialogue register. `pro` = name the concept and move on; `pro-lite` = concept + one plain
35
+ * sentence; `plain` = everyday words first, the term once in parentheses. */
36
+ export type Register = 'pro' | 'pro-lite' | 'plain';
37
+ /** The accepted register values, for refusal messages (teach-target precedent: an unknown value
38
+ * is refused NAMING the accepted set, never silently defaulted). */
39
+ export declare const REGISTERS: readonly Register[];
40
+ /** One named domain. `note` is a short qualifier rendered in parentheses, e.g. "CCIE". */
41
+ export interface Domain {
42
+ readonly tag: string;
43
+ readonly note?: string;
44
+ }
45
+ /** The per-user operator profile, persisted at {@link profileStorePath}. */
46
+ export interface OperatorProfile {
47
+ readonly version: 1;
48
+ /** ISO-8601 instant of the last write — `dz profile show` reports age from it. */
49
+ readonly updatedAt: string;
50
+ /** Dialogue language, e.g. 'ru'. Artifacts keep their own conventions (the scope rule). */
51
+ readonly language: string;
52
+ /** Global default register. */
53
+ readonly register: Register;
54
+ /** Domains where the register upgrades to full pro — scaffolding reads as patronising. */
55
+ readonly deepDomains: readonly Domain[];
56
+ /** Domains where one plain sentence is MANDATORY every time, not merely default. */
57
+ readonly weakDomains: readonly Domain[];
58
+ /** The operator teaches: explanations must be re-tellable, not just satisfying in the moment. */
59
+ readonly teaches: boolean;
60
+ }
61
+ /** The owner-facing echo of a stored register — `show`/`set` print both directions. */
62
+ export declare function registerOwnerWord(register: Register): string;
63
+ /** Parse a register from the owner's own words. Returns null for anything not in the accepted
64
+ * set — the CALLER refuses, naming {@link REGISTERS}; this function never throws and never
65
+ * silently defaults. */
66
+ export declare function parseRegister(raw: string): Register | null;
67
+ /**
68
+ * Parse a human-typed, comma-separated domain list — the `init` onboarding answer
69
+ * («networking (CCIE; NSX), cloud architecture»). Rules, each from a way people actually type:
70
+ * - split on commas OUTSIDE parentheses ("networking (CCIE, NSX)" is ONE domain, not two);
71
+ * - an optional trailing parenthetical is the note: `networking (CCIE; NSX)` → tag `networking`,
72
+ * note `CCIE; NSX`;
73
+ * - the tag is kebab-cased (lowercased, whitespace runs → `-`) so `Cloud Architecture` and
74
+ * `cloud architecture` are the same domain;
75
+ * - an empty/blank answer means NONE — an empty array, never an error (onboarding must not force
76
+ * an answer).
77
+ * Never throws.
78
+ */
79
+ export declare function parseDomainList(raw: string): Domain[];
80
+ /** The domains as the text a person would have typed — the re-init prompt default, so an Enter
81
+ * keeps what is already stored. */
82
+ export declare function domainListText(domains: readonly Domain[]): string;
83
+ /** Parse a yes/no answer in the owner's words. Returns null for anything unrecognised — the
84
+ * caller re-asks or takes the documented default OUT LOUD; this function never guesses (the
85
+ * measured failure: a domains line fed to a y/n question silently became `teaches: no`). */
86
+ export declare function parseYesNo(raw: string): boolean | null;
87
+ /** Absolute path of the profile store: `<home>/.dz/profile.json`. Resolves under `homedir()`
88
+ * and NEVER under a project root — there is deliberately no projectRoot parameter (AR-2:
89
+ * `.dz/config.json` is committed in this repo, so personal data there is a leak by construction).
90
+ * `home` exists as an explicit override so tests run against a scratch HOME. */
91
+ export declare function profileStorePath(home?: string): string;
92
+ /** Absolute path of the delivery target: `<home>/.claude/CLAUDE.md`. */
93
+ export declare function claudeMdPath(home?: string): string;
94
+ /** Verdict-style read result — `problem` instead of a throw, always. */
95
+ export interface ProfileReadResult {
96
+ readonly profile: OperatorProfile | null;
97
+ readonly path: string;
98
+ /** null when profile is non-null; otherwise says exactly what is wrong ('missing',
99
+ * 'unreadable JSON: …', 'invalid shape: …'). */
100
+ readonly problem: string | null;
101
+ }
102
+ /** Validate an arbitrary value into an OperatorProfile, or say precisely why not.
103
+ *
104
+ * TOTAL by construction (round-6 finding): the shape checks below can themselves throw on hostile
105
+ * input — `JSON.stringify(2n)` in a verdict message is a TypeError, a getter or Proxy can throw on
106
+ * property access — and validateProfile is called OUTSIDE the try of every no-throw caller
107
+ * (readProfile, writeProfile, syncProfileBlock), because it is the boundary those trys rely on.
108
+ * So the boundary itself may never leak: any internal throw becomes a refusal verdict. */
109
+ export declare function validateProfile(v: unknown): {
110
+ profile: OperatorProfile | null;
111
+ problem: string | null;
112
+ };
113
+ /** Read + validate the store. Missing file, unreadable JSON and a wrong shape are three DIFFERENT
114
+ * problems, all reported, none thrown. */
115
+ export declare function readProfile(home?: string): ProfileReadResult;
116
+ /** Write the store at mode 0600 (creating `<home>/.dz/` at 0700 if needed). The chmod runs even
117
+ * when the file pre-existed: `writeFileSync`'s mode applies only at creation. */
118
+ export declare function writeProfile(profile: OperatorProfile, home?: string): {
119
+ path: string;
120
+ problem?: string;
121
+ };
122
+ /**
123
+ * Render the block CONTENT (without the markers — {@link wrapProfileBlock} adds them).
124
+ *
125
+ * Invariants, each pinned by a test:
126
+ * - both fixed rules (artifact scope; form-not-facts) appear at EVERY register — they are not
127
+ * user settings (ADR Decision 3);
128
+ * - deep and weak domains render visibly DIFFERENT instructions: deep = full pro, no
129
+ * scaffolding; weak = one plain sentence EVERY time, unprompted — mandatory, not default.
130
+ */
131
+ export declare function renderProfileBlock(profile: OperatorProfile): string;
132
+ /** Wrap rendered content in the marker pair, ready to merge into a target file. */
133
+ export declare function wrapProfileBlock(content: string): string;
134
+ /** Extract the CONTENT between the markers of `fileContent`, or null when no complete block
135
+ * exists. Only the FIRST block is considered (sync never writes a second one). */
136
+ export declare function extractProfileBlock(fileContent: string): string | null;
137
+ /** Pure marked-block merge (the `installDriverDocs` pattern from setup.ts, upgraded from
138
+ * append-if-absent to replace-in-place). Foreign content — everything outside the marker pair —
139
+ * is preserved BYTE-FOR-BYTE; `changed: false` means the file already carries exactly this
140
+ * content (idempotence). `existing: null` means the target file does not exist yet.
141
+ *
142
+ * `malformed: true` (with the input returned untouched) means the file is in a state this merge
143
+ * refuses to write over. `malformedKind` names which of the two known states it is:
144
+ *
145
+ * - `'dangling-start'` — a START marker with no END marker after it. The first version APPENDED
146
+ * a complete fresh block in that case — and the NEXT sync then paired the OLD dangling start
147
+ * with the NEW block's end and deleted everything between them, damaged foreign text included
148
+ * (the second-sync corruption, cross-family finding 2026-08-28).
149
+ * - `'nested-markers'` — ANOTHER start marker between the chosen start and its end. This is the
150
+ * LEGACY residue of exactly that pre-fix append: dangling start … foreign text … appended
151
+ * complete block. Pairing the old start with the appended block's end would delete the foreign
152
+ * text (second cross-family finding, 2026-08-28), and the `dangling-start` refusal above does
153
+ * not fire because an end marker DOES exist after the start.
154
+ *
155
+ * Both states are REFUSED, never repaired automatically: nothing is written, no further nesting
156
+ * can ever be created, and the caller reports the named verdict. A stray END marker with no
157
+ * start before it stays harmless (the block we append is complete, and every later replace
158
+ * anchors at OUR start marker), so it does not refuse. */
159
+ export declare function mergeProfileBlock(existing: string | null, content: string): {
160
+ merged: string;
161
+ changed: boolean;
162
+ hadBlock: boolean;
163
+ malformed?: boolean;
164
+ malformedKind?: 'dangling-start' | 'nested-markers';
165
+ };
166
+ /** Result of {@link syncProfileBlock}. */
167
+ export interface ProfileSyncResult {
168
+ readonly target: string;
169
+ readonly changed: boolean;
170
+ /** Path of the timestamped backup written BEFORE the modifying write, or null when the write
171
+ * was a no-op or the target did not exist yet (nothing to back up). */
172
+ readonly backup: string | null;
173
+ readonly problem: string | null;
174
+ }
175
+ /** Write the rendered block into `<home>/.claude/CLAUDE.md`: idempotent, foreign content
176
+ * byte-for-byte, timestamped backup before every MODIFYING write of an existing file.
177
+ * Never throws — an I/O failure (and a malformed block, named as `malformed block:`) is a
178
+ * `problem` verdict.
179
+ *
180
+ * Modes (the delivered COPIES carry the same personal profile as the 0600 store, so none of
181
+ * them may be left to the ambient umask — the key-custody lesson again, one file over):
182
+ * - a target this function CREATES is 0600, and a `.claude/` dir it creates is 0700;
183
+ * - a PRE-EXISTING target keeps its owner bits exactly and loses only group/other bits
184
+ * (`mode & 0o700`). We deliberately do not force 0600 on a file the user owns — their owner
185
+ * permissions are their call — but leaving non-owner read on a file we just wrote the profile
186
+ * into would be the 0644 world-readable-key defect verbatim, so that much IS tightened;
187
+ * - every backup is a fresh file of ours and is written 0600 unconditionally. */
188
+ export declare function syncProfileBlock(profile: OperatorProfile, home?: string, now?: Date): ProfileSyncResult;
189
+ /** Drift verdicts. `in-sync` is the only green; every other state names what is missing —
190
+ * never a throw, never a silent pass (FR-9: drift is detected deterministically). */
191
+ export type ProfileDriftVerdict = 'in-sync' | 'drift' | 'no-block' | 'malformed-block' | 'no-target' | 'no-profile' | 'invalid-profile';
192
+ export interface ProfileDriftResult {
193
+ readonly verdict: ProfileDriftVerdict;
194
+ readonly detail: string;
195
+ }
196
+ /** Does the block currently in `<home>/.claude/CLAUDE.md` match what `profile.json` would
197
+ * render? Compares CONTENT (a hand-edited block that still says the same bytes is in sync;
198
+ * anything else is drift). */
199
+ export declare function checkProfileDrift(home?: string): ProfileDriftResult;
200
+ /** Whole-days age of the profile, or null when updatedAt does not parse. */
201
+ export declare function profileAgeDays(profile: OperatorProfile, now?: Date): number | null;
202
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}