any-doctor 0.2.0 → 0.2.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/CONTEXT.md CHANGED
@@ -5,11 +5,10 @@ When a term here conflicts with language elsewhere, this file wins.
5
5
 
6
6
  Current product intent lives in [docs/vision.md](docs/vision.md). For work on
7
7
  persistent decisions, history, identity, or team convergence, read the
8
- [lifecycle design](docs/plans/finding-lifecycle/design.md); the first identity
9
- delivery (lifecycle M1, slices A1+A2) is planned in
10
- [analysis improvements](docs/plans/analysis-improvements.md). Their proposed records
11
- are not implemented interfaces; the glossary below describes current behavior
12
- unless a term is explicitly marked planned.
8
+ [lifecycle design](docs/plans/finding-lifecycle/design.md). Identity (M1) and
9
+ remembered local decisions (M2) have landed; Git-shared decisions (M3) and
10
+ bounded history (M4) remain planned. The glossary below describes current
11
+ behavior unless a term is explicitly marked planned.
13
12
 
14
13
  ## Doctor program
15
14
 
@@ -88,8 +87,8 @@ tree without rebuilding it. A SiteFinding's readKey
88
87
  Text the dashboard copies to the clipboard as one unit of agent work: one
89
88
  finding (fixPrompt), every finding of one check (checkFixPrompt), or a
90
89
  doctor's whole batch (doctorFixPrompt) — pure functions of Doctor-tree
91
- types plus the verify command, no terminal required. The lifecycle plan
92
- (M2) reworks this family toward investigation-first framing and
90
+ types plus the verify command, no terminal required. The local-decision
91
+ delivery (M2) reworked this family toward investigation-first framing and
93
92
  authorized decision paths.
94
93
 
95
94
  ## Gate
@@ -384,9 +383,10 @@ Where a doctor program lives: repo-local (`./doctors/`, committed with
384
383
  the consuming repo), user-global (`~/.any-doctor/doctors/`, available
385
384
  in every repo), or bundled (the first-party pack inside the package,
386
385
  read-only — a starting point, not a dependency). Repo-local wins slug
387
- collisions, then user-global, then bundled. Scanning a target repo
388
- currently does not persist state in any scope. Planned CLI-owned state is
389
- separate from doctor discovery and does not grant doctors write capabilities.
386
+ collisions, then user-global, then bundled. Scanning itself remains read-only.
387
+ Recording a review decision creates CLI-owned local state under the target's
388
+ `.any-doctor/` directory; that state is separate from doctor discovery and does
389
+ not grant doctors write capabilities.
390
390
 
391
391
  ## Skill
392
392
 
@@ -406,18 +406,19 @@ positive witness. Unspecified legacy units and unavailable analysis are
406
406
  reported as not exercised, not counted as passing. Fixture expectations
407
407
  establish tested coverage, not general correctness or independence of labels.
408
408
 
409
- ## Lifecycle vocabulary (planned, except where marked landed)
409
+ ## Lifecycle vocabulary
410
410
 
411
- These terms describe the accepted direction, not current fields on Finding or
412
- DoctorCtx. The [design](docs/plans/finding-lifecycle/design.md) owns their data
413
- and applicability rules.
411
+ These terms describe shipped and planned lifecycle behavior. They are CLI-owned,
412
+ not DoctorCtx capabilities. The [design](docs/plans/finding-lifecycle/design.md)
413
+ owns their data and applicability rules.
414
414
 
415
- - **Finding identity** *(landed in the diff path, D30)*: continuity of one
415
+ - **Finding identity** *(landed in diff and local decisions, D30/D31)*: continuity of one
416
416
  occurrence across comparable scans, distinct from its current source
417
- coordinates. Host-derived today — check key, file, normalized flagged-line
418
- digest, indentation-relative column, and innermost enclosing function span
419
- computed per comparison from one post-scan read, never persisted.
420
- - **Observation:** evidence that a finding was detected in a particular scan.
417
+ coordinates. Host-derived today — check key, file, normalized evidence digest,
418
+ indentation-relative column, and innermost enclosing function span. The CLI
419
+ computes it from source-bound capture; local decisions persist the resulting key.
420
+ - **Observation** *(planned, M4)*: evidence that a finding was detected in a
421
+ particular retained scan.
421
422
  - **Decision** *(landed locally, D31)*: a reasoned accepted/not-applicable
422
423
  disposition with a required reason, stored in the local decisions file,
423
424
  reversible, attached to a Finding identity — it changes review state
@@ -429,7 +430,8 @@ and applicability rules.
429
430
  matched by cardinality are flagged ambiguous.
430
431
  - **No longer detected** *(landed in the diff path)*: absence established by
431
432
  compatible, completed coverage.
432
- - **Claimed fix:** a recorded explanation of remediation, separate from rescan evidence.
433
+ - **Claimed fix** *(planned, M4)*: a recorded explanation of remediation,
434
+ separate from rescan evidence.
433
435
  - **Reassessment** *(landed locally)*: a decision requires review because
434
436
  its evidence changed — the finding resurfaces with a warning; the
435
437
  decision is never silently carried.
package/README.md CHANGED
@@ -13,8 +13,9 @@ rescan after changes. Saved doctors run without model inference.
13
13
 
14
14
  Analysis runs locally without an account, API key, or telemetry. Package/tool
15
15
  installation can require downloads; the doctor runtime has no network access.
16
- Remembered decisions and finding history are [planned](docs/plans/finding-lifecycle/proposal.md),
17
- not available yet.
16
+ Remembered local decisions persist between runs and resurface when their source
17
+ evidence or doctor meaning changes. Shared project decisions and finding history
18
+ remain [planned](docs/plans/finding-lifecycle/proposal.md).
18
19
 
19
20
  [![npm version](https://img.shields.io/npm/v/any-doctor.svg)](https://www.npmjs.com/package/any-doctor)
20
21
  [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](#)
@@ -38,6 +39,13 @@ npx any-doctor@latest run slop # one doctor, straight to the report
38
39
  Non-terminals and CI never see a prompt — output is stable and pipeable
39
40
  (`--format json`, or `ANY_DOCTOR_HEADLESS=1`).
40
41
 
42
+ During review, press `a` to accept an applicable concern or `x` to mark it not
43
+ applicable; both require a reason. The decision is stored locally under
44
+ `.any-doctor/`, hides the matching occurrence from later active lists, and can
45
+ be inspected or reversed with `any-doctor decisions`. Changed evidence resurfaces
46
+ the finding for reassessment. Local decisions never suppress raw JSON findings or
47
+ change CI gates; keep `.any-doctor/decisions.local.json` untracked.
48
+
41
49
  ## The bundled pack
42
50
 
43
51
  | Doctor | Discipline | Checks |
@@ -51,8 +59,8 @@ Non-terminals and CI never see a prompt — output is stable and pipeable
51
59
 
52
60
  Checks ship positive and innocent-lookalike fixtures. `verify` compares an
53
61
  exact multiset of rule/file/line and optional column, then runs shared innocent
54
- and sensitivity corpora. Convex checks also declare per-check location coverage;
55
- legacy undeclared coverage is reported as not exercised. Passing fixtures show
62
+ and sensitivity corpora. Every bundled check declares its reporting unit, and
63
+ occurrence checks carry per-check location coverage. Passing fixtures show
56
64
  agreement on those cases, not a general accuracy guarantee. See
57
65
  [the reliability protocol](docs/doctor-reliability.md).
58
66
 
@@ -133,9 +141,9 @@ npx any-doctor@latest run --all --fail-on warning --base origin/main
133
141
  | [CONTEXT.md](CONTEXT.md) | Domain glossary — canonical terms |
134
142
  | [docs/vision.md](docs/vision.md) | Current goals and product direction |
135
143
  | [docs/features.md](docs/features.md) | Available features versus planned work |
136
- | [docs/plans/analysis-improvements.md](docs/plans/analysis-improvements.md) | Next slice: source evidence, identity, and reliable Git-base comparisons |
137
- | [docs/plans/finding-lifecycle/proposal.md](docs/plans/finding-lifecycle/proposal.md) | Planned decisions, history, and team workflows |
138
- | [docs/plans/finding-lifecycle/design.md](docs/plans/finding-lifecycle/design.md) | State ownership, SQLite, Git convergence, and open choices |
144
+ | [docs/plans/analysis-improvements.md](docs/plans/analysis-improvements.md) | Delivered identity work and later analysis opportunities |
145
+ | [docs/plans/finding-lifecycle/proposal.md](docs/plans/finding-lifecycle/proposal.md) | Current local decisions plus planned history and team workflows |
146
+ | [docs/plans/finding-lifecycle/design.md](docs/plans/finding-lifecycle/design.md) | State ownership, Git convergence, future history storage, and open choices |
139
147
  | [docs/plans/finding-lifecycle/milestones.md](docs/plans/finding-lifecycle/milestones.md) | Implementation slices and acceptance evidence |
140
148
  | [docs/HANDOFF.md](docs/HANDOFF.md) | Current handoff and next bounded task |
141
149
  | [docs/decisions.md](docs/decisions.md) | Historical choices and explicit supersessions |
@@ -145,7 +153,9 @@ npx any-doctor@latest run --all --fail-on warning --base origin/main
145
153
 
146
154
  ## Status
147
155
 
148
- Pre-1.0. The next direction is reliable finding identity, remembered decisions,
149
- team sharing, and bounded local history. Scanning stays available through npx
150
- without mandatory initialization. See the [feature map](docs/features.md) for
151
- current availability. MIT.
156
+ Pre-1.0. Finding identity and remembered local decisions are available. The next
157
+ product phase is real-world adoption and reliability feedback; the next planned
158
+ lifecycle feature is Git-shared project decisions, followed separately by bounded
159
+ local history. Scanning stays available through npx without mandatory
160
+ initialization. See the [feature map](docs/features.md) for current availability.
161
+ MIT.
package/docs/HANDOFF.md CHANGED
@@ -1,117 +1,94 @@
1
- # Handoff — finding lifecycle planning
1
+ # Handoff — post-0.2.0 adoption and finding lifecycle
2
2
 
3
- Updated September 10, 2026. Start here when continuing Any Doctor's product direction
4
- or implementing decisions, history, identity, or team sharing.
3
+ Updated September 22, 2026. Start here when continuing Any Doctor's product
4
+ direction, adoption work, decisions, history, identity, or team sharing.
5
+
6
+ ## Current release state
7
+
8
+ - npm package: `any-doctor@0.2.0`.
9
+ - Source release tag: `v0.2.0` at `3f98de0`.
10
+ - `main` additionally contains `5b91bf8`, a test-only PTY release-gate
11
+ stabilization; the packed artifact was byte-identical after that change.
12
+ - Release verification completed with 1,091 tests, all bundled doctors verified,
13
+ capability-gap certification, packed-consumer checks and a clean diff check.
14
+
15
+ Recheck npm, HEAD and the working tree before making a new release claim. Evidence
16
+ records describe their named candidates; they are not automatically current.
5
17
 
6
18
  ## Read in order
7
19
 
8
- 1. [Vision](vision.md): the maintainer's three priorities and the trust model.
9
- 2. [Feature map](features.md): available behavior versus planned work.
10
- 3. [Lifecycle proposal](plans/finding-lifecycle/proposal.md): user and agent workflows.
11
- 4. [Lifecycle design](plans/finding-lifecycle/design.md): ownership, storage,
12
- identity, Git reconciliation, scale, and unresolved choices.
13
- 5. [Milestones](plans/finding-lifecycle/milestones.md): bounded delivery and evidence.
14
- 6. [Analysis improvements](plans/analysis-improvements.md): the concrete M1
15
- implementation scope, anchor/contract choices, and strict acceptance matrix.
16
-
17
- D29 in [decisions.md](decisions.md) records this direction. Current terms remain in
18
- [CONTEXT.md](../CONTEXT.md); planned lifecycle terms are explicitly marked there.
19
-
20
- ## Current state
21
-
22
- This documentation pass began on a clean checkout at source HEAD 4adf69c. The
23
- package declared version 0.0.7. Recheck branch, HEAD, dirty state, runtime, and
24
- publication status before implementation; these are inspection facts, not a
25
- permanent baseline or proof of what npm currently serves.
26
-
27
- The prior Convex/certification repair is now part of the inspected source, followed
28
- by additional review commits. Its [audit](repair-audit-007.md) records the exact
29
- older candidate tested, including 286 tests and 100 Convex verification rows.
30
- Those results must not be presented as a fresh test of later source or this plan.
31
-
32
- **Delivered on `implement/analysis-a1-a2` (A1+A2, D30 + identity-repair
33
- amendment):** the `--base` diff compares through the host-derived identity
34
- layer added / continuing / no-longer-detected with contextFallback,
35
- ambiguous, stale, lineScoped, unreadable, and contextUnavailable surfaced in
36
- report, JSON, and gate paths. `compareFindings` stays the strict fixture gate.
37
- An adversarial review's four findings are repaired with its probes as
38
- regression tests: literal-preserving normalization (quote-state scanner;
39
- string/template/regex interiors byte-exact), execution-bound provenance and
40
- evidence (pre-scan doctor digests, scan-adjacent immutable source capture,
41
- post-capture consistency recheck), optional host-validated Finding evidence
42
- ranges (multiline continuation edits break identity; scope surfaced as
43
- lineScoped), and linear duplicate matching (per-bucket cursors; 100k
44
- identical pairs ~58ms dev/identity-bench.mjs is the benchmark of record).
45
- Evidence: 332 tests green plus a packed-artifact smoke on sift-skills (Apple
46
- M1 Pro, 16 GB, Node 26.5.0; full-pack `--base HEAD~5`: 402 continuing / 1
47
- added the added finding cross-checked against git as a gitignored
48
- working-tree artifact 402 lineScoped honestly reported because no bundled
49
- doctor emits ranges yet). Remaining limitations (D30 amendment, explicitly
50
- not guarantees): edits during a scan itself remain undetectable;
51
- receiver/declaration linkage unused; same-line occurrences need columns;
52
- bundled doctors emit no evidence ranges yet. The CLI still has no persistent
53
- decision store, SQLite layer, or finding history.
54
-
55
- **Architecture pass (same branch):** the dashboard split into its three
56
- concerns src/doctor-tree.ts (the view-model: SiteFinding, buildTree,
57
- summaries, expansion defaults), src/prompts.ts (the Task prompt family),
58
- and a slimmer src/dashboard.ts (layout, frame, loop, read state);
59
- RunOutcome/CrashedDoctor/cohortFileCount/DEFAULT_EXTS moved to
60
- contract.ts. Strictly behavior-preserving (test bodies unchanged, import
61
- sources updated); glossary entries added (Dashboard, Doctor tree, Task
62
- prompt). M2's decision workflow now lands in the loop's state and the
63
- prompt family without piercing the tree.
64
-
65
- **Delivered on `implement/m2-decisions` (M2, D31):** local remembered
66
- decisions end to end flat atomic state (no SQLite; the coupling rule
67
- is auto-history database, reconsidered at M4), decide/decisions
68
- commands, dashboard a/x/v/u with a reason prompt, exact-identity
69
- application with visible reassessment, gates on raw findings, packed-
70
- install acceptance on sift-skills (decide fresh-process rescan hides
71
- and annotates inspect reverse), 370 tests. Five review loops plus two adversarial repair rounds closed
72
- the findings: the loops caught and fixed a duplicate-suppression
73
- defect (identical occurrences now hold decisions back as ambiguous), an
74
- unreachable reason pane, a falsely-claimed flag refusal, NUL-bearing
75
- keys that could not cross argv (now base64url everywhere a shell can
76
- see them), and an encoded-key recording regression — all pinned by
77
- tests, with D31 recording the overclaims honestly.
78
-
79
- ## Next bounded scope
80
-
81
- M2 remember one decision end to end is next, per the
82
- [milestones](plans/finding-lifecycle/milestones.md). The identity layer's v1
83
- choices are recorded in D30 and the [design](plans/finding-lifecycle/design.md)
84
- open-choice table; per-check compatibility revisions and doctor-supplied
85
- evidence are still open there because nothing persists yet.
86
-
87
- Broader module resolution, value flow, control flow, and optional types are later
88
- independently scoped capabilities. They do not all block M2/M3. Measure the real
89
- scanner separately from synthetic identity records; report current limits and
90
- assign scanner-scale work explicitly before claiming massive-codebase capacity.
91
-
92
- M3 (share decisions through Git, CI application) is next; M4 adds bounded
93
- history. These are planning increments, not authorization to run all four
94
- or publish a version.
95
- Resolve open choices in their milestone and write accepted decisions back to the
96
- design and decision log. Maintain one-off read-only scans and doctor confinement.
97
-
98
- ## Product constraints to preserve
99
-
100
- Useful contextual findings and user-defined conventions remain in scope. The goal
101
- is better review with the user's own agent, not forcing every report to zero.
102
- Accepted concerns, not-applicable findings, observed disappearance, and claimed
103
- fixes must remain distinct. A dismissal does not authorize broad detector changes.
104
-
105
- SQLite is local state; committed project files are authoritative for team decisions.
106
- Private decisions cannot silently change CI. Git branch changes and semantic merge
107
- conflicts must be tested, including cache rebuild from shared records. No mandatory
108
- hosted service, account, init, or built-in model provider is required.
109
-
110
- ## Validation for the next agent
111
-
112
- Use the milestone's acceptance cases and independent counterexamples. Review the
113
- actual candidate, pack/install it, and exercise a real target such as Sift without
114
- changing unrelated product code. Sift alone does not validate massive-codebase
115
- performance; retain the scale harness results and limits too. Update this handoff
116
- with the delivered slice, exact evidence, and remaining open choices. The maintainer
117
- owns versioning and publication unless a later instruction explicitly changes that.
20
+ 1. [Vision](vision.md): purpose and trust model.
21
+ 2. [Feature map](features.md): shipped behavior versus planned work.
22
+ 3. [Lifecycle proposal](plans/finding-lifecycle/proposal.md): user and agent
23
+ workflows.
24
+ 4. [Lifecycle design](plans/finding-lifecycle/design.md): state ownership,
25
+ identity, Git reconciliation and remaining choices.
26
+ 5. [Lifecycle milestones](plans/finding-lifecycle/milestones.md): completed M1/M2
27
+ and planned M3/M4 boundaries.
28
+ 6. [Doctor SDK](doctor-sdk.md) and [Value Path](plans/value-path/design.md): the
29
+ shipped semantic authoring surface.
30
+ 7. [Bundled doctor modernization](doctor-modernization.md): current shared seams,
31
+ retained domain policy and verification expectations for every doctor.
32
+
33
+ ## What shipped before and in 0.2.0
34
+
35
+ - M1 identity-aware Git-base comparison with source-bound evidence, conservative
36
+ ambiguity and stale-source handling.
37
+ - M2 remembered local accepted/not-applicable decisions, required reasons,
38
+ reversal, reassessment, dashboard and agent/JSON workflows. State is atomic
39
+ JSON, not SQLite; gates remain based on raw findings.
40
+ - The Doctor SDK semantic result contract, shared recipes and maintained challenge
41
+ profiles.
42
+ - Value Path as a bounded shared property-path query, adopted by Deepgram and
43
+ OpenRouter. A later fidelity audit removed Deepgram's private fallback and
44
+ intentionally narrowed one nested opaque-transfer credential case.
45
+ - Locally complete recipe modules behind one registry.
46
+ - The bundled doctors use the shared provider consistently: Async is recipe-native;
47
+ Deepgram and OpenRouter use Value Path; Convex retains domain-specific graph
48
+ policy over shared facts; Effect and Slop no longer carry line/brace parsers.
49
+
50
+ Authoritative architectural decisions are D30–D33 in
51
+ [decisions.md](decisions.md). Preserved implementation plans and evidence may
52
+ contain older branch names, package versions and baseline counts.
53
+
54
+ ## Immediate phase: adoption
55
+
56
+ Use real repositories to measure:
57
+
58
+ - time to the first useful finding;
59
+ - false positives and missed findings, classified per check;
60
+ - narrowed/unknown cases users expected the tool to answer;
61
+ - first-attempt `generate` `verify` `run` success for a custom doctor;
62
+ - whether users understand and use remembered decisions;
63
+ - installation, performance, terminal and JSON friction.
64
+
65
+ Prefer small `0.2.x` documentation, correctness and usability repairs backed by
66
+ reproductions. A new semantic capability starts from a concrete false positive or
67
+ miss plus valid lookalikes; Value Path remains bounded rather than growing into a
68
+ general JavaScript interpreter.
69
+
70
+ ## Next planned feature: M3 shared project decisions
71
+
72
+ M3 makes selected decisions reviewable Git-tracked project state and applies them
73
+ consistently in fresh checkouts and CI. It must preserve private local decisions,
74
+ raw findings, doctor confinement and one-off read-only scans.
75
+
76
+ Before implementation, resolve and record:
77
+
78
+ - shared record layout and deterministic serialization;
79
+ - doctor namespace/rename identity;
80
+ - semantic conflict behavior after textual Git merges;
81
+ - branch/worktree reconciliation and deletion;
82
+ - read-only CI application and whether shared decisions affect gates;
83
+ - raw, active and reviewed score presentation.
84
+
85
+ M4 bounded history is separate. It is the point to reconsider SQLite or another
86
+ indexed local store; M3 does not require a database merely to share decisions.
87
+
88
+ ## Completion evidence for future slices
89
+
90
+ Bind the exact candidate and target, reproduce the motivating case, run focused
91
+ and full tests, verify all doctors, build and pack, exercise a clean consumer and a
92
+ representative real repository, review the actual diff, and record limitations.
93
+ Publication and version changes remain separate maintainer actions unless a task
94
+ explicitly authorizes them.
package/docs/decisions.md CHANGED
@@ -1313,6 +1313,13 @@ specialized identity and control-flow policy remains local. Later Doctors
1313
1313
  migrate when that same deletion test demonstrates leverage. Accuracy changes
1314
1314
  are reviewed separately from the architecture migration.
1315
1315
 
1316
+ **Later audit note (2026-09-22):** The bundled-doctor modernization audit made
1317
+ one separately reviewed accuracy change: Deepgram now trusts Value Path's unknown
1318
+ result after a configuration is nested inside an object passed to an opaque call,
1319
+ rather than reviving the old resolver's definite credential finding. The case
1320
+ narrows because the opaque call may mutate the nested configuration. D32's
1321
+ architecture and proof boundary are unchanged.
1322
+
1316
1323
  **Consequences:** Doctor programs become smaller policy modules over shared
1317
1324
  semantic proof, while the host owns source integrity, caching, evaluation and
1318
1325
  uncertainty. Certification gains one cross-language-ready conformance contract.
@@ -0,0 +1,44 @@
1
+ # Bundled doctor modernization
2
+
3
+ Updated September 22, 2026. This is the current architecture map for bundled
4
+ doctors. “Modernized” means a doctor uses host-owned facts for language mechanics,
5
+ declares every required capability and unknown policy, and keeps only technology
6
+ meaning behind its own interface. It does not mean every doctor is expressed as
7
+ a recipe or that passing fixtures proves accuracy on arbitrary repositories.
8
+
9
+ | Doctor | Shared mechanics | Deliberately local policy |
10
+ | --- | --- | --- |
11
+ | Async | Identity, option presence, value disposition and resource lifetime through three certified recipes | Which native request, promise-array and React timer observations merit review |
12
+ | Convex | Calls, bindings, types, function ownership, branches, directives and value flow | Convex registration/context/query-chain semantics; generic recipes do not express correlated query paths or context capabilities |
13
+ | Deepgram | Calls, identity and Value Path for property proof | Endpoint/model matrices, transport support, Read validation, hosts and browser credential policy |
14
+ | OpenRouter | Calls, identity, option presence, the required-option recipe and Value Path | Stream provenance, same-chunk guards, response-dependent retry loops and model-pin policy |
15
+ | Effect | Structural search plus shared calls, identity, bindings and exact spans | The Effect v4 skill's policy choices and test-file convention |
16
+ | Slop | Exact spans, calls/value flow, lexical bindings, project consumers and structural fingerprints | Corpus-derived thresholds and the interpretation of maintenance review candidates |
17
+
18
+ ## Audit outcomes
19
+
20
+ - Effect no longer counts braces, scans raw lines for API calls, or parses zod
21
+ argument lists. It resolves imports and aliases, honors shadowing, accepts
22
+ multiline names, uses exact class/function ranges, and reports full evidence.
23
+ - Slop's hostname, overlapping-substring, tri-state and abbreviation checks no
24
+ longer depend on same-line formatting. Receiver identity and actual call
25
+ argument roles remove nearby-lookalike false positives.
26
+ - Deepgram no longer revives a private property-walker answer after Value Path
27
+ returns unknown. A nested configuration passed through an opaque object now
28
+ narrows because mutation cannot be excluded.
29
+ - Async, OpenRouter and Convex already used the accepted shared seams. Their
30
+ specialized policy remains local because moving it into a generic recipe would
31
+ enlarge the interface without a second equivalent consumer.
32
+
33
+ ## Maintainer rule
34
+
35
+ Do not judge modernization by file size or recipe count. Apply the deletion test:
36
+ move a mechanic into the host when deleting the shared module would force the same
37
+ language reasoning back into multiple doctors. Keep technology-specific meaning
38
+ local. Add a Doctor SDK or Value Path capability only from a reproduced miss or
39
+ false positive with definite-positive, negative, uncertain and mixed-neighbor
40
+ evidence. Unsupported flow narrows; it never becomes confident absence.
41
+
42
+ For a release, run the complete suite, `verify --all`, capability-gap certification,
43
+ package dry-run and packed-consumer checks. Compare any changed findings against
44
+ fixed source, not just counts.
@@ -4,10 +4,10 @@ A passing fixture suite establishes agreement on its cases. It does not establis
4
4
  precision on arbitrary repositories. Treat every check as a bounded claim.
5
5
 
6
6
  The [Doctor SDK foundations](doctor-sdk.md) move recurring identity, value-flow,
7
- resource and option mechanics into host-owned semantic queries and certify three
8
- reusable recipes with metadata-selected challenge profiles. The implementation
9
- on its feature branch is a review candidate, not a published compatibility
10
- promise; the [design](plans/doctor-sdk/design.md) remains the governing boundary.
7
+ resource and option mechanics into host-owned semantic queries and certify four
8
+ reusable recipes with metadata-selected challenge profiles. The SDK and Value
9
+ Path are published in `0.2.0`; the [design](plans/doctor-sdk/design.md) records
10
+ their governing boundary.
11
11
 
12
12
  The [vision](vision.md) includes project-specific policies and contextual review
13
13
  candidates alongside defects. Reliability means the evidence supports the stated
@@ -51,14 +51,16 @@ corrected false positive, preserved positive, intentional narrowing, new candida
51
51
  or regression. Counts alone cannot establish improvement. Record versions, target
52
52
  commit and dirty state, analysis availability, crashes, and unsupported cases.
53
53
 
54
- ## Review decisions and reliability (planned)
54
+ ## Review decisions and reliability
55
55
 
56
- The [lifecycle proposal](plans/finding-lifecycle/proposal.md) adds accepted and
57
- not-applicable decisions. Preserve their reasons and distinguish the two: an
56
+ The [lifecycle proposal](plans/finding-lifecycle/proposal.md) defines accepted and
57
+ not-applicable decisions. Local decisions are implemented; project sharing and
58
+ history remain planned. Preserve their reasons and distinguish the two: an
58
59
  accepted concern is not evidence that the detector is wrong. A confirmed
59
60
  not-applicable case should become a counterexample for its rule when appropriate.
60
- Shared decisions change the review view, not raw observations or analysis coverage.
61
- They must not silently teach a doctor to ignore unrelated similar code.
61
+ Decisions change the active review view, not raw observations or analysis coverage.
62
+ Local decisions do not change gates. No decision may silently teach a doctor to
63
+ ignore unrelated similar code.
62
64
 
63
65
  Revalidate decision applicability after relevant source or rule changes. A claimed
64
66
  fix, a disappearance under comparable coverage, and an accepted finding are
@@ -71,7 +73,7 @@ authorize telemetry, uploading source, or automatic global rule changes.
71
73
 
72
74
  ## Current Convex boundaries
73
75
 
74
- Convex revision-2 checks use shared call structure and lexical identity. Supported
76
+ Convex revision-2/3 checks use shared call structure and lexical identity. Supported
75
77
  registration imports, immutable aliases, local handler/config variables and direct
76
78
  handlers establish contexts. Database aliases, destructuring, imported context
77
79
  types (including local aliases and `Pick`), and consistent observed local helper