@descryy/mcp 0.6.0 → 0.7.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.
- package/dist/action-handshake.d.ts +8 -75
- package/dist/action-handshake.d.ts.map +1 -1
- package/dist/action-handshake.js +9 -79
- package/dist/action-handshake.js.map +1 -1
- package/dist/bin/descry-mcp.d.ts +4 -15
- package/dist/bin/descry-mcp.d.ts.map +1 -1
- package/dist/bin/descry-mcp.js +12 -42
- package/dist/bin/descry-mcp.js.map +1 -1
- package/dist/browser/driver.d.ts +121 -224
- package/dist/browser/driver.d.ts.map +1 -1
- package/dist/browser/driver.js +9 -55
- package/dist/browser/driver.js.map +1 -1
- package/dist/browser/evidence.d.ts +10 -43
- package/dist/browser/evidence.d.ts.map +1 -1
- package/dist/browser/evidence.js +20 -54
- package/dist/browser/evidence.js.map +1 -1
- package/dist/browser/fake-driver.d.ts +12 -19
- package/dist/browser/fake-driver.d.ts.map +1 -1
- package/dist/browser/fake-driver.js +31 -26
- package/dist/browser/fake-driver.js.map +1 -1
- package/dist/browser/graph-write.d.ts +4 -45
- package/dist/browser/graph-write.d.ts.map +1 -1
- package/dist/browser/graph-write.js +8 -53
- package/dist/browser/graph-write.js.map +1 -1
- package/dist/browser/playwright-driver.d.ts +7 -91
- package/dist/browser/playwright-driver.d.ts.map +1 -1
- package/dist/browser/playwright-driver.js +59 -197
- package/dist/browser/playwright-driver.js.map +1 -1
- package/dist/browser/provider.d.ts +5 -34
- package/dist/browser/provider.d.ts.map +1 -1
- package/dist/browser/provider.js +4 -24
- package/dist/browser/provider.js.map +1 -1
- package/dist/browser/registry.d.ts +26 -106
- package/dist/browser/registry.d.ts.map +1 -1
- package/dist/browser/registry.js +20 -77
- package/dist/browser/registry.js.map +1 -1
- package/dist/browser/scenario-provenance.d.ts +23 -0
- package/dist/browser/scenario-provenance.d.ts.map +1 -0
- package/dist/browser/scenario-provenance.js +59 -0
- package/dist/browser/scenario-provenance.js.map +1 -0
- package/dist/browser/scenario-resolve.d.ts +10 -44
- package/dist/browser/scenario-resolve.d.ts.map +1 -1
- package/dist/browser/scenario-resolve.js +10 -41
- package/dist/browser/scenario-resolve.js.map +1 -1
- package/dist/browser/scenario-runner.d.ts +12 -70
- package/dist/browser/scenario-runner.d.ts.map +1 -1
- package/dist/browser/scenario-runner.js +30 -90
- package/dist/browser/scenario-runner.js.map +1 -1
- package/dist/browser/stack-parser.d.ts +4 -28
- package/dist/browser/stack-parser.d.ts.map +1 -1
- package/dist/browser/stack-parser.js +12 -39
- package/dist/browser/stack-parser.js.map +1 -1
- package/dist/browser/tool-support.d.ts +20 -67
- package/dist/browser/tool-support.d.ts.map +1 -1
- package/dist/browser/tool-support.js +21 -65
- package/dist/browser/tool-support.js.map +1 -1
- package/dist/browser/url-scheme.d.ts +14 -0
- package/dist/browser/url-scheme.d.ts.map +1 -0
- package/dist/browser/url-scheme.js +38 -0
- package/dist/browser/url-scheme.js.map +1 -0
- package/dist/cancellation.d.ts +11 -46
- package/dist/cancellation.d.ts.map +1 -1
- package/dist/cancellation.js +11 -46
- package/dist/cancellation.js.map +1 -1
- package/dist/capped.d.ts +9 -33
- package/dist/capped.d.ts.map +1 -1
- package/dist/capped.js +7 -27
- package/dist/capped.js.map +1 -1
- package/dist/disclosure-ledger.d.ts +6 -30
- package/dist/disclosure-ledger.d.ts.map +1 -1
- package/dist/disclosure-ledger.js +4 -26
- package/dist/disclosure-ledger.js.map +1 -1
- package/dist/index.d.ts +10 -26
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -17
- package/dist/index.js.map +1 -1
- package/dist/module-trust.d.ts +24 -0
- package/dist/module-trust.d.ts.map +1 -0
- package/dist/module-trust.js +60 -0
- package/dist/module-trust.js.map +1 -0
- package/dist/path-confinement.d.ts +31 -0
- package/dist/path-confinement.d.ts.map +1 -0
- package/dist/path-confinement.js +44 -0
- package/dist/path-confinement.js.map +1 -0
- package/dist/protocol.d.ts +10 -53
- package/dist/protocol.d.ts.map +1 -1
- package/dist/protocol.js +14 -60
- package/dist/protocol.js.map +1 -1
- package/dist/registry.d.ts +37 -58
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +88 -96
- package/dist/registry.js.map +1 -1
- package/dist/render.d.ts +89 -13
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +111 -16
- package/dist/render.js.map +1 -1
- package/dist/runtime-registry.d.ts +7 -66
- package/dist/runtime-registry.d.ts.map +1 -1
- package/dist/runtime-registry.js +39 -114
- package/dist/runtime-registry.js.map +1 -1
- package/dist/scenarios/index.d.ts +1 -1
- package/dist/scenarios/index.d.ts.map +1 -1
- package/dist/scenarios/index.js +1 -1
- package/dist/scenarios/index.js.map +1 -1
- package/dist/scenarios/parse.d.ts +4 -18
- package/dist/scenarios/parse.d.ts.map +1 -1
- package/dist/scenarios/parse.js +14 -34
- package/dist/scenarios/parse.js.map +1 -1
- package/dist/scenarios/scenario.d.ts +18 -74
- package/dist/scenarios/scenario.d.ts.map +1 -1
- package/dist/scenarios/scenario.js +7 -34
- package/dist/scenarios/scenario.js.map +1 -1
- package/dist/scenarios/storage.d.ts +11 -41
- package/dist/scenarios/storage.d.ts.map +1 -1
- package/dist/scenarios/storage.js +57 -47
- package/dist/scenarios/storage.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +69 -19
- package/dist/server.js.map +1 -1
- package/dist/session.d.ts +90 -259
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +136 -250
- package/dist/session.js.map +1 -1
- package/dist/tools/analyze.d.ts +32 -118
- package/dist/tools/analyze.d.ts.map +1 -1
- package/dist/tools/analyze.js +65 -186
- package/dist/tools/analyze.js.map +1 -1
- package/dist/tools/browser-click.d.ts +3 -21
- package/dist/tools/browser-click.d.ts.map +1 -1
- package/dist/tools/browser-click.js +10 -31
- package/dist/tools/browser-click.js.map +1 -1
- package/dist/tools/browser-close-session.d.ts +4 -13
- package/dist/tools/browser-close-session.d.ts.map +1 -1
- package/dist/tools/browser-close-session.js +4 -13
- package/dist/tools/browser-close-session.js.map +1 -1
- package/dist/tools/browser-fill.d.ts +5 -36
- package/dist/tools/browser-fill.d.ts.map +1 -1
- package/dist/tools/browser-fill.js +9 -44
- package/dist/tools/browser-fill.js.map +1 -1
- package/dist/tools/browser-navigate.d.ts +6 -27
- package/dist/tools/browser-navigate.d.ts.map +1 -1
- package/dist/tools/browser-navigate.js +6 -23
- package/dist/tools/browser-navigate.js.map +1 -1
- package/dist/tools/browser-run-scenario.d.ts +5 -31
- package/dist/tools/browser-run-scenario.d.ts.map +1 -1
- package/dist/tools/browser-run-scenario.js +10 -46
- package/dist/tools/browser-run-scenario.js.map +1 -1
- package/dist/tools/browser-save-scenario.d.ts +3 -28
- package/dist/tools/browser-save-scenario.d.ts.map +1 -1
- package/dist/tools/browser-save-scenario.js +47 -84
- package/dist/tools/browser-save-scenario.js.map +1 -1
- package/dist/tools/browser-snapshot.d.ts +6 -39
- package/dist/tools/browser-snapshot.d.ts.map +1 -1
- package/dist/tools/browser-snapshot.js +4 -31
- package/dist/tools/browser-snapshot.js.map +1 -1
- package/dist/tools/browser-start-session.d.ts +4 -23
- package/dist/tools/browser-start-session.d.ts.map +1 -1
- package/dist/tools/browser-start-session.js +145 -56
- package/dist/tools/browser-start-session.js.map +1 -1
- package/dist/tools/browser-type.d.ts +5 -35
- package/dist/tools/browser-type.d.ts.map +1 -1
- package/dist/tools/browser-type.js +10 -45
- package/dist/tools/browser-type.js.map +1 -1
- package/dist/tools/contracts.d.ts +9 -86
- package/dist/tools/contracts.d.ts.map +1 -1
- package/dist/tools/contracts.js +24 -80
- package/dist/tools/contracts.js.map +1 -1
- package/dist/tools/cross-pr.d.ts +42 -30
- package/dist/tools/cross-pr.d.ts.map +1 -1
- package/dist/tools/cross-pr.js +81 -62
- package/dist/tools/cross-pr.js.map +1 -1
- package/dist/tools/git-diff.d.ts +18 -2
- package/dist/tools/git-diff.d.ts.map +1 -1
- package/dist/tools/git-diff.js +118 -26
- package/dist/tools/git-diff.js.map +1 -1
- package/dist/tools/git-history.d.ts +5 -16
- package/dist/tools/git-history.d.ts.map +1 -1
- package/dist/tools/git-history.js +3 -10
- package/dist/tools/git-history.js.map +1 -1
- package/dist/tools/history.d.ts +4 -33
- package/dist/tools/history.d.ts.map +1 -1
- package/dist/tools/history.js +6 -31
- package/dist/tools/history.js.map +1 -1
- package/dist/tools/impact.d.ts +7 -51
- package/dist/tools/impact.d.ts.map +1 -1
- package/dist/tools/impact.js +15 -67
- package/dist/tools/impact.js.map +1 -1
- package/dist/tools/index.d.ts +3 -8
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -8
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/kit.d.ts +66 -113
- package/dist/tools/kit.d.ts.map +1 -1
- package/dist/tools/kit.js +60 -28
- package/dist/tools/kit.js.map +1 -1
- package/dist/tools/link-workspace.d.ts +7 -45
- package/dist/tools/link-workspace.d.ts.map +1 -1
- package/dist/tools/link-workspace.js +10 -48
- package/dist/tools/link-workspace.js.map +1 -1
- package/dist/tools/lookup.d.ts +4 -14
- package/dist/tools/lookup.d.ts.map +1 -1
- package/dist/tools/lookup.js +4 -14
- package/dist/tools/lookup.js.map +1 -1
- package/dist/tools/mark-incident.d.ts +7 -54
- package/dist/tools/mark-incident.d.ts.map +1 -1
- package/dist/tools/mark-incident.js +15 -68
- package/dist/tools/mark-incident.js.map +1 -1
- package/dist/tools/observe-runtime.d.ts +27 -210
- package/dist/tools/observe-runtime.d.ts.map +1 -1
- package/dist/tools/observe-runtime.js +273 -434
- package/dist/tools/observe-runtime.js.map +1 -1
- package/dist/tools/observe-tests.d.ts +9 -100
- package/dist/tools/observe-tests.d.ts.map +1 -1
- package/dist/tools/observe-tests.js +74 -152
- package/dist/tools/observe-tests.js.map +1 -1
- package/dist/tools/pr-analysis.d.ts +18 -2
- package/dist/tools/pr-analysis.d.ts.map +1 -1
- package/dist/tools/pr-analysis.js +73 -23
- package/dist/tools/pr-analysis.js.map +1 -1
- package/dist/tools/pre-push.d.ts +74 -16
- package/dist/tools/pre-push.d.ts.map +1 -1
- package/dist/tools/pre-push.js +152 -51
- package/dist/tools/pre-push.js.map +1 -1
- package/dist/tools/propagation.d.ts +11 -53
- package/dist/tools/propagation.d.ts.map +1 -1
- package/dist/tools/propagation.js +17 -58
- package/dist/tools/propagation.js.map +1 -1
- package/dist/tools/questions.d.ts +13 -63
- package/dist/tools/questions.d.ts.map +1 -1
- package/dist/tools/questions.js +33 -105
- package/dist/tools/questions.js.map +1 -1
- package/dist/tools/refusal-fetch.d.ts +4 -40
- package/dist/tools/refusal-fetch.d.ts.map +1 -1
- package/dist/tools/refusal-fetch.js +4 -40
- package/dist/tools/refusal-fetch.js.map +1 -1
- package/dist/tools/runtime-incident.d.ts +4 -63
- package/dist/tools/runtime-incident.d.ts.map +1 -1
- package/dist/tools/runtime-incident.js +10 -87
- package/dist/tools/runtime-incident.js.map +1 -1
- package/dist/tools/scope.d.ts +7 -25
- package/dist/tools/scope.d.ts.map +1 -1
- package/dist/tools/scope.js +10 -29
- package/dist/tools/scope.js.map +1 -1
- package/dist/tools/similar-incidents.d.ts +11 -86
- package/dist/tools/similar-incidents.d.ts.map +1 -1
- package/dist/tools/similar-incidents.js +7 -71
- package/dist/tools/similar-incidents.js.map +1 -1
- package/dist/tools/validate.d.ts +29 -70
- package/dist/tools/validate.d.ts.map +1 -1
- package/dist/tools/validate.js +141 -85
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/verification-status.d.ts +9 -64
- package/dist/tools/verification-status.d.ts.map +1 -1
- package/dist/tools/verification-status.js +9 -62
- package/dist/tools/verification-status.js.map +1 -1
- package/dist/tools/verify-claim.d.ts +5 -52
- package/dist/tools/verify-claim.d.ts.map +1 -1
- package/dist/tools/verify-claim.js +6 -56
- package/dist/tools/verify-claim.js.map +1 -1
- package/dist/transport.d.ts +15 -52
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +16 -60
- package/dist/transport.js.map +1 -1
- package/package.json +40 -22
|
@@ -1,75 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `questions` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* a refusal carries `attrs.blockedBy` + `attrs.refusalClass` (DEC-242) → the
|
|
7
|
-
* grouper collapses rows sharing both into one question (DEC-243) → a
|
|
8
|
-
* confirmed answer is stored and capped at reliability class B regardless of
|
|
9
|
-
* anything else (DEC-223). Nothing before this tool could show a question to
|
|
10
|
-
* a person or accept an answer back. This is that door — the same role
|
|
11
|
-
* `link_workspace` plays for the workspace-pairing declaration, except this
|
|
12
|
-
* one both reads and writes, because "what's still open" and "record an
|
|
13
|
-
* answer" are one conversation, not two round trips.
|
|
14
|
-
*
|
|
15
|
-
* ## One tool, not two — and not folded into `link_workspace`
|
|
16
|
-
*
|
|
17
|
-
* DEC-243 named two shapes and built neither: a dedicated tool, or extending
|
|
18
|
-
* `link_workspace`'s write pattern to accept a `ConfirmedFact`. Rejected the
|
|
19
|
-
* second explicitly: `session.ts`'s own `writeConfirmedFact` already exists
|
|
20
|
-
* as "a second, narrow writer... so a future field gets a third writer, not
|
|
21
|
-
* a branch in this one" — the identical reasoning applies one layer up.
|
|
22
|
-
* `link_workspace` is about workspace pairing; bolting an unrelated write
|
|
23
|
-
* concern onto it would be the tool-layer version of the shape drift DEC's
|
|
24
|
-
* own `MODEL.fields`/`DTO.fields` incident already cost this project once
|
|
25
|
-
* (§3.1). A dedicated tool that both lists and answers is one coherent
|
|
26
|
-
* concern — "the question queue" — read and write together because a caller
|
|
27
|
-
* asking "what's still open" immediately after recording an answer should
|
|
28
|
-
* see the queue that answer just shrank, not have to call twice.
|
|
29
|
-
*
|
|
30
|
-
* ## Answering re-computes locally rather than re-reading the file
|
|
31
|
-
*
|
|
32
|
-
* `session.config.confirmedFacts` is loaded once at session start and is
|
|
33
|
-
* `readonly` — writing via `writeConfirmedFact` does not update it in
|
|
34
|
-
* memory. Rather than reload `.descry/config.json` from disk mid-call, the
|
|
35
|
-
* just-written fact is merged into a local copy for this response only, the
|
|
36
|
-
* same way `writeConfirmedFact`'s own `replaced` return value already tells
|
|
37
|
-
* a caller what was overwritten without a second read.
|
|
38
|
-
*/
|
|
2
|
+
* `questions` — lets a human answer an open refusal question in this conversation.
|
|
3
|
+
* DEC-242: a refusal carries `attrs.blockedBy`+`refusalClass`. DEC-243: grouped into
|
|
4
|
+
* one question per pair; a dedicated read+write tool, not folded into `link_workspace`.
|
|
5
|
+
* DEC-223: a recorded answer caps at reliability class B regardless of anything else. */
|
|
39
6
|
import type { RefusalDropCounts, RefusalQuestion } from "@descryy/core";
|
|
40
7
|
import type { ConfirmedFact } from "@descryy/ir";
|
|
41
8
|
import { type ToolDefinition } from "./kit.ts";
|
|
42
|
-
/**
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
* Read and write together because a caller asking "what's still open"
|
|
46
|
-
* immediately after recording an answer should see the queue that answer
|
|
47
|
-
* changed, not have to call twice.
|
|
48
|
-
*/
|
|
9
|
+
/** Both halves of one conversation: the queue, and the answer that just shrank it.
|
|
10
|
+
* Read and write together so a caller doesn't need two calls. */
|
|
49
11
|
export interface QuestionsData {
|
|
50
|
-
/**
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
* A human assertion, not a graph fact: when it is later used to mint an
|
|
54
|
-
* edge, that edge is capped at reliability class B by DEC-223 regardless of
|
|
55
|
-
* anything else about it.
|
|
56
|
-
*/
|
|
12
|
+
/** The `ConfirmedFact` written by this call, or null when none given. A human
|
|
13
|
+
* assertion, not a graph fact — capped at reliability class B (DEC-223) when
|
|
14
|
+
* later used to mint an edge. */
|
|
57
15
|
readonly recorded: ConfirmedFact | null;
|
|
58
|
-
/**
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
* DEC-242's `value-unknown` class only. A reader-capability gap or a
|
|
62
|
-
* per-call value never appears here, because no sentence answers those.
|
|
63
|
-
*/
|
|
16
|
+
/** Rows a human could resolve, grouped by `blockedBy` — DEC-242's `value-unknown`
|
|
17
|
+
* class only. A reader-capability gap or per-call value never appears here. */
|
|
64
18
|
readonly questions: readonly RefusalQuestion[];
|
|
65
19
|
/** Every refusal-ledger row, classified or not. The outer denominator. */
|
|
66
20
|
readonly totalRefusalRows: number;
|
|
67
|
-
/**
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* The gap between this and `totalRefusalRows` is rows no adapter classified:
|
|
71
|
-
* never askable, and **not the same population** as "still open".
|
|
72
|
-
*/
|
|
21
|
+
/** Of those, how many carry `attrs.blockedBy`/`refusalClass` at all. The gap vs
|
|
22
|
+
* `totalRefusalRows` is unclassified rows — never askable, not "still open". */
|
|
73
23
|
readonly classifiedRows: number;
|
|
74
24
|
/** Rows a stored confirmed fact already answers, so they are not listed as questions. */
|
|
75
25
|
readonly alreadyAnswered: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../src/tools/questions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../../src/tools/questions.ts"],"names":[],"mappings":"AAAA;;;;yFAIyF;AAGzF,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAGlB;kEACkE;AAClE,MAAM,WAAW,aAAa;IAC5B;;sCAEkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxC;oFACgF;IAChF,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,0EAA0E;IAC1E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC;qFACiF;IACjF,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,yFAAyF;IACzF,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;CACrC;AAsPD,eAAO,MAAM,aAAa,EAAE,cAoB3B,CAAC"}
|
package/dist/tools/questions.js
CHANGED
|
@@ -1,41 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `questions` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* a refusal carries `attrs.blockedBy` + `attrs.refusalClass` (DEC-242) → the
|
|
7
|
-
* grouper collapses rows sharing both into one question (DEC-243) → a
|
|
8
|
-
* confirmed answer is stored and capped at reliability class B regardless of
|
|
9
|
-
* anything else (DEC-223). Nothing before this tool could show a question to
|
|
10
|
-
* a person or accept an answer back. This is that door — the same role
|
|
11
|
-
* `link_workspace` plays for the workspace-pairing declaration, except this
|
|
12
|
-
* one both reads and writes, because "what's still open" and "record an
|
|
13
|
-
* answer" are one conversation, not two round trips.
|
|
14
|
-
*
|
|
15
|
-
* ## One tool, not two — and not folded into `link_workspace`
|
|
16
|
-
*
|
|
17
|
-
* DEC-243 named two shapes and built neither: a dedicated tool, or extending
|
|
18
|
-
* `link_workspace`'s write pattern to accept a `ConfirmedFact`. Rejected the
|
|
19
|
-
* second explicitly: `session.ts`'s own `writeConfirmedFact` already exists
|
|
20
|
-
* as "a second, narrow writer... so a future field gets a third writer, not
|
|
21
|
-
* a branch in this one" — the identical reasoning applies one layer up.
|
|
22
|
-
* `link_workspace` is about workspace pairing; bolting an unrelated write
|
|
23
|
-
* concern onto it would be the tool-layer version of the shape drift DEC's
|
|
24
|
-
* own `MODEL.fields`/`DTO.fields` incident already cost this project once
|
|
25
|
-
* (§3.1). A dedicated tool that both lists and answers is one coherent
|
|
26
|
-
* concern — "the question queue" — read and write together because a caller
|
|
27
|
-
* asking "what's still open" immediately after recording an answer should
|
|
28
|
-
* see the queue that answer just shrank, not have to call twice.
|
|
29
|
-
*
|
|
30
|
-
* ## Answering re-computes locally rather than re-reading the file
|
|
31
|
-
*
|
|
32
|
-
* `session.config.confirmedFacts` is loaded once at session start and is
|
|
33
|
-
* `readonly` — writing via `writeConfirmedFact` does not update it in
|
|
34
|
-
* memory. Rather than reload `.descry/config.json` from disk mid-call, the
|
|
35
|
-
* just-written fact is merged into a local copy for this response only, the
|
|
36
|
-
* same way `writeConfirmedFact`'s own `replaced` return value already tells
|
|
37
|
-
* a caller what was overwritten without a second read.
|
|
38
|
-
*/
|
|
2
|
+
* `questions` — lets a human answer an open refusal question in this conversation.
|
|
3
|
+
* DEC-242: a refusal carries `attrs.blockedBy`+`refusalClass`. DEC-243: grouped into
|
|
4
|
+
* one question per pair; a dedicated read+write tool, not folded into `link_workspace`.
|
|
5
|
+
* DEC-223: a recorded answer caps at reliability class B regardless of anything else. */
|
|
39
6
|
import { applyConfirmedFacts, counts, groupRefusalsIntoQuestions } from "@descryy/core";
|
|
40
7
|
import { writeConfirmedFact } from "../session.js";
|
|
41
8
|
import { answer, optionalEnum, optionalString, requiredString, ToolInputError, } from "./kit.js";
|
|
@@ -76,14 +43,9 @@ const SCHEMA = {
|
|
|
76
43
|
required: ["blockedBy", "value"],
|
|
77
44
|
additionalProperties: false,
|
|
78
45
|
},
|
|
79
|
-
// Declared here, not only in the prose
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
// `additionalProperties: false`, a client validating against the schema it
|
|
83
|
-
// was handed would reject the exact call the description asked for. A
|
|
84
|
-
// parameter a tool documents and a parameter a tool declares have to be
|
|
85
|
-
// the same set; `tool-schema-prose.test.ts` now holds the whole registry
|
|
86
|
-
// to that.
|
|
46
|
+
// Declared here, not only in the prose — `tool-schema-prose.test.ts` holds the
|
|
47
|
+
// registry to keeping documented and declared params in sync (a documented-but-
|
|
48
|
+
// undeclared param was once silently rejected under additionalProperties:false).
|
|
87
49
|
confirmToken: {
|
|
88
50
|
type: "string",
|
|
89
51
|
description: "The token returned by a previous call that carried \"answer\". Recording a confirmed value " +
|
|
@@ -94,21 +56,9 @@ const SCHEMA = {
|
|
|
94
56
|
},
|
|
95
57
|
additionalProperties: false,
|
|
96
58
|
};
|
|
97
|
-
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
100
|
-
* Extracted so `describeAction` can call it too: an `action` tool's mint must
|
|
101
|
-
* refuse what its run would refuse, or it asks a developer to confirm a
|
|
102
|
-
* sentence with no referent. The instance that made this concrete here is the
|
|
103
|
-
* worst one this tool can produce — a `scope: "workspace"` answer in a
|
|
104
|
-
* repository with no workspace was described as *"reaching EVERY repository in
|
|
105
|
-
* this workspace"* and then refused on the second call, after the
|
|
106
|
-
* confirmation. Ruled in
|
|
107
|
-
* `documents/decisions-inbox/DEC-387.md`.
|
|
108
|
-
*
|
|
109
|
-
* Reads the session only for `config.workspace`; writes nothing, so it is safe
|
|
110
|
-
* to run at mint time, outside the call budget.
|
|
111
|
-
*/
|
|
59
|
+
/** The `answer` arg, read+validated once — shared by `describeAction` so mint and run
|
|
60
|
+
* refuse identically (DEC-387: a `scope:"workspace"` answer was once described as
|
|
61
|
+
* workspace-wide then refused on redemption). Reads only `config.workspace`, writes nothing. */
|
|
112
62
|
function readAnswer(answerArg, session) {
|
|
113
63
|
if (typeof answerArg !== "object" || answerArg === null) {
|
|
114
64
|
throw new ToolInputError('"answer" must be an object');
|
|
@@ -128,6 +78,7 @@ function readAnswer(answerArg, session) {
|
|
|
128
78
|
async function run(args, ctx) {
|
|
129
79
|
const { session } = ctx;
|
|
130
80
|
const notes = [];
|
|
81
|
+
// `confirmedFacts` is readonly and loaded once at session start; merged locally below instead of a mid-call disk reload.
|
|
131
82
|
let facts = session.config.confirmedFacts;
|
|
132
83
|
let recorded = null;
|
|
133
84
|
const answerArg = args["answer"];
|
|
@@ -136,13 +87,9 @@ async function run(args, ctx) {
|
|
|
136
87
|
throw new ToolInputError('"answer" must be an object');
|
|
137
88
|
}
|
|
138
89
|
const { blockedBy, value, environment, confirmedBy, scope } = readAnswer(answerArg, session);
|
|
139
|
-
//
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
// Best-effort: a repo path with no git history (a fixture, a non-git
|
|
143
|
-
// checkout) simply cannot supply one, and that is exactly the "unknown"
|
|
144
|
-
// case `confirmedAtCommit` is designed to carry as an absence rather than
|
|
145
|
-
// a guess — never let this recording fail because the disclosure couldn't.
|
|
90
|
+
// `confirmedAtCommit`: repo's commit at answer time, so a later mint can tell if
|
|
91
|
+
// code moved since. Best-effort — no git history means no value, an absence not
|
|
92
|
+
// a guess; must never fail the recording because the disclosure couldn't.
|
|
146
93
|
const confirmedAtCommit = await session
|
|
147
94
|
.root()
|
|
148
95
|
.then((r) => r.commitSha)
|
|
@@ -156,9 +103,8 @@ async function run(args, ctx) {
|
|
|
156
103
|
confirmedAt: new Date().toISOString(),
|
|
157
104
|
...(confirmedAtCommit === undefined ? {} : { confirmedAtCommit }),
|
|
158
105
|
scope,
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
// in was later re-linked into a different workspace.
|
|
106
|
+
// Stamped on the fact, not looked up at read time — a fact must not reach
|
|
107
|
+
// further because its repo was later re-linked into a different workspace.
|
|
162
108
|
...(scope === "workspace" && session.config.workspace !== undefined
|
|
163
109
|
? { workspace: session.config.workspace }
|
|
164
110
|
: {}),
|
|
@@ -177,10 +123,8 @@ async function run(args, ctx) {
|
|
|
177
123
|
const provider = session.provider();
|
|
178
124
|
const { refs, truncated } = provider.unresolvedRefs();
|
|
179
125
|
const total = counts(session.store().driver).unresolvedRefs;
|
|
180
|
-
//
|
|
181
|
-
//
|
|
182
|
-
// those actually reach this repository — this call supplies the candidates,
|
|
183
|
-
// it does not pre-approve them.
|
|
126
|
+
// Plus workspace-scoped facts from `link_workspace` siblings. `applyConfirmedFacts`
|
|
127
|
+
// decides which actually reach this repo — this call only supplies candidates.
|
|
184
128
|
const { answered, stillOpen } = applyConfirmedFacts(refs, [...facts, ...(session.config.linkedFacts ?? [])], session.config.repo, session.config.workspace);
|
|
185
129
|
const grouped = groupRefusalsIntoQuestions(session.config.repo, stillOpen);
|
|
186
130
|
if (truncated) {
|
|
@@ -195,10 +139,8 @@ async function run(args, ctx) {
|
|
|
195
139
|
if (answered.length > 0) {
|
|
196
140
|
notes.push(`${answered.length} previously-open row(s) are already answered by a stored confirmed fact and ` +
|
|
197
141
|
"are not listed as questions.");
|
|
198
|
-
// Named, never folded in
|
|
199
|
-
//
|
|
200
|
-
// different facts about what this developer actually knows, and only the
|
|
201
|
-
// second one carries the risk the scope field exists to make deliberate.
|
|
142
|
+
// Named, never folded in — "answered here" vs "answered elsewhere as workspace-wide"
|
|
143
|
+
// are different facts, and only the second carries the risk `scope` makes deliberate.
|
|
202
144
|
const elsewhere = answered.filter((a) => a.fromAnotherRepo);
|
|
203
145
|
if (elsewhere.length > 0) {
|
|
204
146
|
const repos = [...new Set(elsewhere.flatMap((a) => a.facts.map((f) => f.repo)))].sort();
|
|
@@ -220,23 +162,17 @@ async function run(args, ctx) {
|
|
|
220
162
|
`${grouped.questions.reduce((n, q) => n + q.sites.length, 0)} call site(s).`;
|
|
221
163
|
return answer({
|
|
222
164
|
headline,
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
// axis this tool never conflates with resolution. `UnresolvedRef` itself
|
|
227
|
-
// carries no resolution level (refusals are not edges and were never
|
|
228
|
-
// scored, per DEC-223's own matching function), so R0 is the honest
|
|
229
|
-
// floor rather than a borrowed number — the same choice `link_workspace`
|
|
230
|
-
// makes for the same reason: this is not a claim resting on graph edges.
|
|
165
|
+
// Name-level fact (expression present or not, same class as a missing env var).
|
|
166
|
+
// `UnresolvedRef` carries no resolution level (refusals aren't edges, DEC-223),
|
|
167
|
+
// so R0 is the honest floor — same choice `link_workspace` makes, same reason.
|
|
231
168
|
nameLevel: true,
|
|
232
169
|
resolutionFloor: 0,
|
|
233
170
|
commitSha: provider.baseStamp().commitSha,
|
|
234
171
|
graphBuiltAt: provider.baseStamp().graphBuiltAt,
|
|
235
172
|
irSchemaVersion: provider.baseStamp().irSchemaVersion,
|
|
236
173
|
commitSpread: provider.baseStamp().commitSpread,
|
|
237
|
-
// Empty only for a pure read
|
|
238
|
-
//
|
|
239
|
-
// to empty the queue is a successful write, not an empty search.
|
|
174
|
+
// Empty only for a pure read finding nothing open (`classifiedRows` is real).
|
|
175
|
+
// An answer that happens to empty the queue is a write, not an empty search.
|
|
240
176
|
...(recorded === null && grouped.questions.length === 0 ? { state: "empty" } : {}),
|
|
241
177
|
notes,
|
|
242
178
|
data: {
|
|
@@ -249,29 +185,21 @@ async function run(args, ctx) {
|
|
|
249
185
|
},
|
|
250
186
|
});
|
|
251
187
|
}
|
|
252
|
-
/**
|
|
253
|
-
*
|
|
254
|
-
* a
|
|
255
|
-
* answerable on the first call, or this tool could not answer the first
|
|
256
|
-
* question ever asked of it. Only a call that would actually write a
|
|
257
|
-
* `ConfirmedFact` describes itself, so `resolveActionDispatch` mints a token
|
|
258
|
-
* for that call alone.
|
|
259
|
-
*/
|
|
188
|
+
/** §7's handshake gate. `undefined` = nothing to confirm (pure read must stay
|
|
189
|
+
* answerable on the first call). Only a write-bound call describes itself, so
|
|
190
|
+
* `resolveActionDispatch` mints a token for that call alone. */
|
|
260
191
|
function describeAction(args, ctx) {
|
|
261
192
|
const answerArg = args["answer"];
|
|
262
|
-
// No `answer`
|
|
263
|
-
//
|
|
264
|
-
//
|
|
265
|
-
// run uses, so a call this tool would refuse is refused here instead of
|
|
266
|
-
// being described and minted.
|
|
193
|
+
// No `answer` = pure read, nothing to confirm — gating it would block the first
|
|
194
|
+
// question ever asked. Other shapes reuse `readAnswer`, so an invalid call is
|
|
195
|
+
// refused here rather than described and minted.
|
|
267
196
|
if (answerArg === undefined)
|
|
268
197
|
return undefined;
|
|
269
198
|
const { blockedBy, value, environment, scope } = readAnswer(answerArg, ctx.session);
|
|
270
199
|
return (`record a ConfirmedFact: "${blockedBy}" = "${value}"` +
|
|
271
200
|
(typeof environment === "string" ? ` (environment: ${environment})` : "") +
|
|
272
|
-
//
|
|
273
|
-
//
|
|
274
|
-
// handshake exists so nothing is performed that was not described.
|
|
201
|
+
// Reach is part of what's approved — a workspace answer affects repos the
|
|
202
|
+
// approver isn't looking at; §7's handshake exists so nothing runs undescribed.
|
|
275
203
|
(scope === "workspace"
|
|
276
204
|
? " — reaching EVERY repository in this workspace, not just this one,"
|
|
277
205
|
: " — in this repository only,") +
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/tools/questions.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"questions.js","sourceRoot":"","sources":["../../src/tools/questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,44 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `refusal_fetch` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* The logic underneath — `summariseRefusals`/`fetchRefusalPage`
|
|
8
|
-
* (`@descryy/core`'s `query/refusal-fetch.ts`) — is already built and
|
|
9
|
-
* unit-tested; this is the tool boundary its own header names as still open:
|
|
10
|
-
* *"An MCP surface that wants a prettier, shorter token... is free to wrap
|
|
11
|
-
* this — that is a presentation choice for P27."* No wrapping was needed —
|
|
12
|
-
* the handle is already opaque and self-describing — so this tool is thin:
|
|
13
|
-
* read the population, hand it to whichever of the two functions the call
|
|
14
|
-
* shape asks for.
|
|
15
|
-
*
|
|
16
|
-
* ## Two calls, one tool — same pattern `questions.ts` already uses
|
|
17
|
-
*
|
|
18
|
-
* No `handle` argument → a fresh summary (`summariseRefusals`): cheap, one
|
|
19
|
-
* count, one exemplar, a handle. A `handle` argument → redeem it for a real
|
|
20
|
-
* page (`fetchRefusalPage`). This mirrors `questions.ts`'s own "no `answer`
|
|
21
|
-
* argument is a pure read" split rather than inventing a second shape.
|
|
22
|
-
*
|
|
23
|
-
* ## The call-site trap this tool must not reproduce
|
|
24
|
-
*
|
|
25
|
-
* `refusal-fetch.ts`'s own header names it explicitly: the store reader
|
|
26
|
-
* defaults to `classified: true`, which silently drops every unclassified
|
|
27
|
-
* row (DEC-243's grouper only wants the classifiable subset). This tool
|
|
28
|
-
* always asks for `{ classified: false }` — the complete ledger, classified
|
|
29
|
-
* and unclassified alike — because a `refusal_fetch` that only showed the
|
|
30
|
-
* askable subset would be the empty-denominator defect wearing this
|
|
31
|
-
* technique's clothes, exactly what that module's header warns against.
|
|
32
|
-
*
|
|
33
|
-
* ## No cap on the population read
|
|
34
|
-
*
|
|
35
|
-
* `provider.unresolvedRefs({ classified: false })` is called with no
|
|
36
|
-
* `limit` — the handle's population fingerprint has to be stable between the
|
|
37
|
-
* summary call and every page redemption, and a capped read here would make
|
|
38
|
-
* "the ledger changed" indistinguishable from "the cap sampled differently
|
|
39
|
-
* this time." Correctness over a cheap shortcut, same choice `refusal-fetch.ts`
|
|
40
|
-
* itself already made.
|
|
41
|
-
*/
|
|
2
|
+
* `refusal_fetch` — §4 technique 4: summarise, never enumerate (count, exemplar,
|
|
3
|
+
* handle). No `handle` → fresh summary; `handle` → redeem a page (mirrors
|
|
4
|
+
* `questions.ts`). Always reads `{classified: false}` — the default `true` would
|
|
5
|
+
* silently drop unclassified rows (DEC-243). No `limit`: the population must stay stable. */
|
|
42
6
|
import { type ToolDefinition } from "./kit.ts";
|
|
43
7
|
export interface RefusalFetchSummaryItem {
|
|
44
8
|
readonly fromNodeId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refusal-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/refusal-fetch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"refusal-fetch.d.ts","sourceRoot":"","sources":["../../src/tools/refusal-fetch.ts"],"names":[],"mappings":"AAAA;;;;6FAI6F;AAI7F,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,UAAU,CAAC;AAqBlB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,qGAAqG;IACrG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uGAAuG;IACvG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACnD,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,GAAG,oBAAoB,CAAC;AAkF9E,eAAO,MAAM,gBAAgB,EAAE,cAe9B,CAAC"}
|
|
@@ -1,44 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `refusal_fetch` —
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* The logic underneath — `summariseRefusals`/`fetchRefusalPage`
|
|
8
|
-
* (`@descryy/core`'s `query/refusal-fetch.ts`) — is already built and
|
|
9
|
-
* unit-tested; this is the tool boundary its own header names as still open:
|
|
10
|
-
* *"An MCP surface that wants a prettier, shorter token... is free to wrap
|
|
11
|
-
* this — that is a presentation choice for P27."* No wrapping was needed —
|
|
12
|
-
* the handle is already opaque and self-describing — so this tool is thin:
|
|
13
|
-
* read the population, hand it to whichever of the two functions the call
|
|
14
|
-
* shape asks for.
|
|
15
|
-
*
|
|
16
|
-
* ## Two calls, one tool — same pattern `questions.ts` already uses
|
|
17
|
-
*
|
|
18
|
-
* No `handle` argument → a fresh summary (`summariseRefusals`): cheap, one
|
|
19
|
-
* count, one exemplar, a handle. A `handle` argument → redeem it for a real
|
|
20
|
-
* page (`fetchRefusalPage`). This mirrors `questions.ts`'s own "no `answer`
|
|
21
|
-
* argument is a pure read" split rather than inventing a second shape.
|
|
22
|
-
*
|
|
23
|
-
* ## The call-site trap this tool must not reproduce
|
|
24
|
-
*
|
|
25
|
-
* `refusal-fetch.ts`'s own header names it explicitly: the store reader
|
|
26
|
-
* defaults to `classified: true`, which silently drops every unclassified
|
|
27
|
-
* row (DEC-243's grouper only wants the classifiable subset). This tool
|
|
28
|
-
* always asks for `{ classified: false }` — the complete ledger, classified
|
|
29
|
-
* and unclassified alike — because a `refusal_fetch` that only showed the
|
|
30
|
-
* askable subset would be the empty-denominator defect wearing this
|
|
31
|
-
* technique's clothes, exactly what that module's header warns against.
|
|
32
|
-
*
|
|
33
|
-
* ## No cap on the population read
|
|
34
|
-
*
|
|
35
|
-
* `provider.unresolvedRefs({ classified: false })` is called with no
|
|
36
|
-
* `limit` — the handle's population fingerprint has to be stable between the
|
|
37
|
-
* summary call and every page redemption, and a capped read here would make
|
|
38
|
-
* "the ledger changed" indistinguishable from "the cap sampled differently
|
|
39
|
-
* this time." Correctness over a cheap shortcut, same choice `refusal-fetch.ts`
|
|
40
|
-
* itself already made.
|
|
41
|
-
*/
|
|
2
|
+
* `refusal_fetch` — §4 technique 4: summarise, never enumerate (count, exemplar,
|
|
3
|
+
* handle). No `handle` → fresh summary; `handle` → redeem a page (mirrors
|
|
4
|
+
* `questions.ts`). Always reads `{classified: false}` — the default `true` would
|
|
5
|
+
* silently drop unclassified rows (DEC-243). No `limit`: the population must stay stable. */
|
|
42
6
|
import { fetchRefusalPage, summariseRefusals } from "@descryy/core";
|
|
43
7
|
import { answer, optionalInteger, optionalString, } from "./kit.js";
|
|
44
8
|
const SCHEMA = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refusal-fetch.js","sourceRoot":"","sources":["../../src/tools/refusal-fetch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"refusal-fetch.js","sourceRoot":"","sources":["../../src/tools/refusal-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,59 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* machine's rather than a person's. `observe_runtime` already spawns real
|
|
6
|
-
* processes and watches them; a process that exits non-zero or takes a fatal
|
|
7
|
-
* signal really did fail, and that is a fact about the world in the same class
|
|
8
|
-
* as the R4 edges that tool already writes.
|
|
9
|
-
*
|
|
10
|
-
* ## An exception is not an incident, and this is where that bites hardest
|
|
11
|
-
*
|
|
12
|
-
* The obvious design — every `EXCEPTION` becomes an incident — is wrong and
|
|
13
|
-
* would be the worst instance of the pollution the whole incident ruling is
|
|
14
|
-
* about. A caught, expected error during a run Descry itself provoked is not a
|
|
15
|
-
* production failure, and `INCIDENT` is an EARNED-class claim that biases diff
|
|
16
|
-
* scoping permanently. The conformance fixture prints a real `Error.stack` on a
|
|
17
|
-
* timer precisely to have caught exceptions in the stream, and none of them may
|
|
18
|
-
* mint anything.
|
|
19
|
-
*
|
|
20
|
-
* So the qualifying condition is about the **process**, not the log:
|
|
21
|
-
*
|
|
22
|
-
* - a non-zero exit code, or
|
|
23
|
-
* - a fatal signal Descry did not send.
|
|
24
|
-
*
|
|
25
|
-
* The second half needs care, because Descry's own teardown *is* a signal.
|
|
26
|
-
* `SIGTERM` at the end of an observation window is the orchestrator stopping a
|
|
27
|
-
* healthy service, and reading it as a crash would make every successful run
|
|
28
|
-
* mint an incident. Only the signals a process takes when it dies of its own
|
|
29
|
-
* accord count — see `FATAL_SIGNALS`.
|
|
30
|
-
*
|
|
31
|
-
* ## What the incident is correlated to, and what that claim is
|
|
32
|
-
*
|
|
33
|
-
* Every file named by an `EXCEPTION` source location observed during the run.
|
|
34
|
-
* That is deliberately *not* "the cause": nothing here knows which exception
|
|
35
|
-
* killed the process, and picking the last one would be recency standing in for
|
|
36
|
-
* causality. The honest claim, and the one the record's own summary makes, is
|
|
37
|
-
* **"these files were implicated in a run in which this service died"** — real,
|
|
38
|
-
* checkable, and weaker than a root cause.
|
|
39
|
-
*
|
|
40
|
-
* This is also better than the ruling predicted.
|
|
41
|
-
* `DEC-NEXT-collector-evidence-carries-no-service-name` blocks the *correlator*
|
|
42
|
-
* from resolving symbol evidence, so the decision expected this mechanism to
|
|
43
|
-
* mint an incident with no file edges at all. It does not need the correlator:
|
|
44
|
-
* `Evidence.sourceLocation.file` is an absolute path the adapter already
|
|
45
|
-
* parsed, and turning it into a repo-relative one is a subtraction, not a
|
|
46
|
-
* resolution.
|
|
47
|
-
*
|
|
48
|
-
* ## Durability
|
|
49
|
-
*
|
|
50
|
-
* Written as a `ConfirmedIncident` carrying `observedInRun`, which is what the
|
|
51
|
-
* projecting source reads to stamp `detectedVia: "runtime-observed"`. A run is
|
|
52
|
-
* gone once the process exits, so the record cannot live only in a store that
|
|
53
|
-
* DEC-017 drops on the next schema bump — the same argument that put a
|
|
54
|
-
* developer's testimony in `.descry/config.json`, reached from the other side.
|
|
55
|
-
*
|
|
56
|
-
* See `DEC-NEXT-incident-minting-beyond-explicit-reverts`.
|
|
2
|
+
* Mints an `INCIDENT` from `observe_runtime`'s process exit/signal, never
|
|
3
|
+
* from `EXCEPTION` events (a caught, provoked error isn't a failure).
|
|
4
|
+
* Correlates to files an exception named — "implicated", not "caused". See `DEC-NEXT-incident-minting-beyond-explicit-reverts`.
|
|
57
5
|
*/
|
|
58
6
|
import type { ConfirmedIncident } from "@descryy/ir";
|
|
59
7
|
/** One observed service, in the shape `observe_runtime` already reports. */
|
|
@@ -80,13 +28,6 @@ export interface RuntimeIncidentInput {
|
|
|
80
28
|
}
|
|
81
29
|
/** Whether this service's exit is a failure rather than Descry stopping it. */
|
|
82
30
|
export declare function died(outcome: ObservedProcessOutcome): boolean;
|
|
83
|
-
/**
|
|
84
|
-
* The incident a run witnessed, or `null` when every service exited cleanly —
|
|
85
|
-
* which is the overwhelmingly common case and is not a finding.
|
|
86
|
-
*
|
|
87
|
-
* One record per run, not one per dead service: a run in which two services
|
|
88
|
-
* died is one failure of one system observed once, and minting two would double
|
|
89
|
-
* its weight in every ranking that counts incidents.
|
|
90
|
-
*/
|
|
31
|
+
/** The incident a run witnessed, or null when every service exited cleanly (the common case, not a finding). One record per run, not per dead service — two deaths are one system failure, not two. */
|
|
91
32
|
export declare function runtimeObservedIncident(input: RuntimeIncidentInput): ConfirmedIncident | null;
|
|
92
33
|
//# sourceMappingURL=runtime-incident.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-incident.d.ts","sourceRoot":"","sources":["../../src/tools/runtime-incident.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"runtime-incident.d.ts","sourceRoot":"","sources":["../../src/tools/runtime-incident.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAYrD,4EAA4E;AAC5E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,4EAA4E;AAC5E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,iFAAiF;IACjF,QAAQ,CAAC,kBAAkB,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAClE,kFAAkF;IAClF,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAI7D;AAWD,uMAAuM;AACvM,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,IAAI,CAkC7F"}
|