@weftlet/toolkit 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -1
- package/THIRD_PARTY_NOTICES.md +1 -1
- package/dist/application/application.d.ts +10 -0
- package/dist/application/application.js +20 -0
- package/dist/application/document-code-bindings.d.ts +11 -0
- package/dist/application/document-code-bindings.js +25 -0
- package/dist/application/document-obligations.d.ts +8 -0
- package/dist/application/document-obligations.js +11 -0
- package/dist/application/draft-facts.d.ts +3 -0
- package/dist/application/draft-facts.js +37 -0
- package/dist/application/extraction-identity.d.ts +2 -2
- package/dist/application/extraction-identity.js +7 -1
- package/dist/application/extractor-results.d.ts +6 -0
- package/dist/application/extractor-results.js +6 -0
- package/dist/application/hydrator.js +20 -3
- package/dist/application/mapping-proposals.d.ts +108 -0
- package/dist/application/mapping-proposals.js +142 -0
- package/dist/application/mapping-service.d.ts +2 -0
- package/dist/application/mapping-service.js +5 -0
- package/dist/application/overlay.js +36 -22
- package/dist/application/saved-code-coverage.d.ts +40 -0
- package/dist/application/saved-code-coverage.js +20 -0
- package/dist/application/saved-compatibility.d.ts +38 -0
- package/dist/application/saved-compatibility.js +20 -0
- package/dist/application/saved-evidence.d.ts +17 -11
- package/dist/application/saved-evidence.js +44 -40
- package/dist/application/saved-exploration.d.ts +57 -0
- package/dist/application/saved-exploration.js +21 -0
- package/dist/application/saved-paths.d.ts +58 -0
- package/dist/application/saved-paths.js +20 -0
- package/dist/extraction/call-syntax.d.ts +18 -0
- package/dist/extraction/call-syntax.js +61 -0
- package/dist/extraction/canonical-document-links.d.ts +5 -1
- package/dist/extraction/canonical-document-links.js +4 -4
- package/dist/extraction/code-inventory.d.ts +6 -0
- package/dist/extraction/code-inventory.js +26 -0
- package/dist/extraction/document-code-bindings.d.ts +14 -0
- package/dist/extraction/document-code-bindings.js +121 -0
- package/dist/extraction/document-obligations.d.ts +12 -0
- package/dist/extraction/document-obligations.js +112 -0
- package/dist/extraction/mapping-candidates.d.ts +13 -0
- package/dist/extraction/mapping-candidates.js +46 -0
- package/dist/extraction/mapping-output.d.ts +75 -0
- package/dist/extraction/mapping-output.js +53 -0
- package/dist/extraction/mapping-plan.d.ts +7 -0
- package/dist/extraction/mapping-plan.js +117 -0
- package/dist/extraction/mapping-prompt.d.ts +2 -0
- package/dist/extraction/mapping-prompt.js +17 -0
- package/dist/extraction/mapping-provider.d.ts +15 -0
- package/dist/extraction/mapping-provider.js +60 -0
- package/dist/extraction/mapping-request.d.ts +3 -0
- package/dist/extraction/mapping-request.js +32 -0
- package/dist/extraction/ontology.js +2 -2
- package/dist/extraction/routing.js +5 -20
- package/dist/extraction/scip-occurrences.d.ts +3 -0
- package/dist/extraction/scip-occurrences.js +102 -0
- package/dist/extraction/scip-ranges.d.ts +6 -0
- package/dist/extraction/scip-ranges.js +31 -0
- package/dist/extraction/scip-runtime.d.ts +39 -0
- package/dist/extraction/scip-runtime.js +8 -0
- package/dist/extraction/scip-symbols.d.ts +21 -0
- package/dist/extraction/scip-symbols.js +91 -0
- package/dist/extraction/semantic.d.ts +1 -1
- package/dist/extraction/semantic.js +5 -17
- package/dist/extraction/static-calls.d.ts +10 -0
- package/dist/extraction/static-calls.js +133 -0
- package/dist/extraction/static.d.ts +3 -20
- package/dist/extraction/static.js +33 -104
- package/dist/extraction/symbol-resolution.d.ts +12 -0
- package/dist/extraction/symbol-resolution.js +51 -0
- package/dist/extraction/symbol-selectors.d.ts +11 -0
- package/dist/extraction/symbol-selectors.js +51 -0
- package/dist/graph/binding-rdf.d.ts +7 -0
- package/dist/graph/binding-rdf.js +109 -0
- package/dist/graph/call-rdf.d.ts +4 -0
- package/dist/graph/call-rdf.js +94 -0
- package/dist/graph/call-shapes.d.ts +2 -0
- package/dist/graph/call-shapes.js +28 -0
- package/dist/graph/code-coverage-projection.d.ts +9 -0
- package/dist/graph/code-coverage-projection.js +117 -0
- package/dist/graph/code-coverage-renderer.d.ts +2 -0
- package/dist/graph/code-coverage-renderer.js +15 -0
- package/dist/graph/code-coverage-request.d.ts +6 -0
- package/dist/graph/code-coverage-request.js +19 -0
- package/dist/graph/code-coverage.d.ts +6 -0
- package/dist/graph/code-coverage.js +54 -0
- package/dist/graph/code-description.d.ts +4 -0
- package/dist/graph/code-description.js +24 -0
- package/dist/graph/code-rdf.d.ts +5 -0
- package/dist/graph/code-rdf.js +72 -0
- package/dist/graph/compatibility-context.d.ts +2 -0
- package/dist/graph/compatibility-context.js +18 -0
- package/dist/graph/compatibility-renderer.d.ts +2 -0
- package/dist/graph/compatibility-renderer.js +45 -0
- package/dist/graph/compatibility-request.d.ts +3 -0
- package/dist/graph/compatibility-request.js +18 -0
- package/dist/graph/compatibility.d.ts +7 -0
- package/dist/graph/compatibility.js +67 -0
- package/dist/graph/constraint-comparison.d.ts +7 -0
- package/dist/graph/constraint-comparison.js +49 -0
- package/dist/graph/coverage.d.ts +2 -2
- package/dist/graph/coverage.js +8 -3
- package/dist/graph/diagnostics.d.ts +1 -1
- package/dist/graph/diagnostics.js +10 -6
- package/dist/graph/evidence-description.d.ts +3 -0
- package/dist/graph/evidence-description.js +13 -0
- package/dist/graph/identity-preflight.js +1 -1
- package/dist/graph/neighborhood-renderer.d.ts +2 -0
- package/dist/graph/neighborhood-renderer.js +38 -0
- package/dist/graph/neighborhood-request.d.ts +9 -0
- package/dist/graph/neighborhood-request.js +37 -0
- package/dist/graph/neighborhood.d.ts +8 -0
- package/dist/graph/neighborhood.js +100 -0
- package/dist/graph/obligation-rdf.d.ts +5 -0
- package/dist/graph/obligation-rdf.js +67 -0
- package/dist/graph/obligation-shapes.d.ts +2 -0
- package/dist/graph/obligation-shapes.js +32 -0
- package/dist/graph/path-request.d.ts +11 -0
- package/dist/graph/path-request.js +24 -0
- package/dist/graph/path-search.d.ts +45 -0
- package/dist/graph/path-search.js +101 -0
- package/dist/graph/paths-renderer.d.ts +2 -0
- package/dist/graph/paths-renderer.js +36 -0
- package/dist/graph/paths.d.ts +7 -0
- package/dist/graph/paths.js +74 -0
- package/dist/graph/query.js +23 -6
- package/dist/graph/rdf.js +26 -0
- package/dist/graph/shacl-shapes.js +70 -0
- package/dist/graph/snapshot-context.d.ts +3 -0
- package/dist/graph/snapshot-context.js +8 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +22 -0
- package/dist/infrastructure/artifact-paths.d.ts +4 -0
- package/dist/infrastructure/artifact-paths.js +14 -0
- package/dist/infrastructure/json-digest.d.ts +2 -0
- package/dist/infrastructure/json-digest.js +3 -0
- package/dist/infrastructure/unique-json.d.ts +2 -0
- package/dist/infrastructure/unique-json.js +20 -0
- package/dist/interfaces/cli.js +33 -1
- package/dist/interfaces/code-coverage.d.ts +46 -0
- package/dist/interfaces/code-coverage.js +18 -0
- package/dist/interfaces/graph-compatibility.d.ts +35 -0
- package/dist/interfaces/graph-compatibility.js +21 -0
- package/dist/interfaces/graph-exploration.d.ts +59 -0
- package/dist/interfaces/graph-exploration.js +27 -0
- package/dist/interfaces/graph-paths.d.ts +77 -0
- package/dist/interfaces/graph-paths.js +31 -0
- package/dist/interfaces/graph-query-args.d.ts +2 -0
- package/dist/interfaces/graph-query-args.js +25 -0
- package/dist/interfaces/mapping-proposals.d.ts +204 -0
- package/dist/interfaces/mapping-proposals.js +74 -0
- package/dist/interfaces/mcp.js +31 -3
- package/dist/storage/mapping-proposals.d.ts +9 -0
- package/dist/storage/mapping-proposals.js +42 -0
- package/dist/storage/storage.js +41 -13
- package/dist/visualization/evidence-sources.d.ts +6 -0
- package/dist/visualization/evidence-sources.js +19 -0
- package/dist/visualization/viewer-interaction.d.ts +5 -8
- package/dist/visualization/viewer-interaction.js +46 -44
- package/dist/visualization/visualization.js +14 -5
- package/docs/1.0-WORK-QUEUE.md +38 -0
- package/docs/ADR-028-bounded-artifact-paths.md +58 -0
- package/docs/ADR-029-exact-graph-neighborhoods.md +70 -0
- package/docs/ADR-030-bounded-evidence-paths.md +97 -0
- package/docs/ADR-031-code-extractor-selection.md +91 -0
- package/docs/ADR-032-scip-code-evidence.md +73 -0
- package/docs/ADR-033-document-symbol-bindings.md +83 -0
- package/docs/ADR-034-mapping-gaps.md +80 -0
- package/docs/ADR-035-static-call-evidence.md +78 -0
- package/docs/ADR-036-contract-obligation-declarations.md +124 -0
- package/docs/ADR-037-selected-contract-compatibility.md +93 -0
- package/docs/ADR-038-monorepo-code-coverage.md +105 -0
- package/docs/ADR-039-mapping-proposals.md +119 -0
- package/docs/CONSUMER-TRIAL.md +6 -4
- package/docs/GRAPHIFY-EVALUATION.md +87 -0
- package/docs/PRE-1.0-BASELINE.md +141 -0
- package/docs/RELEASE-1.0-PLAN.md +37 -15
- package/docs/RELEASING.md +3 -3
- package/docs/ROADMAP.md +39 -11
- package/docs/VALIDATION.md +501 -0
- package/docs/assessments/pre-1.0-2026-10-28.json +200 -0
- package/docs/extraction-manifest.json +258 -23
- package/package.json +8 -4
- package/templates/context-graph-development/SKILL.md +30 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# ADR 033: Resolve explicit document declarations to indexed code symbols
|
|
2
|
+
|
|
3
|
+
Status: accepted for B3a's second increment; npm candidate pending. This builds on ADR 032,
|
|
4
|
+
without a new indexer, model inference, prompt change or semantic cache invalidation.
|
|
5
|
+
|
|
6
|
+
## Explicit selection and mapping
|
|
7
|
+
|
|
8
|
+
An ordinary CommonMark link opts in with `#weftlet-symbol=<exact-name>`. The destination names
|
|
9
|
+
one regular committed repository file. Match an exact name, public symbol ID or qualified name
|
|
10
|
+
built solely from indexed lexical parents. There is no basename search, fuzzy match or inferred
|
|
11
|
+
call. Duplicate identities are a gap, not a first-match selection. Missing native enclosure can
|
|
12
|
+
prevent qualification; an exact indexed occurrence remains available.
|
|
13
|
+
|
|
14
|
+
Optional `weftlet-line` and `weftlet-column` select a particular definition/reference, using
|
|
15
|
+
one-based UTF-16 start positions. Both are required. The source token must equal the selector
|
|
16
|
+
(or the exact symbol ID must match). This resolves aliases and re-exports through native evidence,
|
|
17
|
+
then cites every indexed definition for that identity, including overloads. Without any indexed
|
|
18
|
+
definition, the target is unresolved. `.d.ts` targets remain explicitly declaration-only.
|
|
19
|
+
|
|
20
|
+
A link without a mapping title creates Document→references→CodeSymbol. A title of
|
|
21
|
+
`weftlet:implementedBy <business-id>` or `weftlet:verifiedBy <business-id>` instead declares that
|
|
22
|
+
relationship from an existing Capability, Workflow, Contract or Invariant. The ID must already
|
|
23
|
+
be present in non-binding facts in this assembly. Nearby prose and link labels do not declare
|
|
24
|
+
mappings implicitly. Reference-style Markdown retains both use and destination citations;
|
|
25
|
+
conflicting destinations or mapping titles produce diagnostics. Images, code blocks, ordinary
|
|
26
|
+
heading fragments and traversal's existing treatment of titles retain their behavior.
|
|
27
|
+
|
|
28
|
+
## Authority and evidence
|
|
29
|
+
|
|
30
|
+
The dependency-free public `DocumentCodeBinding` metadata retains the explicit selector, document
|
|
31
|
+
citations, selected occurrence proofs, all target definition proofs and original business-subject
|
|
32
|
+
proofs. Each proof names an actual fact and exact provenance. Source digest/SHA checks require
|
|
33
|
+
committed regular files and the same indexed revision; stale/missing definitions never resolve.
|
|
34
|
+
|
|
35
|
+
Bindings have `inferred` authority: a declaration of mapping is not proof of fulfillment. Source
|
|
36
|
+
approval/classification is retained independently. A binding involving unreviewed subject evidence
|
|
37
|
+
remains unreviewed; otherwise resolution is deterministic, never an approval workflow. Validation
|
|
38
|
+
sources can declare `verifiedBy` or reference code, but cannot declare `implementedBy`. No test
|
|
39
|
+
execution is inferred. Contradictory declarations remain evidence; this increment does not resolve
|
|
40
|
+
product-policy conflicts or assess semantic truth. Inferred mapping proposals are B3b.
|
|
41
|
+
|
|
42
|
+
RDF has queryable binding selectors and citation/proof relationships plus lossless JSON records.
|
|
43
|
+
SHACL checks metadata cardinalities/types, supported relationships, target kinds and authority.
|
|
44
|
+
Deterministic consistency checks compare proof IDs/provenance/review to actual same-snapshot
|
|
45
|
+
assertions, selector positions and revision consistency. No kind constraint is weakened.
|
|
46
|
+
Neighborhoods, paths, impact scans, Markdown and the viewer consume the same facts; the viewer
|
|
47
|
+
exposes navigation to document, selected occurrence, target definition and subject-proof sources.
|
|
48
|
+
|
|
49
|
+
## Scope, bounds and lifecycle
|
|
50
|
+
|
|
51
|
+
Only sources already selected for hydration are examined. Read traversal-selected validation
|
|
52
|
+
sources are also checked for explicit links without including them in semantic extraction. Source
|
|
53
|
+
selection/SCIP scope omissions still matter; a missing binding is not evidence of no impact.
|
|
54
|
+
Ordinary file links coexist with symbol bindings. Missing/ambiguous selectors report cited
|
|
55
|
+
`implementationGaps`. Diagnostics include at most 100 candidate IDs and the total count. An
|
|
56
|
+
annotated subject with more than 100 supporting facts, or a binding requiring more than 1,000
|
|
57
|
+
selected/definition proofs, reports an explicit gap instead of publishing a partial binding.
|
|
58
|
+
These are conservative first-release bounds, not a silent best-effort coverage claim.
|
|
59
|
+
|
|
60
|
+
Assembly advances from 8 to 9 and records `document-code-binding-extractor@1.0.0`. Existing
|
|
61
|
+
snapshots remain readable, but current validation requires refresh. Semantic provider, prompt
|
|
62
|
+
and artifact keys are unchanged; unchanged extraction is reused. Clean comparison reproduces
|
|
63
|
+
bindings. Refresh remains a full assembly/indexing operation, not incremental SHACL.
|
|
64
|
+
|
|
65
|
+
Draft overlays regenerate all bindings against reindexed captured bytes and only retained semantic
|
|
66
|
+
subjects. Changed/deleted/renamed source documents and targets invalidate old mappings. Draft
|
|
67
|
+
fact IDs and proof references are rewritten together, retain the base SHA plus draft digests, and
|
|
68
|
+
never expose temporary checkout SHAs. A changed rule needs semantic re-extraction before an
|
|
69
|
+
annotated binding to it can return. Old committed evidence stays queryable and cannot become
|
|
70
|
+
current validation merely because it is still useful.
|
|
71
|
+
|
|
72
|
+
## Validation and boundaries
|
|
73
|
+
|
|
74
|
+
Public acceptance runs real TypeScript SCIP, offline deterministic prose extraction, hydration,
|
|
75
|
+
RDF/SHACL, SPARQL, agent query facades, repeat/clean reuse and draft edits/renames/deletes. Negative
|
|
76
|
+
cases include stale source/target digests, ambiguous names, conflicting titles, missing definitions
|
|
77
|
+
and subject IDs, malformed positions and authority/provenance tampering. Fresh packed-consumer
|
|
78
|
+
smoke uses the public API and actual installed code evidence. See VALIDATION.md for executed gates.
|
|
79
|
+
|
|
80
|
+
This completes explicit B3a resolution. It does not provide inferred mappings, actual call edges,
|
|
81
|
+
producer/consumer obligation compatibility or monorepo completeness; those retain separate queue
|
|
82
|
+
items and acceptance criteria. The frozen B2 study is unchanged. No private source or paid model
|
|
83
|
+
run is required by this increment.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# ADR 034: Remaining business-to-symbol mapping gaps
|
|
2
|
+
|
|
3
|
+
Status: B3b deterministic assessment complete, 2026-10-29. A bounded inference proposal is
|
|
4
|
+
justified for review; no model quality result or inference implementation is claimed.
|
|
5
|
+
|
|
6
|
+
## Evidence
|
|
7
|
+
|
|
8
|
+
The [public study](../evaluations/mapping-gaps/README.md) froze ten cases and source hashes in
|
|
9
|
+
`01f7cb6` before measurement. [The recorded run](../evaluations/mapping-gaps/results/2026-10-29.json)
|
|
10
|
+
used clean evaluator commit `e3a3d375733121c1c9a3006ce17a5b765dbafc8d`, real SCIP and ordinary
|
|
11
|
+
hydration/publication through strict RDF/SHACL. Its offline prose grammar recognizes only the
|
|
12
|
+
inventoried rule/workflow and file-claim sentences; it does not evaluate language-model quality.
|
|
13
|
+
|
|
14
|
+
All ten observed classifications match the predeclared states. The graph has 111 facts.
|
|
15
|
+
Cold hydration extracted eight documents in 849 ms; the repeat extracted zero, reused eight
|
|
16
|
+
and retained snapshot identity/content digest in 841 ms. These tiny-fixture timings are not a
|
|
17
|
+
monorepo performance claim. Exact neighborhoods returned every direct binding within budget,
|
|
18
|
+
with no forbidden misleading-name mappings. Structural paths were intentionally bounded;
|
|
19
|
+
seven searches report truncation, one exhausts with an absent rule and two are skipped for
|
|
20
|
+
ambiguous or unindexed targets. No completeness claim is made for truncated paths.
|
|
21
|
+
|
|
22
|
+
| Observed case | Count | Meaning / appropriate response |
|
|
23
|
+
| --- | ---: | --- |
|
|
24
|
+
| Explicit implementation binding | 1 | Rule points to the declared indexed function, with both source proofs. Still a declaration, not proof of compliance. |
|
|
25
|
+
| Explicit test binding | 1 | Rule points to a test function. No test execution is claimed. |
|
|
26
|
+
| Declaration-only binding | 1 | Declaration resolves; the implementation body is absent. Index the implementation before claiming coverage. |
|
|
27
|
+
| File-only claims | 2 | A file association survives. Neither a misleading matching name nor ordinary prose supplies an exact selector. |
|
|
28
|
+
| Document-symbol reference only | 1 | Two rules share a document; proximity does not assign either rule to either function. |
|
|
29
|
+
| Unresolved selectors | 3 | Ambiguous name, excluded source and stale selector remain cited gaps. Qualify, index or repair the source respectively. |
|
|
30
|
+
| Missing intent | 1 | Code exists without an owner rule. Owner intent must be supplied; the evaluator cannot approve inferred business policy. |
|
|
31
|
+
|
|
32
|
+
The file-only and co-located cases can have structural paths to the desired symbol. Those
|
|
33
|
+
paths are not equivalent to an `implementedBy` assertion. This distinction prevents graph
|
|
34
|
+
reachability or returned implementation counts from overstating semantic mapping coverage.
|
|
35
|
+
All explicit bindings remain inferred/unreviewed assertions with declared source authority and
|
|
36
|
+
retained subject evidence. Neither source approval nor syntax upgrades their review state.
|
|
37
|
+
|
|
38
|
+
## Decision and next boundary
|
|
39
|
+
|
|
40
|
+
Keep explicit bindings as the deterministic path. Do not automatically add mapping edges based
|
|
41
|
+
on name similarity, document co-location or shortest paths. Three cases justify evaluating an
|
|
42
|
+
optional proposal pass: the two file claims and the shared-document reference. Repair missing
|
|
43
|
+
evidence/configuration before invoking a model for the other gaps.
|
|
44
|
+
|
|
45
|
+
A separate, opt-in proposal experiment should:
|
|
46
|
+
|
|
47
|
+
- Limit candidates to existing cited business IDs and current indexed code definitions in an
|
|
48
|
+
explicit repository/domain scope. Preserve document and code revisions, spans and digests.
|
|
49
|
+
- Run coverage checks first; distinguish ambiguous, stale, excluded, external/declaration-only
|
|
50
|
+
and missing-intent cases. Permit abstention; never synthesize approved intent.
|
|
51
|
+
- Emit a separate inferred, unreviewed mapping proposal with rationale and supporting evidence.
|
|
52
|
+
A proposal is neither an approved mapping nor proof that code satisfies the rule.
|
|
53
|
+
- Use a distinct extraction/cache identity, bounded candidates/output/cost, cancellation and
|
|
54
|
+
privacy-safe progress. Retain unchanged artifacts without allowing stale code evidence.
|
|
55
|
+
- Predeclare positive and misleading-name/cross-domain negatives before a live evaluation.
|
|
56
|
+
Report precision, misses, abstentions, citation validity, retrieval usefulness and cost
|
|
57
|
+
separately. Compare against explicit bindings and file-level context; require evidence that
|
|
58
|
+
the additional pass improves agent decisions.
|
|
59
|
+
|
|
60
|
+
This is a proposal specification, not authorization for paid runs or automatic promotion. The
|
|
61
|
+
B3b inference implementation/evaluation or a scoped deferral remains a maintainer decision
|
|
62
|
+
before 1.0 qualification. Continue the already requested B3c static-call work independently.
|
|
63
|
+
Bulk intent generation, document backfill, approval UI and hosted AI remain in the 2.0 plan.
|
|
64
|
+
|
|
65
|
+
## CI reliability follow-up
|
|
66
|
+
|
|
67
|
+
PR #58's successful retry and main checks resolved its immediate failed run. Older Windows
|
|
68
|
+
runs also hit the 30-second frozen-study test limit and worker-update timeout. The verifier now
|
|
69
|
+
reads selected immutable Git blobs in one length-framed batch instead of launching Git once
|
|
70
|
+
per file. Test fixture inputs are cached only where immutable; each disposable repository's
|
|
71
|
+
dirty-content/CRLF checks still read fresh bytes. Yielding between synchronous cases lets worker
|
|
72
|
+
updates flush. Binary/CRLF/empty blobs and malformed frames are covered. The original timeout,
|
|
73
|
+
negative assertions, frozen B2 labels and Git-content safety checks are retained.
|
|
74
|
+
|
|
75
|
+
## November 2 implementation decision
|
|
76
|
+
|
|
77
|
+
The maintainer approved the bounded opt-in proposal recommendation. [ADR 039](ADR-039-mapping-proposals.md)
|
|
78
|
+
records its separate operation, authority, exact code/source eligibility, provider and immutable
|
|
79
|
+
cache contract. This supersedes the earlier pending implementation/deferral decision. It does not
|
|
80
|
+
supply a live model-quality result or close B6 acceptance.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# ADR 035: Static call evidence from TypeScript syntax and SCIP
|
|
2
|
+
|
|
3
|
+
Status: implemented for the next candidate, 2026-10-29. Live consumer acceptance remains B6.
|
|
4
|
+
|
|
5
|
+
## Decision
|
|
6
|
+
|
|
7
|
+
Use the TypeScript parser to recognize `CallExpression`/`NewExpression` sites in the exact
|
|
8
|
+
committed documents already read by the SCIP extractor. Join callee tokens to exact SCIP
|
|
9
|
+
occurrence positions, and callable names to indexed definitions. Keep native identities.
|
|
10
|
+
This adds no second indexer or type-resolution program and rereads no source files. The parser
|
|
11
|
+
is an explicit pinned runtime dependency (`typescript@5.5.4`), included in license notices and
|
|
12
|
+
the packed-consumer test. Existing SCIP indexing continues to supply resolution.
|
|
13
|
+
|
|
14
|
+
Each `calls` assertion retains caller, selected target, full invocation span, optional/member/
|
|
15
|
+
construction syntax and proofs of caller definitions, target occurrences and all indexed target
|
|
16
|
+
definitions. Caller proof selection uses the actual AST callable, including assigned arrows;
|
|
17
|
+
native lexical enclosure alone does not identify a caller. Repeated callsites remain separate.
|
|
18
|
+
Top-level calls use the canonical physical-file node. Imports/re-exports follow SCIP identities.
|
|
19
|
+
CodeSymbol IDs and ordinary `references`/`definedBy` evidence remain available independently.
|
|
20
|
+
|
|
21
|
+
`codeCall.target` distinguishes an indexed body, indexed class construction, bodyless declaration
|
|
22
|
+
and external symbol. A member call selects the declaration referenced by the index; it does not
|
|
23
|
+
prove runtime receiver type or rule out overrides, monkey-patching, proxies or reassignment.
|
|
24
|
+
Even lexical calls are static evidence, not guaranteed execution. Authority is implemented
|
|
25
|
+
(draft in overlays), extraction review is deterministic and runtime is explicitly not observed.
|
|
26
|
+
|
|
27
|
+
Callbacks passed as values, type uses and ordinary references do not become calls to those
|
|
28
|
+
values. Invocation through a parameter, computed dispatch, value alias or unsupported expression
|
|
29
|
+
produces a cited gap rather than an invented concrete target. Anonymous callbacks/initializers
|
|
30
|
+
without an exact indexed callable identity do not inherit the enclosing method as their caller.
|
|
31
|
+
Decorators/computed names remain in their enclosing evaluation context; instance field and static
|
|
32
|
+
block initializers currently report gaps. Defaults are attributed to their callable. Ambient files/namespaces provide declarations only; their decorator/default syntax produces no
|
|
33
|
+
runtime call assertions. Syntax errors cause explicit file-level abstention. Implicit JSX factory, getter, operator and framework
|
|
34
|
+
invocations are not synthesized. This is neither complete data flow nor whole-program analysis.
|
|
35
|
+
|
|
36
|
+
## Shared evidence and compatibility
|
|
37
|
+
|
|
38
|
+
The same assertions and proofs are projected into RDF, SPARQL, `graph.neighbors`, `graph.paths`,
|
|
39
|
+
impact packs and viewer source links. A `calls` predicate requires typed metadata; SHACL rejects
|
|
40
|
+
missing fields, invalid kinds/ranges and authority promotion. Consistency checks compare proof
|
|
41
|
+
IDs, endpoints, revisions and source spans against actual same-snapshot code facts. Validation
|
|
42
|
+
targets call records directly rather than scanning every ordinary fact through a new disjunction.
|
|
43
|
+
The validator remains JavaScript and still validates the complete published graph.
|
|
44
|
+
|
|
45
|
+
`FactExtractor.extractWithDiagnostics(context)` is an additive optional core contract returning
|
|
46
|
+
facts and gaps together without mutable last-result state. Hydration and overlays prefer it;
|
|
47
|
+
existing adapters implementing only `extract` remain supported. The built-in SCIP extractor's
|
|
48
|
+
legacy `extract` returns facts; callers needing its gap report should use the complete method.
|
|
49
|
+
|
|
50
|
+
SCIP projection is version 2.1.0, call extraction 1.0.0 and graph assembly 10. These identities
|
|
51
|
+
require refreshed code evidence for current validation while historical snapshots stay queryable.
|
|
52
|
+
The semantic schema still has its original predicate list: model output cannot invent `calls`.
|
|
53
|
+
Prompt/provider/artifact identity is unchanged. No semantic-cache rewrite or forced paid run is
|
|
54
|
+
required. Draft proof IDs and revisions are remapped after code extraction; renamed/deleted
|
|
55
|
+
relationships are replaced while committed snapshots retain their original bytes.
|
|
56
|
+
|
|
57
|
+
## Acceptance and limits
|
|
58
|
+
|
|
59
|
+
The public fixture/expectations were introduced in `0afbd19` and its data representation bounded
|
|
60
|
+
in `d69d65c`, before extraction. Later supplements cover import aliases and evaluation scopes.
|
|
61
|
+
The roughly 3,000-line file contains a real public string catalog between meaningful helper
|
|
62
|
+
chains and distant definitions. It tests location/isolation, not 3,000 lines of algorithmic
|
|
63
|
+
complexity or representative monorepo performance. Budgets: 800 total facts, 90-second hydration,
|
|
64
|
+
four two-fact neighborhood pages and 80,000 response bytes; helper-to-rule paths have explicit
|
|
65
|
+
depth six, three-path and 500-step limits. Truncation is retained, never treated as completeness.
|
|
66
|
+
|
|
67
|
+
Real indexing/hydration tests cover repeated sites, recursion, private/local functions, shadowed
|
|
68
|
+
names, overloads, re-export/import aliases, TSX, BOM/Unicode columns, cross-file callers, values
|
|
69
|
+
and callbacks, declarations without bodies, decorators/defaults/initializers and unresolved
|
|
70
|
+
dispatch. Actual query follow-ups reach a cited rule with its unreviewed mapping authority intact.
|
|
71
|
+
RDF projection and named/union SHACL agree, negative provenance/approval cases fail, and repeat,
|
|
72
|
+
dirty querying, line shifts, rename/delete and draft proof regeneration are exercised.
|
|
73
|
+
|
|
74
|
+
Run `pnpm evaluate:calls` in a development checkout for the public observation report. It uses
|
|
75
|
+
the fixed offline grammar provider, never private inputs or a model. Reports retain original
|
|
76
|
+
assertions, requests/responses, budgets, source hashes, configuration and runtime identity. Tests
|
|
77
|
+
provide the full acceptance assertions; this observation command is not a model-quality grader.
|
|
78
|
+
Browser interaction and live TradePilot usefulness remain separate evidence.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# ADR 036: Cited producer and consumer obligations
|
|
2
|
+
|
|
3
|
+
Status: B4a implemented; validation recorded separately. B4b follows in [ADR 037](ADR-037-selected-contract-compatibility.md).
|
|
4
|
+
|
|
5
|
+
## Scope and choice
|
|
6
|
+
|
|
7
|
+
Free-text `governedBy` assertions and explicit routing declarations already preserve business
|
|
8
|
+
rules and asynchronous handoffs. They do not provide structured fields for comparing the two
|
|
9
|
+
sides. B4a adds an optional deterministic declaration in selected Markdown, using existing
|
|
10
|
+
`emits` and `consumes` relations to a shared Contract node. This is an exact opt-in path;
|
|
11
|
+
ordinary prose remains available through existing semantic extraction. No new model prompt,
|
|
12
|
+
provider schema or semantic artifact identity is introduced. Automatic conversion of prose
|
|
13
|
+
into these declarations is not implemented or claimed.
|
|
14
|
+
|
|
15
|
+
Use one JSON object in a `weftlet-obligation` fenced block:
|
|
16
|
+
|
|
17
|
+
```weftlet-obligation
|
|
18
|
+
{
|
|
19
|
+
"schemaVersion": 1,
|
|
20
|
+
"id": "execution-age",
|
|
21
|
+
"role": "requirement",
|
|
22
|
+
"endpoint": "services/execution/src/execute.ts",
|
|
23
|
+
"contract": {
|
|
24
|
+
"scope": "readings",
|
|
25
|
+
"id": "stored-reading",
|
|
26
|
+
"kind": "stored-data",
|
|
27
|
+
"version": "1"
|
|
28
|
+
},
|
|
29
|
+
"statement": "Execution revalidates reading age immediately before use.",
|
|
30
|
+
"domain": "sensors",
|
|
31
|
+
"stage": "execution",
|
|
32
|
+
"constraint": {
|
|
33
|
+
"metric": "reading-age",
|
|
34
|
+
"operator": "at-most",
|
|
35
|
+
"value": 60,
|
|
36
|
+
"unit": "seconds"
|
|
37
|
+
},
|
|
38
|
+
"revalidation": "required"
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Required fields are schemaVersion, id, role, endpoint, contract and statement. Role is
|
|
43
|
+
`guarantee` (producer) or `requirement` (consumer); transport kind is `queue` or `stored-data`.
|
|
44
|
+
Domain, stage, contract version, constraint and consumer revalidation are optional. A constraint
|
|
45
|
+
requires a metric, finite numeric value and operator (`at-most`, `at-least`, `equal`); its unit
|
|
46
|
+
may be unknown. Revalidation accepts `required` or `not-required` on consumers only. Omitted
|
|
47
|
+
values stay absent in JSON/RDF and display as unknown. No default time unit, normalization,
|
|
48
|
+
semantic equivalence, unit conversion or compatibility interpretation is performed.
|
|
49
|
+
|
|
50
|
+
The endpoint is an exact repository-relative regular committed UTF-8 file. Its canonical physical
|
|
51
|
+
kind is retained, including Evidence for test/spec files. Existing indexed facts let agents
|
|
52
|
+
continue into code, but the declaration establishes neither a particular function mapping nor
|
|
53
|
+
implementation correctness. Function-level mappings remain the explicit selectors in ADR 033.
|
|
54
|
+
|
|
55
|
+
## Identity and authority
|
|
56
|
+
|
|
57
|
+
Contract identity hashes repository ID, exact scope, contract ID, transport kind and version.
|
|
58
|
+
Labels, endpoint paths and statement wording do not determine this identity. Missing version is
|
|
59
|
+
unknown and does not join a named version. The namespace is explicit; equal names across scopes,
|
|
60
|
+
repositories, transports or versions never imply a shared contract. Domain is a cited descriptive
|
|
61
|
+
field, not an implicit identity override: contradictory descriptions are retained for review.
|
|
62
|
+
|
|
63
|
+
`GraphFact.contractObligation` retains the complete typed declaration and endpoint source
|
|
64
|
+
path/digest/SHA. Main provenance cites the exact Markdown fence in the original committed bytes.
|
|
65
|
+
The assertion has inferred authority and deterministic extraction review. Configured source
|
|
66
|
+
approval, role and traversal ownership metadata remain independent. Deterministic parsing is not
|
|
67
|
+
an approval process. Plans and unclassified documents cannot silently become approved intent.
|
|
68
|
+
Validation documents are excluded from obligation assertions with a cited diagnostic, including
|
|
69
|
+
directly selected evidence-root documents without traversal.
|
|
70
|
+
|
|
71
|
+
Both sides connect through the contract, independently of imports, calls or a particular queue
|
|
72
|
+
library. This is documented dependency evidence, not observed message delivery, shared storage
|
|
73
|
+
access or proof of fulfillment. Existing runtime evidence remains separately authoritative for
|
|
74
|
+
what was observed. Different limits at different stages are not automatically contradictions.
|
|
75
|
+
|
|
76
|
+
## Integrity, bounds and lifecycle
|
|
77
|
+
|
|
78
|
+
Unknown fields, duplicate JSON keys, invalid paths, nonfinite values and unsupported enums
|
|
79
|
+
produce cited extraction gaps with no partial declaration. Missing, symlink or submodule
|
|
80
|
+
endpoints cannot create joins. Duplicate declaration IDs within a source retain every valid
|
|
81
|
+
assertion and report ambiguity; no assertion silently wins. Document and endpoint text must
|
|
82
|
+
reproduce the committed Git blob ID, rejecting lossy non-UTF-8 decoding before citing its digest.
|
|
83
|
+
Contracts with only one role in
|
|
84
|
+
the selected structured declarations report the missing counterpart without claiming repository-
|
|
85
|
+
wide absence. No text matching or implied route fills those gaps.
|
|
86
|
+
|
|
87
|
+
Extraction uses already selected committed sources, including traversal-read validation docs
|
|
88
|
+
solely to report exclusions. It performs no provider call. Each block is limited to 64 KiB;
|
|
89
|
+
overlong blocks report a gap. More than 500 blocks abort extraction before provider/indexer work
|
|
90
|
+
instead of publishing a silently truncated set. Existing document-selection budgets still apply.
|
|
91
|
+
|
|
92
|
+
RDF exposes each field on its cited assertion record. SHACL checks obligation-specific cardinality,
|
|
93
|
+
types, roles, metadata and authority without adding a broad per-fact disjunction. Deterministic
|
|
94
|
+
integrity checks require canonical contract/endpoint identities, role/predicate agreement, matching
|
|
95
|
+
endpoint/document revision and separate implementation evidence. Shared SPARQL, neighborhoods,
|
|
96
|
+
paths, impact queries, Markdown and viewer details read these same facts. SHACL checks structure;
|
|
97
|
+
it does not establish business compatibility.
|
|
98
|
+
|
|
99
|
+
Assembly advances from 10 to 11 and records `document-obligation-extractor@1.0.0`. Historical
|
|
100
|
+
snapshots remain readable but are not compatible with current validation until refreshed.
|
|
101
|
+
Unchanged semantic artifacts remain reusable. Clean hydration reproduces declarations. Full
|
|
102
|
+
RDF/SHACL validation is retained; this is not incremental validation or a new graph backend.
|
|
103
|
+
|
|
104
|
+
Overlays re-read declarations from captured draft bytes and replace prior obligation facts.
|
|
105
|
+
Document/endpoint edits, deletes and renames regenerate or invalidate joins. All draft assertions
|
|
106
|
+
and endpoint citations use the base SHA plus draft content digests, not disposable checkout SHAs.
|
|
107
|
+
Known endpoint paths are included in capture; newly declared endpoints outside captured scope
|
|
108
|
+
require configured scope before rebuilding. Saved committed evidence remains unchanged.
|
|
109
|
+
|
|
110
|
+
## Acceptance and remaining work
|
|
111
|
+
|
|
112
|
+
The independent public fixture covers stored-data and queue producers/consumers with actual
|
|
113
|
+
TypeScript indexing, both freshness limits, missing fields, missing endpoints, unrelated same-name
|
|
114
|
+
domains, unknown versions and test-file classification. It exercises bounded agent queries,
|
|
115
|
+
SPARQL/projection parity, strict named/union SHACL, corruption negatives, unchanged semantic reuse,
|
|
116
|
+
clean comparison, dirty queries and renamed/deleted draft declarations. An empty offline provider
|
|
117
|
+
is deliberate: these structured assertions must come from the real declaration extractor.
|
|
118
|
+
Fresh packed-consumer smoke uses the exported API and installed runtime assets.
|
|
119
|
+
|
|
120
|
+
B4b's bounded compatibility acceptance is implemented in [ADR 037](ADR-037-selected-contract-compatibility.md),
|
|
121
|
+
including consumer revalidation, an explicit documented incompatibility and missing evidence. Any hard failure must come from an
|
|
122
|
+
explicit approved deterministic policy; model findings remain tentative. No such policy or gate
|
|
123
|
+
is introduced here. Live model quality, private consumer usefulness and browser interaction remain
|
|
124
|
+
separate evidence. Release PR stays open until candidate qualification.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# ADR 037: Advisory comparison of selected contract constraints
|
|
2
|
+
|
|
3
|
+
Status: implemented for the next candidate, 2026-10-30. Qualification and live usefulness remain B6.
|
|
4
|
+
|
|
5
|
+
## Problem and decision
|
|
6
|
+
|
|
7
|
+
[Explicit obligations](ADR-036-contract-obligation-declarations.md) retain both sides of a queue
|
|
8
|
+
or stored-data boundary. A graph connection alone cannot establish that their rules agree.
|
|
9
|
+
Add `graph.compatibility`, a read-only comparison of two exact saved assertion IDs, shared by
|
|
10
|
+
the public API, CLI and MCP. Discover the IDs through `impact.scan` or `graph.neighbors`.
|
|
11
|
+
This is a bounded numeric assessment of declarations, separate from code fulfillment, source
|
|
12
|
+
approval, runtime delivery and deterministic architecture policy. It never returns a CI pass/fail.
|
|
13
|
+
|
|
14
|
+
```sh
|
|
15
|
+
weftlet graph compatibility --snapshot <id> --producer-fact <fact-id> --consumer-fact <fact-id> --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
MCP fields are `snapshotId`, `producerFactId`, `consumerFactId`. The public
|
|
19
|
+
`SnapshotContractCompatibilityService` accepts a snapshot reader and exposes `assess(request)`.
|
|
20
|
+
The application wrapper adds current checkout/configuration/overlay evidence state. The raw
|
|
21
|
+
service has no checkout knowledge; its `evidenceState` is absent. Neither reads a mutable head,
|
|
22
|
+
hydrates, invokes a model/indexer, changes a snapshot, or promotes historical evidence into a
|
|
23
|
+
current-diff result. Missing storage/invalid snapshot identity is an error; missing assertions
|
|
24
|
+
within a readable snapshot produce `unknown` with any surviving evidence retained.
|
|
25
|
+
|
|
26
|
+
## Numeric meaning
|
|
27
|
+
|
|
28
|
+
The two assertions must be a producer `guarantee` and consumer `requirement` on the same exact
|
|
29
|
+
repository/scoped/transport/versioned contract. Known matching domain, metric and unit are
|
|
30
|
+
required. Missing units or versions are unknown, including two absent versions. No conversion,
|
|
31
|
+
name-based equivalence, implicit ownership, elapsed-time model or data transformation is inferred.
|
|
32
|
+
Limits are JSON/JavaScript numbers, finite and no larger in magnitude than `MAX_SAFE_INTEGER`;
|
|
33
|
+
comparisons use their represented values, without claiming arbitrary decimal precision.
|
|
34
|
+
|
|
35
|
+
At a shared explicit measurement stage, `at-most`, `at-least` and `equal` define inclusive
|
|
36
|
+
half-lines or singleton sets. These are statements about allowed values, not observed values.
|
|
37
|
+
|
|
38
|
+
| Result | Meaning |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `compatible-constraints` | Producer's allowed set is a subset of the consumer's set at the same stage. |
|
|
41
|
+
| `insufficient-guarantee` | Sets overlap, but the producer permits some values the consumer rejects. This is not a contradiction. |
|
|
42
|
+
| `disjoint-constraints` | No untransformed value at that same stage satisfies both declarations. This is a documented range incompatibility, not proof of a product violation. |
|
|
43
|
+
| `revalidation-required` | Different stages or an overlapping insufficient guarantee, with explicit required consumer revalidation. Inspect the check and rejection behavior; its implementation is not inferred. |
|
|
44
|
+
| `unknown` | Missing assertions/context, unrelated contracts, unmatched domains/metrics/units, unsupported numbers, competing declarations or relevant extraction gaps prevent this assessment. |
|
|
45
|
+
|
|
46
|
+
For example, collection allows readings up to 600 seconds old; execution requires at most 60
|
|
47
|
+
seconds and explicitly revalidates. Different measurement stages prevent a direct contradiction
|
|
48
|
+
claim. The fixture executes a consumer freshness check separately and retrieves its indexed
|
|
49
|
+
implementation/test references; the assessment still says `fulfillment: not-evaluated`. It does
|
|
50
|
+
not prove eventual delivery, successful execution or availability when stale records are rejected.
|
|
51
|
+
A same-stage producer minimum of 120 seconds versus a consumer maximum of 60 is disjoint,
|
|
52
|
+
even if revalidation is required: no *same untransformed accepted value* satisfies both.
|
|
53
|
+
|
|
54
|
+
## Evidence and bounds
|
|
55
|
+
|
|
56
|
+
Responses retain at most the two selected facts unchanged, including source/endpoint citations,
|
|
57
|
+
commit, digests, statement, approval and review metadata. Assessment authority is inferred,
|
|
58
|
+
or draft when a selected fact is draft; `gateEligible` is always false. Shared returned-page
|
|
59
|
+
coverage describes only those assertions. The contract and endpoint IDs support further
|
|
60
|
+
neighborhood exploration to implementations, tests and other business declarations.
|
|
61
|
+
|
|
62
|
+
The service uses the lossless RDF fact projection shared by other queries. It scans saved facts
|
|
63
|
+
for competing declarations of the same endpoint/role/domain/stage/metric, conservatively choosing
|
|
64
|
+
no winner even if duplicate limits agree. At most 20 competing IDs are returned, with total and
|
|
65
|
+
omitted counts; exact contract neighborhoods provide cited continuation. There is no all-pairs
|
|
66
|
+
Cartesian scan. Projection/context work still scales with the saved graph; this is not an indexed
|
|
67
|
+
incremental graph database or a large private-workload performance claim.
|
|
68
|
+
|
|
69
|
+
Structural validation is restricted to the selected two records on reads, retaining strict
|
|
70
|
+
SHACL and obligation identity/provenance checks. Hydration still validates the complete graph
|
|
71
|
+
before publication. Relevant intent/ambiguity/implementation gaps block a numeric verdict;
|
|
72
|
+
runtime gaps remain visible because runtime fulfillment is never evaluated. This does not claim
|
|
73
|
+
all omitted documents are complete. Old snapshots, configuration changes and draft overlays stay
|
|
74
|
+
explicit and ineligible for current-diff validation.
|
|
75
|
+
|
|
76
|
+
This query-only increment leaves assembly 11, the obligation extractor identity, provider,
|
|
77
|
+
prompt and semantic cache unchanged. No graph migration or cache invalidation is needed.
|
|
78
|
+
|
|
79
|
+
## Acceptance and remaining scope
|
|
80
|
+
|
|
81
|
+
[The public protocol](../evaluations/contract-compatibility/README.md) declares source cases,
|
|
82
|
+
expected outcomes and query bounds before execution. Actual committed Markdown extraction,
|
|
83
|
+
real SCIP, RDF/SHACL, impact → neighborhood → pair comparison → symbol/test retrieval, strict
|
|
84
|
+
authority/provenance negatives, shared API/CLI/MCP, saved dirty queries, repeat cache reuse and
|
|
85
|
+
draft rename/delete invalidation are exercised. A finite-set oracle checks all 81 combinations
|
|
86
|
+
of the three operators and three boundary values. Fresh packed-consumer smoke checks the public
|
|
87
|
+
service, installed MCP discovery and honest unknown/missing-snapshot handling.
|
|
88
|
+
|
|
89
|
+
This covers explicit structured numeric obligations only. Free-form logical reconciliation,
|
|
90
|
+
automated inference/approval, multiple-property satisfiability, formal temporal compatibility,
|
|
91
|
+
product-wide guarantees and approval/backfill UI remain outside this increment. Hard gates
|
|
92
|
+
still require explicit approved deterministic policy; a model suggestion is not such a policy.
|
|
93
|
+
See [validation](VALIDATION.md) and the [remaining queue](1.0-WORK-QUEUE.md).
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# ADR 038: Saved source selection and monorepo coverage
|
|
2
|
+
|
|
3
|
+
Status: implemented for the next candidate, 2026-10-30. Live consumer acceptance remains B6.
|
|
4
|
+
|
|
5
|
+
## Problem and decision
|
|
6
|
+
|
|
7
|
+
Returned-page relationship counts cannot tell an agent whether a service was omitted from
|
|
8
|
+
indexing. Preserve those existing counts and add a separate saved-snapshot code coverage
|
|
9
|
+
overview, plus `graph.coverage` to page package boundaries and their files through the shared
|
|
10
|
+
API, CLI and MCP. Measure actual inputs and outputs; do not equate omitted evidence, absent
|
|
11
|
+
resolution or zero observed connections with zero business impact.
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
weftlet graph coverage --snapshot <id> --max-items 20 --json
|
|
15
|
+
weftlet graph coverage --snapshot <id> --project services/api --max-items 50 --json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
MCP takes `snapshotId`, optional exact `projectRoot`, `maxItems` (1–200, default 50) and
|
|
19
|
+
`continuation`. Omit the project to page boundaries; select a returned root to page its files.
|
|
20
|
+
The root fallback is `.`. Continuations bind the exact snapshot manifest, retained facts,
|
|
21
|
+
diagnostics, view and page size. Responses include offset, totals, remaining count and explicit
|
|
22
|
+
continuation. An absent requested project is distinct from an unknown legacy inventory.
|
|
23
|
+
`SnapshotCodeCoverageService` and `projectCodeCoverage` are public exports; the application
|
|
24
|
+
wrapper supplies current checkout/configuration/overlay evidence state. Reads never hydrate
|
|
25
|
+
or call providers/indexers, and never establish current-diff eligibility.
|
|
26
|
+
|
|
27
|
+
## What is measured
|
|
28
|
+
|
|
29
|
+
Assembly records `codeInventory`, version `committed-code-inventory-v1`, with its own content
|
|
30
|
+
digest and the normalized SCIP artifact digest. It enumerates regular committed `.ts`, `.tsx`,
|
|
31
|
+
`.mts` and `.cts` files (including declaration/test files), exact Git blob identities and nearest
|
|
32
|
+
regular `package.json` path boundaries. It reads tree metadata, not package contents, dependency
|
|
33
|
+
installations or active checkout files. The boundary is a physical grouping, not inferred PNPM
|
|
34
|
+
workspace membership, a compiler project, an architectural domain or approved ownership.
|
|
35
|
+
Non-TypeScript projects are outside the counted source universe; a boundary with no such files
|
|
36
|
+
is visible without claiming its implementation is covered. Nonregular entries are excluded.
|
|
37
|
+
|
|
38
|
+
For each file, three independent fields are retained:
|
|
39
|
+
|
|
40
|
+
- `codeRootSelected`: selected by the existing repository file extractor's Git path selection.
|
|
41
|
+
- `requested`: included/excluded entry selection for `scip.sourceProject.include`; `unknown`
|
|
42
|
+
for other indexer commands. We do not reinterpret arbitrary tsconfigs or shell arguments.
|
|
43
|
+
- `indexed`: actual presence in the normalized SCIP document list, including empty documents,
|
|
44
|
+
if emitted. An indexer result without document observations leaves it unknown. A fact count
|
|
45
|
+
never substitutes for this observation.
|
|
46
|
+
|
|
47
|
+
The public source-project probe demonstrates that an imported file can be resolvable by the
|
|
48
|
+
TypeScript compiler but absent from SCIP documents when it was not an entry. Selecting a
|
|
49
|
+
directory in `codeRoots` does not automatically add it to SCIP's `include`. The report exposes
|
|
50
|
+
the omitted file and references without an indexed definition. Configure the intended source
|
|
51
|
+
entries/aliases explicitly, then refresh. `indexedOutsideRequest` also handles observed extra
|
|
52
|
+
documents from other invocations; it is not a promise of automatic transitive inclusion.
|
|
53
|
+
`otherIndexedFiles` reports observations outside this TypeScript inventory without pretending
|
|
54
|
+
those languages have the same coverage contract.
|
|
55
|
+
|
|
56
|
+
## Connections and uncertainty
|
|
57
|
+
|
|
58
|
+
Coverage derives code connections from retained occurrence facts: a reference's exact symbol
|
|
59
|
+
ID is joined to its indexed definition file(s), then to recorded package boundaries. Repeated
|
|
60
|
+
sites remain distinct; duplicate fact IDs do not inflate reference counts. Project rows expose
|
|
61
|
+
incoming/outgoing reference counts and distinct connected boundary counts. File rows expose
|
|
62
|
+
reference counts, missing indexed definitions, declaration-only targets and cited implementation
|
|
63
|
+
gap counts. File node IDs support follow-up through `graph.neighbors` to exact symbols/citations.
|
|
64
|
+
|
|
65
|
+
These are code-reference measurements. They do not replace queue/stored-data product links,
|
|
66
|
+
prove calls ran, or establish compatibility/fulfillment. A declaration-only external target is
|
|
67
|
+
not an implementation body. Unresolved external calls retain the existing extraction diagnostics;
|
|
68
|
+
not every missing dynamic/type/module relationship can be observed. Zero gaps or connections
|
|
69
|
+
cannot certify completeness, isolation or no impact.
|
|
70
|
+
|
|
71
|
+
The full stored inventory and the same retained facts supply the public query, ordinary impact/
|
|
72
|
+
neighborhood/path/compatibility overview, and viewer text. RDF projection equivalence is tested;
|
|
73
|
+
no separate graph topology or guessed cross-service edge is introduced. `coverage.code.scope`
|
|
74
|
+
is `saved-snapshot`; existing lane counts remain `returned-page`. Overview has no file list,
|
|
75
|
+
keeping ordinary agent responses bounded. Detailed package/file lists are paginated separately.
|
|
76
|
+
Projection work still scans the saved inventory and facts, not an incremental graph database.
|
|
77
|
+
|
|
78
|
+
## Snapshot lifecycle
|
|
79
|
+
|
|
80
|
+
Assembly advances from 11 to 12. Inventory participates in committed and overlay content digests.
|
|
81
|
+
Draft inventory is rebuilt from the isolated captured tree; Git blob identities are content-based,
|
|
82
|
+
and the overlay manifest supplies base SHA/capture identity. Overlays record their actual SCIP
|
|
83
|
+
digest rather than inheriting the committed artifact's digest. Edits outside captured scope stay
|
|
84
|
+
excluded through the existing evidence-state contract. Historical snapshots remain readable;
|
|
85
|
+
absent inventory is `unavailable`, not zero. Unsupported version/digest mismatches are
|
|
86
|
+
`invalid-inventory`, without fabricated counts. Inventory digests detect mismatches, not signed
|
|
87
|
+
attestation or complete validation of arbitrary hand-edited snapshot JSON.
|
|
88
|
+
|
|
89
|
+
Provider/prompt/cache identity remains unchanged, so unchanged semantic artifacts can be reused.
|
|
90
|
+
The query adds no model calls, hard gates, dependencies, workspace builds or application changes.
|
|
91
|
+
|
|
92
|
+
## Acceptance and remaining scope
|
|
93
|
+
|
|
94
|
+
[The public fixture](../evaluations/monorepo-coverage/README.md) covers actual committed multi-package
|
|
95
|
+
TypeScript/TSX, aliases/barrels, an independent service, an omitted service, declaration-only and
|
|
96
|
+
unresolved external targets, selected-but-unindexed files and empty sources. Tests compare raw
|
|
97
|
+
SCIP documents, RDF facts and coverage; follow exact paginated boundaries/files; preserve unknown
|
|
98
|
+
legacy state; and verify unchanged reuse/clean comparison, dirty unavailable-provider queries,
|
|
99
|
+
CLI/MCP equivalence, rename/delete overlays, changed selection and immutable historical results.
|
|
100
|
+
Packed installation exercises the exported API and installed CLI/MCP. Supported platform results
|
|
101
|
+
are recorded in [validation](VALIDATION.md) and the change PR.
|
|
102
|
+
|
|
103
|
+
This closes the bounded B5 implementation, not live product acceptance. Arbitrary compiler-project
|
|
104
|
+
discovery, other language indexing, cross-repository federation, B3b's inference decision and B6's
|
|
105
|
+
candidate/usefulness evaluation retain their separate scope.
|