@weftlet/toolkit 0.6.0 → 0.6.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/README.md CHANGED
@@ -14,7 +14,7 @@ Proposed future capabilities are recorded in the [Weftlet 2.0 product plan](docs
14
14
  ## Set up a project
15
15
 
16
16
  <!-- weftlet:release:start -->
17
- Package versions in this checkout/archive: `@weftlet/toolkit@0.6.0` and `@weftlet/core@0.6.0`.
17
+ Package versions in this checkout/archive: `@weftlet/toolkit@0.6.1` and `@weftlet/core@0.6.1`.
18
18
  <!-- weftlet:release:end -->
19
19
 
20
20
  Weftlet uses `@weftlet/toolkit`; its neutral `@weftlet/core` dependency is installed
@@ -95,7 +95,7 @@ export class OpenCaesarOntologyCompiler {
95
95
  throw new Error('Optional openCAESAR requires projectPath and containerImage');
96
96
  }
97
97
  const source = resolve(this.repositoryRoot, this.config.projectPath);
98
- const work = join(this.storageRoot, 'work', `ontology-${snapshotId}-${randomUUID()}`);
98
+ const work = join(this.storageRoot, 'work', `ontology-${randomUUID()}`);
99
99
  await rm(work, { recursive: true, force: true });
100
100
  await mkdir(dirname(work), { recursive: true });
101
101
  const sourceBuild = join(source, 'build');
@@ -155,7 +155,7 @@ export class DirectRdfOntologyCompiler {
155
155
  writer.addQuads(dataset.getQuads(null, null, null, null));
156
156
  const text = await new Promise((accept, reject) => writer.end((error, value) => error ? reject(error) : accept(value)));
157
157
  const content = text.split('\n').filter(Boolean).sort().join('\n') + '\n';
158
- const root = join(this.storageRoot, 'work', `rdf-${snapshotId}-${randomUUID()}`);
158
+ const root = join(this.storageRoot, 'work', `rdf-${randomUUID()}`);
159
159
  await mkdir(root, { recursive: true });
160
160
  const path = join(root, 'semantic.nt');
161
161
  await writeFile(path, content);
@@ -1,7 +1,6 @@
1
1
  // Modified for standalone extraction; see docs/extraction-manifest.json.
2
- import { randomUUID } from 'node:crypto';
3
2
  import { withCommittedTree } from "../repository/committed-tree.js";
4
- import { copyFile, mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
3
+ import { copyFile, mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
5
4
  import { createRequire } from 'node:module';
6
5
  import { dirname, join } from 'node:path';
7
6
  import { pathToFileURL } from 'node:url';
@@ -13,6 +12,7 @@ import { moduleRequestNode } from './module-request.js';
13
12
  import { matchesRepositoryGlob } from "../repository/glob.js";
14
13
  import { runProcess } from "../infrastructure/process.js";
15
14
  import { sha256, stableJson } from "../infrastructure/util.js";
15
+ import { physicalArtifactKey, temporaryArtifactPath } from '../infrastructure/artifact-paths.js';
16
16
  export class ScipTypeScriptIndexer {
17
17
  config;
18
18
  storageRoot;
@@ -26,9 +26,9 @@ export class ScipTypeScriptIndexer {
26
26
  assertSourceProjectInvocation(this.config.command, this.config.args);
27
27
  }
28
28
  const require = createRequire(import.meta.url);
29
- const destination = join(this.storageRoot, 'scip', `${context.snapshotId}.scip`);
29
+ const destination = join(this.storageRoot, 'scip', `${physicalArtifactKey(context.snapshotId)}.scip`);
30
30
  await mkdir(join(this.storageRoot, 'scip'), { recursive: true });
31
- const temporary = `${destination}.${randomUUID()}.tmp`;
31
+ const temporary = temporaryArtifactPath(destination);
32
32
  const command = this.config.command === 'bundled-scip-typescript' ? process.execPath : this.config.command;
33
33
  const args = this.config.command === 'bundled-scip-typescript'
34
34
  ? [
@@ -38,23 +38,28 @@ export class ScipTypeScriptIndexer {
38
38
  temporary,
39
39
  ]
40
40
  : this.config.args;
41
- await withCommittedTree(context.repositoryRoot, context.commitSha, async (worktreeRoot) => {
42
- const project = this.config.sourceProject ? await prepareScipSourceProject(worktreeRoot, this.config.sourceProject, await new GitRepository(context.repositoryRoot).listAllFilesAt(context.commitSha)) : undefined;
43
- await runProcess(command, project ? [...args, project] : args, worktreeRoot, {
44
- ...process.env,
45
- NODE_OPTIONS: process.env.NODE_OPTIONS ?? '--max-old-space-size=8192',
41
+ try {
42
+ await withCommittedTree(context.repositoryRoot, context.commitSha, async (worktreeRoot) => {
43
+ const project = this.config.sourceProject ? await prepareScipSourceProject(worktreeRoot, this.config.sourceProject, await new GitRepository(context.repositoryRoot).listAllFilesAt(context.commitSha)) : undefined;
44
+ await runProcess(command, project ? [...args, project] : args, worktreeRoot, {
45
+ ...process.env,
46
+ NODE_OPTIONS: process.env.NODE_OPTIONS ?? '--max-old-space-size=8192',
47
+ });
48
+ const source = this.config.command === 'bundled-scip-typescript'
49
+ ? temporary
50
+ : join(worktreeRoot, 'index.scip');
51
+ await stat(source);
52
+ if (source !== temporary)
53
+ await copyFile(source, temporary);
54
+ // SCIP embeds this disposable checkout in metadata and inferred-type hover text.
55
+ // Store the normalized artifact itself so its digest still authenticates its bytes.
56
+ await writeFile(temporary, normalizeScipCheckout(await readFile(temporary), worktreeRoot));
46
57
  });
47
- const source = this.config.command === 'bundled-scip-typescript'
48
- ? temporary
49
- : join(worktreeRoot, 'index.scip');
50
- await stat(source);
51
- if (source !== temporary)
52
- await copyFile(source, temporary);
53
- // SCIP embeds this disposable checkout in metadata and inferred-type hover text.
54
- // Store the normalized artifact itself so its digest still authenticates its bytes.
55
- await writeFile(temporary, normalizeScipCheckout(await readFile(temporary), worktreeRoot));
56
- });
57
- await rename(temporary, destination);
58
+ await rename(temporary, destination);
59
+ }
60
+ finally {
61
+ await rm(temporary, { force: true });
62
+ }
58
63
  return {
59
64
  path: destination,
60
65
  digest: sha256(await readFile(destination)),
@@ -0,0 +1,4 @@
1
+ /** Physical names only. Logical identities and evidence must retain the original value. */
2
+ export declare function physicalArtifactKey(identity: string): string;
3
+ /** Same-directory staging preserves atomic rename/link without repeating a long basename. */
4
+ export declare function temporaryArtifactPath(destination: string): string;
@@ -0,0 +1,14 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { dirname, join } from 'node:path';
3
+ /** Physical names only. Logical identities and evidence must retain the original value. */
4
+ export function physicalArtifactKey(identity) {
5
+ if (/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(identity) &&
6
+ !/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(identity))
7
+ return identity;
8
+ // '~' is excluded from literal logical storage keys, so a digest cannot alias one.
9
+ return `~${createHash('sha256').update(identity).digest('hex')}`;
10
+ }
11
+ /** Same-directory staging preserves atomic rename/link without repeating a long basename. */
12
+ export function temporaryArtifactPath(destination) {
13
+ return join(dirname(destination), `.${randomUUID()}.tmp`);
14
+ }
@@ -1,8 +1,8 @@
1
1
  // Modified for standalone extraction; see docs/extraction-manifest.json.
2
2
  import { mkdir, readFile, writeFile, link, rm } from 'node:fs/promises';
3
- import { randomUUID } from 'node:crypto';
4
- import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
3
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
5
4
  import { atomicRename } from './atomic-rename.js';
5
+ import { physicalArtifactKey, temporaryArtifactPath } from '../infrastructure/artifact-paths.js';
6
6
  async function readJson(path) {
7
7
  try {
8
8
  return JSON.parse(await readFile(path, 'utf8'));
@@ -13,9 +13,21 @@ async function readJson(path) {
13
13
  throw error;
14
14
  }
15
15
  }
16
+ async function readWithLegacyPath(path, legacyPath) {
17
+ const current = await readJson(path);
18
+ if (current !== undefined || path === legacyPath)
19
+ return current;
20
+ // No old file could have this component on supported filesystems. Do not attempt an
21
+ // overlong fallback after a normal cache miss; other I/O/corruption errors still propagate.
22
+ if (Buffer.byteLength(basename(legacyPath)) > 255)
23
+ return undefined;
24
+ if (process.platform === 'win32' && /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\.|$)/i.test(basename(legacyPath)))
25
+ return undefined;
26
+ return readJson(legacyPath);
27
+ }
16
28
  async function atomicJson(path, value) {
17
29
  await mkdir(dirname(path), { recursive: true });
18
- const temporary = `${path}.${randomUUID()}.tmp`;
30
+ const temporary = temporaryArtifactPath(path);
19
31
  try {
20
32
  await writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, { encoding: 'utf8', flag: 'wx' });
21
33
  await atomicRename(temporary, path);
@@ -29,7 +41,7 @@ function safeKey(key) {
29
41
  throw new Error('Unsafe storage identifier');
30
42
  return key;
31
43
  }
32
- function snapshotPath(root, snapshotId) {
44
+ function snapshotPath(root, snapshotId, legacy = false) {
33
45
  if (snapshotId.length > 256 ||
34
46
  !/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(snapshotId) ||
35
47
  snapshotId === '.' ||
@@ -37,7 +49,7 @@ function snapshotPath(root, snapshotId) {
37
49
  throw new Error('snapshotId must be a safe storage identifier');
38
50
  }
39
51
  const directory = resolve(root, 'snapshots');
40
- const candidate = resolve(directory, `${snapshotId}.json`);
52
+ const candidate = resolve(directory, `${legacy ? snapshotId : physicalArtifactKey(snapshotId)}.json`);
41
53
  const pathFromDirectory = relative(directory, candidate);
42
54
  if (pathFromDirectory === '..' ||
43
55
  pathFromDirectory.startsWith(`..${sep}`) ||
@@ -53,8 +65,15 @@ export class FileSnapshotStore {
53
65
  }
54
66
  async write(snapshot) {
55
67
  const destination = snapshotPath(this.root, snapshot.manifest.snapshotId);
68
+ const prior = await this.read(snapshot.manifest.snapshotId);
69
+ if (prior) {
70
+ if (prior.manifest.contentDigest !== snapshot.manifest.contentDigest) {
71
+ throw new Error(`Refusing to overwrite immutable snapshot ${snapshot.manifest.snapshotId} with different content`);
72
+ }
73
+ return; // Preserve an existing legacy file without copying or rewriting its bytes.
74
+ }
56
75
  await mkdir(dirname(destination), { recursive: true });
57
- const temporary = `${destination}.${randomUUID()}.tmp`;
76
+ const temporary = temporaryArtifactPath(destination);
58
77
  try {
59
78
  await writeFile(temporary, JSON.stringify(snapshot), { flag: 'wx' });
60
79
  // Linking a complete file publishes atomically without ever replacing a winner.
@@ -73,16 +92,17 @@ export class FileSnapshotStore {
73
92
  }
74
93
  }
75
94
  read(snapshotId) {
76
- return readJson(snapshotPath(this.root, snapshotId));
95
+ return readWithLegacyPath(snapshotPath(this.root, snapshotId), snapshotPath(this.root, snapshotId, true));
77
96
  }
78
97
  async readHead(headName) {
79
- const head = await readJson(join(this.root, 'heads', `${safeKey(headName)}.json`));
98
+ const key = safeKey(headName);
99
+ const head = await readWithLegacyPath(join(this.root, 'heads', `${physicalArtifactKey(key)}.json`), join(this.root, 'heads', `${key}.json`));
80
100
  return head ? this.read(head.snapshotId) : undefined;
81
101
  }
82
102
  async updateHead(headName, snapshotId) {
83
103
  if (!(await this.read(snapshotId)))
84
104
  throw new Error('Cannot point a head to an absent snapshot');
85
- return atomicJson(join(this.root, 'heads', `${safeKey(headName)}.json`), { snapshotId });
105
+ return atomicJson(join(this.root, 'heads', `${physicalArtifactKey(safeKey(headName))}.json`), { snapshotId });
86
106
  }
87
107
  }
88
108
  export class SemanticArtifactStore {
@@ -97,18 +117,26 @@ export class SemanticArtifactStore {
97
117
  }
98
118
  /** Only explicitly supplied roots are consulted; never enumerate other consumers' profiles. */
99
119
  async readEntry(key) {
100
- const filename = `${safeKey(key)}.json`;
120
+ const filename = `${physicalArtifactKey(safeKey(key))}.json`;
101
121
  for (const [index, root] of [this.root, ...this.legacyRoots].entries()) {
102
- const artifact = await readJson(join(root, 'artifacts', 'semantic', filename));
122
+ const artifact = await readWithLegacyPath(join(root, 'artifacts', 'semantic', filename), join(root, 'artifacts', 'semantic', `${key}.json`));
103
123
  if (artifact !== undefined)
104
124
  return { artifact, origin: index === 0 ? 'primary' : 'legacy' };
105
125
  }
106
126
  return undefined;
107
127
  }
108
128
  async write(artifact) {
109
- const path = join(this.root, 'artifacts', 'semantic', `${safeKey(artifact.key)}.json`);
129
+ const key = safeKey(artifact.key);
130
+ const path = join(this.root, 'artifacts', 'semantic', `${physicalArtifactKey(key)}.json`);
131
+ const prior = await readWithLegacyPath(path, join(this.root, 'artifacts', 'semantic', `${key}.json`));
132
+ if (prior) {
133
+ if (prior.outputDigest !== artifact.outputDigest) {
134
+ throw new Error('Concurrent semantic artifact differs; retry with explicit force refresh');
135
+ }
136
+ return;
137
+ }
110
138
  await mkdir(dirname(path), { recursive: true });
111
- const temporary = `${path}.${randomUUID()}.tmp`;
139
+ const temporary = temporaryArtifactPath(path);
112
140
  try {
113
141
  await writeFile(temporary, JSON.stringify(artifact), { flag: 'wx' });
114
142
  await link(temporary, path);
@@ -0,0 +1,58 @@
1
+ # ADR 028: bounded physical artifact names
2
+
3
+ Status: implemented; release status is recorded in [validation](VALIDATION.md).
4
+
5
+ The consumer reported that long physical artifact/temp names block the traversal → unchanged
6
+ repeat → clean-comparison sequence on Windows. A public regression using traversal, routing and
7
+ an empty runtime-evidence revision reproduces `ENAMETOOLONG` in real SCIP during clean comparison
8
+ on Linux too. Appending `.scip.<UUID>.tmp` to the complete logical identity exceeds the common
9
+ 255-byte filename-component limit. RDF and optional OML work directories also embedded the entire
10
+ identity. This is a physical storage defect, not a graph identity, business-rule or SHACL defect.
11
+
12
+ ## Physical names and compatibility
13
+
14
+ Keep portable literal artifact keys of at most 128 ASCII characters. Longer/nonportable keys
15
+ use `~` followed by the full SHA-256 of the logical key. The `~` namespace is excluded from
16
+ literal logical storage identifiers, preventing a hash from aliasing a user-supplied short key.
17
+ Windows device names are also hashed. Existing logical identifier validation and its 256-character
18
+ limit remain intact; no snapshot, fact, provenance, extractor or cache identity is shortened.
19
+
20
+ Snapshot JSON, heads, semantic cache storage and SCIP output use this mapping. Generated semantic
21
+ cache keys are already 64-character digests and retain their names. Snapshot reads fall back to
22
+ the old literal filename if the bounded path is absent. Semantic reads retain explicit legacy
23
+ root handling. Skip legacy components that cannot exist within the filename limit (and Windows
24
+ device names on Windows), but propagate other I/O and corrupt-JSON errors.
25
+
26
+ Existing legacy immutable snapshots/artifacts are checked before publication and retained byte
27
+ for byte. A different content/output digest for the same identity remains an error. Updating a
28
+ long legacy head writes the new bounded head and gives it precedence without modifying history.
29
+ No bulk cache migration, forced extraction or automatic deletion is required. Older toolkit
30
+ versions cannot necessarily read newly hashed long-name entries; use supported store/CLI queries
31
+ with the full logical ID rather than constructing a filename from it.
32
+
33
+ Staging names are independent UUIDs in the destination directory, preserving same-filesystem
34
+ atomic link/rename publication. Cross-process immutable winner and head replacement semantics
35
+ remain unchanged. SCIP staging files are cleaned after success or failure. RDF/optional OML work
36
+ directories need only a backend prefix and UUID; RDF output digests do not depend on their names.
37
+ The optional OML generated document filenames remain their existing semantic digest keys.
38
+
39
+ This bounds toolkit-generated components; it does not promise that arbitrary storage-root lengths
40
+ or user source filenames work with every external program's total-path restrictions. The original
41
+ working checkout is not moved or cleaned. Full logical IDs remain in snapshots, head records,
42
+ facts and query responses, and saved evidence remains queryable without providers.
43
+
44
+ ## Validation boundary
45
+
46
+ The public sequence uses the unchanged Codex adapter with its offline grammar runner, real SCIP,
47
+ RDF/SHACL, document traversal, configured routing and an injected empty runtime provider. First
48
+ hydration extracts six semantic documents; repeat and clean comparison reuse all six. The clean
49
+ identity retains traversal/clean/runtime suffixes and exceeds 215 characters. Content digests and
50
+ all facts/provenance except the containing snapshot ID agree; the original head stays unchanged.
51
+ Generated components are bounded and no staging files remain. The exact sequence is part of the
52
+ existing native Windows traversal suite as well as the Linux suite.
53
+
54
+ Storage regressions cover 256-character snapshot/artifact/head keys, concurrent immutable writes,
55
+ concurrent head replacement, legacy reads without rewriting bytes, legacy cache roots, collisions
56
+ and unsafe input rejection. Existing cross-process publication tests remain required. Live provider
57
+ calls, private TradePilot acceptance and live openCAESAR compilation are separate; this patch does
58
+ not claim them or change validation constraints, graph semantics or evidence authority.
@@ -134,10 +134,12 @@ does not establish what the agent saw. Also retain a short account of what the a
134
134
  in its implementation or test plan because of these results, and the actual test outcomes.
135
135
 
136
136
  Retain the selected immutable snapshot, not just the mutable head pointer. With workspace
137
- storage, it is `<repositoryRoot>/<storagePath>/snapshots/<snapshotId>.json`; the default
138
- `storagePath` is `.context-graph`. `storageScope: "user"` instead uses a configuration/checkout
139
- hash directory under `~/.cache/context-graph`. Preserve the original store and exact
140
- configuration if its resolved path is uncertain. Semantic artifacts under `artifacts/semantic/`
137
+ storage, snapshots are under `<repositoryRoot>/<storagePath>/snapshots/`; the default
138
+ `storagePath` is `.context-graph`. Long physical filenames are hashed: identify the selected
139
+ record by its full `manifest.snapshotId`, not by constructing a filename from that ID.
140
+ `storageScope: "user"` instead uses a configuration/checkout hash directory under
141
+ `~/.cache/context-graph`. Preserve the original store and exact configuration if its resolved
142
+ path is uncertain. Semantic artifacts under `artifacts/semantic/`
141
143
  contain model output; keep them locally if extraction debugging is needed. They are not
142
144
  required to query an existing snapshot. Do not copy credentials or whole account directories.
143
145
 
@@ -0,0 +1,70 @@
1
+ # Graphify evaluation for the pre-1.0 baseline
2
+
3
+ Status: preliminary source/document review on 2026-10-28. **No comparative execution or
4
+ replacement decision yet.** This is B2 of the [baseline plan](PRE-1.0-BASELINE.md).
5
+ No Graphify dependency, code, binary, skill or service was installed into Weftlet. Public source
6
+ was read at a pinned revision outside the repository; no private consumer material was used.
7
+
8
+ ## Reviewed candidate
9
+
10
+ - Repository: [Graphify-Labs/graphify](https://github.com/Graphify-Labs/graphify).
11
+ - Reviewed commit: `0a8cd4e1e342235fe53e881fb5d591bf0460071f` on its `v8` branch.
12
+ - That commit's [package manifest](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/pyproject.toml)
13
+ identifies distribution `graphifyy`, version `0.9.97`, Python >=3.10 and Apache-2.0 licensing.
14
+ This is source metadata, not verification that a particular registry archive matches it.
15
+
16
+ The [README](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/README.md)
17
+ describes local tree-sitter extraction, broader language coverage, document/rationale extraction,
18
+ paths and agent integration. Marketing/benchmark claims are not adopted as Weftlet measurements.
19
+ The code inspected below supports evaluating it as a richer code-evidence producer; it does not
20
+ establish that it is more accurate than compiler-backed TypeScript indexing on our tasks.
21
+
22
+ ## Findings from source inspection
23
+
24
+ | Area | Observed at the pinned revision | Implication for an experiment |
25
+ | --- | --- | --- |
26
+ | Code granularity | [Extractor models](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/graphify/extractors/models.py) represent function/call syntax, declarations, imports, aliases, exports and symbol uses. The [engine](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/graphify/extractors/engine.py) emits code relationships and source locations. | Evaluate function/method/call relationships that our current file/shared-symbol projection does not expose. AST structure alone does not establish complete dynamic calls or data flow. |
27
+ | Workspace resolution | [Resolution code](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/graphify/extractors/resolution.py) handles TypeScript aliases, project references, workspace/import/export origins and ambiguous barrel candidates. Its comments explicitly describe skipped npm-package tsconfig extensions. | Exercise our actual alias/barrel/same-name/TSX cases rather than assuming all pnpm projects resolve. Preserve unresolved and ambiguous outcomes. |
28
+ | Identity | [Base identity helpers](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/graphify/extractors/base.py) derive file/symbol prefixes from paths; comments describe a later repository-relative remap. | Test roots, collisions, repeated names, rename/delete and clean/dirty isolation. Map imported entities into Weftlet's canonical identity and snapshot provenance instead of adopting labels as join keys. |
29
+ | Evidence semantics | Extracted edges carry source file/location and `EXTRACTED` or `INFERRED` tags. | These tags do not mean owner-approved intent, observed runtime behavior or successful test execution. Measure citation precision and retain derivation when transforming facts into RDF. |
30
+ | Deployment | The manifest depends on Python, NetworkX and multiple tree-sitter grammars; its optional services/providers are separate features. | Account for installation, platform support, artifact sizes, process boundaries, licensing and maintenance. Do not introduce hosted services or paid inference to compare static code extraction. |
31
+
32
+ Graphify already covers documents and rationale too. The comparison initially isolates code
33
+ extraction so that changing document inputs/providers cannot explain an apparent code improvement.
34
+ Its [published benchmark](https://github.com/Graphify-Labs/graphify/blob/0a8cd4e1e342235fe53e881fb5d591bf0460071f/BENCHMARKS.md)
35
+ reports an ERPNext six-question evaluation and a small FastAPI inferred-edge audit, including
36
+ noisier same-name test helpers. Those are upstream-reported results, not a TypeScript comparison
37
+ against Weftlet or SCIP and not evidence for complete asynchronous or business-rule linkage.
38
+
39
+ ## Fixed comparison protocol
40
+
41
+ 1. Freeze public source commits, expected relationships, negative cases, query/page budgets,
42
+ platform, versions and resource ceilings before measurement. Reuse the A1–A3 fixtures and
43
+ the existing dispatch negative case; add function-level examples without changing old labels.
44
+ 2. Compare **the current Weftlet SCIP projection**, **a bounded richer projection of raw SCIP**,
45
+ and **pinned Graphify static extraction**. Record raw index coverage separately from what
46
+ each adapter exposes. Do not attribute information discarded by our projection to SCIP itself.
47
+ 3. Include exact symbols, local/private functions, aliases, barrel exports, overloads, duplicate
48
+ names in separate domains, test mocks, TSX and service packages. Include a declared queue
49
+ boundary, a stored-data handoff and an undeclared boundary. The expected result for an
50
+ unsupported boundary is an explicit gap, not a guessed edge based only on a matching string.
51
+ 4. Hold business documents and their approved source classifications fixed. Check that the same
52
+ business-to-code links survive, then evaluate any finer function bindings separately. Keep
53
+ inferred mappings, source approval and reviewed assertions distinct.
54
+ 5. Measure precision/recall against predeclared edges, correct task-level consumers, false joins,
55
+ unresolved targets, citation validity, identity stability, cold/repeat/edit time and peak memory.
56
+ Compare same-process and subprocess measurements honestly. Count install/transfer overhead.
57
+ 6. Exercise deletion/rename, repeated clean runs, isolated committed materialization and dirty
58
+ queries. Retain old snapshots. Prove RDF/SPARQL/traversal equivalence for imported facts;
59
+ reject incompatible identities rather than weakening SHACL or dropping contradictory evidence.
60
+ 7. Run in a disposable tool environment with model calls disabled. Record reproducible commands
61
+ and sanitized outputs. Any live semantic experiment needs a separate bounded budget and
62
+ authorization before substantial paid usage. No private application checkout is modified.
63
+ 8. Produce an ADR choosing to keep SCIP, improve its projection, add an optional supported
64
+ producer, or replace the default. Replacement is a valid outcome if evidence supports it;
65
+ two permanently required indexers are not a prerequisite. If a change is selected, implement
66
+ compatibility/versioning and fresh-install tests as a separate milestone before publication.
67
+
68
+ Graphify does not become a second authority for product intent merely by importing its graph.
69
+ Neither tool can establish an undocumented business mapping from graph density alone. B3/B4
70
+ must address those evidence and meaning questions independently of the code backend decision.
@@ -0,0 +1,94 @@
1
+ # Business-context baseline before 1.0
2
+
3
+ Status: added at the maintainer's request on 2026-10-28 after publication of the 0.6.0
4
+ candidate. This extends the original T01–T10 task list; its completion did not establish
5
+ automatic rule-to-function discovery or complete agent exploration. The candidate remains
6
+ available for TradePilot acceptance while the work below is assessed. No new release is
7
+ announced by this plan.
8
+
9
+ The product goal is to let an agent starting with a task or code change retrieve the relevant
10
+ product obligations, understand their connections across domains and asynchronous service
11
+ boundaries, and inspect the implementations, contracts and evidence behind those connections.
12
+ The agent must be able to investigate further without confusing a bounded response with
13
+ complete coverage. A functioning extraction/publication pipeline is necessary but insufficient.
14
+
15
+ ## What we checked now
16
+
17
+ Runtime source baseline: `9b4acffe1c4d35f9fd2f91132c576f8934658677`, the documentation follow-up
18
+ to release source `b4c808b9221c5c82f9f7326a310e966d1fee2888`. Both package versions are 0.6.0.
19
+ New acceptance tests use that unchanged runtime. Results and commands are recorded in
20
+ [the assessment](assessments/pre-1.0-2026-10-28.json) and [validation](VALIDATION.md).
21
+
22
+ | Acceptance case | Current result | What remains unproven or missing |
23
+ | --- | --- | --- |
24
+ | **A1 — Business context across an asynchronous or stored-data boundary** | **Bounded mechanism PASS.** An upstream file has no code/symbol connection to the downstream service in the control. Adding a cited workflow handoff makes execution, notifications, mobile and a test reachable. Both producer and consumer freshness obligations survive with their citations and unreviewed assertion authority. An unrelated domain with the same rule label stays excluded. | This is extraction from a deterministic public prose grammar. No live semantic comprehension, actual database/BullMQ delivery, automatic business compatibility verdict or private consumer acceptance is established. |
25
+ | **A2 — Progressive agent exploration** | **Existing operations PASS; requested experience PARTIAL.** Small pages through the actual MCP facade exhaust to exactly the larger scan without duplicates. A focused follow-up retrieves the downstream rule. Depth exhaustion is explicit; changing the query rejects an old continuation. | No dedicated exact-node neighbor/path MCP operation with relation/direction filters or explicit unexplored neighbor inventory. Scripted facade requests are not an autonomous-agent usefulness study or a new transport test. |
26
+ | **A3 — Multiple services and client packages in one monorepo** | **Configured public fixture PASS.** Real SCIP resolves a re-exported workspace contract used by API and TSX client code. Document relationships connect separately located API, execution and notification services and the client. Repeat hydration reuses all five documents with unchanged snapshot identity/content. | A synthetic pnpm workspace uses explicit source includes/aliases in one indexing program. This is not a full pnpm installation, multiple service builds, Expo validation, automatic workspace discovery or a run against TradePilot. Per-service coverage and real package resolution still need consumer evidence. |
27
+
28
+ The [three new tests](../tests/business-context-acceptance.test.ts) hydrate an independent Git
29
+ repository through the real application, semantic-provider contract, SCIP, document linker,
30
+ RDF/SHACL, saved storage and query path. The fixture provider parses only its documented small
31
+ grammar; it makes no model request and does not inspect implementation bodies. The control
32
+ already includes both sides' documents. The only added source evidence is the collection-to-
33
+ execution handoff. It re-extracts one document and reuses four; the next unchanged hydration
34
+ extracts zero and reuses five. Prior snapshots remain intact. No facts are manually spliced into
35
+ the assembled graph to obtain the positive result.
36
+
37
+ The two freshness limits (600 seconds at collection, 60 seconds at execution) are deliberately
38
+ different. They can be compatible when the consumer checks freshness. The test asserts retrieval
39
+ of both obligations and **does not assert a conflict or compliance verdict**. Runtime evidence
40
+ and evaluated business invariants are empty. Source approval never approves the model assertion.
41
+
42
+ Existing routing, query, RDF and workspace-indexing tests were also rerun: **24 passed**, followed
43
+ by **3 new acceptance tests passed**. Existing routing negatives reject false same-channel joins
44
+ and ambiguous/missing endpoints. Existing indexing checks cover dirty inputs, renames and deletes.
45
+ These results supplement, and do not replace, the published release's validation record.
46
+
47
+ Reproduce the focused assessment from a configured development checkout:
48
+
49
+ ```sh
50
+ pnpm exec vitest run tests/business-context-acceptance.test.ts tests/rdf.test.ts tests/routing.test.ts src/extraction/routing.test.ts src/extraction/scip-project.test.ts src/graph/query.test.ts
51
+ ```
52
+
53
+ ## Subsequent task list
54
+
55
+ These are bounded pre-1.0 investigations and implementation tasks, not a claim that the features
56
+ are delivered. Record decisions and exact acceptance evidence per task. Any deferral must be
57
+ explicitly reviewed with the maintainer; do not convert missing evidence into a pass. TradePilot
58
+ blockers take priority when its report arrives. Do not modify or audit its application here.
59
+
60
+ | ID | Task / next action | Acceptance boundary |
61
+ | --- | --- | --- |
62
+ | **B1** | **Exact graph exploration.** Specify and add bounded node lookup/neighbor expansion and dependency-path exploration through MCP and the shared query layer. | An agent can start from a returned stable node ID, select relation/direction and inspect another business area. Return citations, authority, snapshot identity, incomplete scope, pagination and remaining frontier. Test branches, cycles, ambiguous labels, deleted nodes and stale/mismatched continuations. Keep CLI/MCP/viewer on the same facts; preserve existing `impact.scan`. |
63
+ | **B2** | **Evaluate Graphify and current SCIP representation.** Run the fixed public comparison in [the research note](GRAPHIFY-EVALUATION.md) before choosing a code extraction backend or symbol schema. | Compare the current projection, richer use of raw SCIP and pinned Graphify on identical committed inputs. Measure correct/missing/false links, provenance, identity stability, costs and packaging. Produce a keep/improve/replace decision with evidence. Parallel use during evaluation does not mandate shipping two indexers. |
64
+ | **B3** | **Resolve business-to-implementation links at symbol/function level.** After B2, define canonical scoped code identities and resolve explicit document paths/symbol references to exact code entities. Evaluate a separate bounded inference pass only where explicit evidence is insufficient. | Named functions, methods, aliases, overloads, same-name symbols and renamed/deleted targets resolve correctly or remain unresolved. Separate a cited declared mapping, a proposed inferred mapping and evidence of actual behavior. Record both document and code revisions/spans for derived links. A reviewer can follow a rule to its implementation and back. Code inference never supplies approval; full automatic documentation generation remains 2.0. |
65
+ | **B4** | **Cross-boundary obligations.** Represent and retrieve producer guarantees and consumer requirements through explicit data/event contracts, including applicable stage, domain, units, freshness and version where sources provide them. | Public cases cover a queue handoff, a write/read handoff, compatible differing limits with revalidation, a real documented incompatibility, missing links and same-name unrelated domains. Retrieve both sides and the implementation evidence. Potential model findings remain uncertain; hard failures require explicit approved deterministic rules. A graph link or SHACL pass is not a compatibility verdict. General reconciliation/approval UI remains 2.0. |
66
+ | **B5** | **Monorepo selection and coverage.** Assess diagnostics for selected services, client, shared packages, source aliases and excluded/unresolved code; improve the gaps found. | A configured multi-package TypeScript/TSX fixture and the consumer report identify which projects were selected, indexed and actually connected. Test barrel exports, independent service code, external unresolved dependencies and omitted projects. Missing resolution cannot be reported as zero impact or complete coverage. Cross-repository federation is a separate scope decision. |
67
+ | **B6** | **End-to-end product acceptance and release decision.** Combine the public evidence, B1–B5 decisions and TradePilot's actual 0.6.0 report; ship bounded candidate changes as needed. | Predeclare tasks, correct downstream business obligations/implementations, known unrelated matches and query budgets before measuring. Retain actual requests, follow-up decisions and citations. Assess helpfulness and misses separately from hydration success. Complete full hydration/repeat and supported release checks; review any remaining limitations before a versioned 1.0 publication. |
68
+
69
+ Order: retain this A1–A3 baseline; triage incoming consumer blockers; specify B1 and run the
70
+ bounded B2 comparison; use that decision for B3; implement B4/B5 in independently testable
71
+ increments; close B6. Each implementation can ship in a minor candidate before 1.0. Changes to
72
+ retrieval semantics, extraction/cache identity or snapshot compatibility need explicit decisions
73
+ and regression evidence; no silent migration or history rewrite.
74
+
75
+ ## Consumer report to reconcile when available
76
+
77
+ Retain the private configuration, documents, snapshots and transcripts with TradePilot. Share
78
+ only a sanitized report identifying package versions, source/adapter SHA, indexing/document
79
+ scope, phase timings, full validation/publication, unchanged reuse and query coverage.
80
+
81
+ For A1, choose one actual upstream-to-downstream queue or stored-data change and record how the
82
+ graph witnesses the handoff, each side's obligations and the associated implementations. Note
83
+ whether a relationship came from prose, an explicit mapping, code or an observed trace. For A2,
84
+ retain the initial request, follow-up choices and all truncation/continuation states. For A3,
85
+ record the expected service/client projects and which were indexed, reached or missing. Have a
86
+ human assess business usefulness; an automated pass here is not a replacement.
87
+
88
+ ## Boundary with 2.0
89
+
90
+ The [2.0 plan](WEFTLET-2.0-PLAN.md) still owns bulk code-derived documentation, durable approval
91
+ workflows, cross-source reconciliation management, source-document backfill, the companion
92
+ website, hosted AI/billing and unrelated source adapters. This baseline concerns connecting and
93
+ exploring local evidence accurately. No service, provider billing, new dependency, source adapter,
94
+ automatic write-back, package publication or product-policy change is introduced by this assessment.
@@ -1,6 +1,11 @@
1
1
  # Consumer hardening and the 1.0 release plan
2
2
 
3
- Status: maintainer-directed work; release checkpoint on 2026-10-27 after verified 0.5.0 publication.
3
+ Status: original T01–T10 engineering work complete; 0.6.0 candidate publication verified on 2026-10-28.
4
+ The maintainer has requested additional [business-context baseline work](PRE-1.0-BASELINE.md)
5
+ before official 1.0: precise exploration, symbol-level implementation links, cross-boundary
6
+ obligations, monorepo coverage and a measured Graphify/SCIP decision. Its A1–A3 public checks
7
+ pass within recorded limits; B1–B6 remain open. Both npm packages remain available for
8
+ TradePilot acceptance while this additional scope is assessed.
4
9
  **T08's upstream deterministic physical-file fix has shipped; the maintainer reports the consumer
5
10
  updated and working on 2026-10-27. Detailed full hydration/repeat evidence remains pending.** T04 was completed before
6
11
  the T08 fix as requested.
@@ -12,15 +17,16 @@ The consumer's approved ten-minute retry has not run; that outcome remains separ
12
17
  The original report concerned `@weftlet/toolkit@0.2.0`. T01's upstream document-identity patch
13
18
  shipped in 0.2.1; T02 and T05's focused cold-validation optimization shipped in 0.3.0.
14
19
  T03 operational cache reuse, T04 semantic failure diagnostics and T08's public core file factory
15
- shipped in 0.4.0. T09 and T05a shipped in 0.5.0. T06 documentation consistency is implemented
16
- for the next release. T07a prospective coverage is implemented separately from hydration;
20
+ shipped in 0.4.0. T09 and T05a shipped in 0.5.0. T06, T07 and T10 shipped in 0.6.0.
21
+ T07a prospective coverage is implemented separately from hydration;
17
22
  T07b classification and deterministic document evidence merged in PR 42 after local/hosted checks
18
23
  and independent review. T07c hydration/cache integration merged in PR 44 with local and hosted checks passed;
19
24
  T05's remaining engineering evaluation is recorded in
20
25
  [ADR 027](ADR-027-validation-closeout.md), retaining full direct validation after measurements.
21
- Complete source/release checks, publish a reviewed minor candidate, validate it in TradePilot,
22
- then review and publish official 1.0. These
23
- release/consumer gates are separate from the engineering count; none is already accepted.
26
+ The reviewed 0.6.0 candidate is published with verified registry archives, provenance and tags.
27
+ Validate it in TradePilot, address any acceptance blockers and the newly requested baseline
28
+ tasks, then review official 1.0. Consumer acceptance and the additional baseline are not closed
29
+ by completion of the original engineering task list.
24
30
 
25
31
  This is the near-term release task list. The [Weftlet 2.0 product plan](WEFTLET-2.0-PLAN.md)
26
32
  remains a separate future direction for generation, approvals, a companion website and hosted
@@ -47,7 +53,7 @@ integration. Consumer acceptance is reported separately from upstream determinis
47
53
 
48
54
  | ID | Task | Priority/status | Dependencies and release boundary |
49
55
  | --- | --- | --- | --- |
50
- | **T10** | Correct implementation coverage for returned code relationships | **Merged after T07a; local/hosted checks passed; publication pending** | Separate evidence counts from display groups; preserve facts, authority, ranking and saved snapshots; scope gaps to returned page |
56
+ | **T10** | Correct implementation coverage for returned code relationships | **Shipped in 0.6.0; consumer acceptance pending** | Separate evidence counts from display groups; preserve facts, authority, ranking and saved snapshots; scope gaps to returned page |
51
57
  | **T09** | Accept the approved ten-minute extraction timeout | **Shipped in 0.5.0; consumer ten-minute retry unrun** | Raise only the config ceiling to 600000; preserve defaults/cache/retry behavior; consumer retry has not run |
52
58
  | **T08** | Canonical physical-file kinds and public adapter factory | **Shipped in 0.4.0; consumer reported working; detailed acceptance pending** | Public core factory and neutral producers agree; record consumer commit, adapter tests and full hydration/repeat evidence |
53
59
  | **T01** | Coherent repository-document identity and kind | **Upstream patch shipped in 0.2.1; consumer acceptance pending** | SHACL and assertions preserved; genuine consumer re-run is still required |
@@ -55,8 +61,8 @@ integration. Consumer acceptance is reported separately from upstream determinis
55
61
  | **T03** | Artifact reuse across operational configuration changes | Shipped in 0.4.0 | Built-in Codex user artifacts share five operational changes; custom providers remain conservative; exact legacy recovery without model calls |
56
62
  | **T04** | Actionable, privacy-safe timeout diagnostics | Shipped in 0.4.0 | Safe source IDs, settled counts, failure classification and T02/T03 recovery; no extraction/cache identity change |
57
63
  | **T05** | Early identity checks and validation progress/profiling | **Cold fix shipped in 0.3.0; T05a in 0.5.0; engineering closeout evaluated in ADR 027** | Cold/repeat/edits, worker, reuse, incremental and Rust evaluated; retain full direct validation; private consumer acceptance required |
58
- | **T06** | Packaged release-documentation consistency | **Implemented after 0.5.0; publication pending** | Generated current sections, checked actual tarballs, historical records preserved, fresh documented installation commands |
59
- | **T07** | Coverage-aware traversal from SOT/roadmap entry points | **T07a merged; T07b merged with local/hosted checks and review passed; T07c merged with local/hosted checks passed** | Committed closure, source roles/ownership, validation separation and draft invalidation implemented; npm publication pending |
64
+ | **T06** | Packaged release-documentation consistency | **Shipped in 0.6.0** | Generated current sections, checked actual tarballs, historical records preserved, fresh documented installation commands |
65
+ | **T07** | Coverage-aware traversal from SOT/roadmap entry points | **All three increments shipped in 0.6.0; consumer acceptance pending** | Committed closure, source roles/ownership, validation separation and draft invalidation implemented and published |
60
66
 
61
67
  T02 and the focused T05 fix shipped in 0.3.0; T03, T04 and T08 shipped in
62
68
  [0.4.0](https://github.com/jchewitt/weftlet/releases/tag/%40weftlet/toolkit%400.4.0), following
@@ -64,7 +70,7 @@ local/hosted checks, independent archive review and fresh packed/public-registry
64
70
  T09 timeout support and T05a identity preflight/phase timing shipped in
65
71
  [0.5.0](https://github.com/jchewitt/weftlet/releases/tag/%40weftlet/toolkit%400.5.0).
66
72
  Source, registry integrity, provenance and release tags are recorded in [validation](VALIDATION.md).
67
- T05 closeout measurements and decisions are recorded in ADR 027; T06 and T07 are implemented for the next candidate.
73
+ T05 closeout measurements and decisions are recorded in ADR 027; T06 and T07 shipped in the 0.6.0 candidate.
68
74
  The consumer must migrate its framework adapter to the public core factory, then complete full
69
75
  hydration and repeat reuse; upstream fixtures do not establish that result.
70
76
 
@@ -97,8 +103,8 @@ avoiding forced re-extraction. Follow [provider limits and reuse](PROVIDERS.md#l
97
103
  Boundary, provider propagation, cancellation, cache reuse and packed/public-registry consumer checks passed;
98
104
  release evidence is in [validation](VALIDATION.md). The consumer's approved ten-minute retry
99
105
  has **not run**. No ten-minute wall-clock execution, paid/model call or private acceptance is
100
- claimed by these deterministic upstream checks. T06/T07 are now implemented with publication
101
- pending; T05 engineering evaluation is recorded separately in ADR 027.
106
+ claimed by these deterministic upstream checks. T06/T07 shipped in 0.6.0;
107
+ T05 engineering evaluation is recorded separately in ADR 027.
102
108
 
103
109
  ## T08 — Resolve deterministic physical-file kind conflicts
104
110
 
@@ -330,12 +336,12 @@ Consumer performance acceptance remains required; public fixtures do not silentl
330
336
 
331
337
  ## T06 — Keep packaged documentation consistent with the release
332
338
 
333
- Implemented after 0.5.0, with [ADR 022](ADR-022-release-documentation.md) defining the checked
339
+ Shipped in 0.6.0, with [ADR 022](ADR-022-release-documentation.md) defining the checked
334
340
  scope. Changesets regenerates current-version sections in both READMEs and the release guide.
335
341
  The dependency-free checker verifies source instructions and both actual tarballs before
336
342
  publication; the fresh-consumer smoke exercises the checked pinned commands and archive pair
337
343
  with an isolated npm/npx cache. Historical records and feature-introduction versions stay intact.
338
- Source validation is recorded in [validation](VALIDATION.md); no new npm release is claimed here.
344
+ Source and publication validation are recorded in [validation](VALIDATION.md).
339
345
 
340
346
  The original consumer installed 0.2.0 while its README still named 0.1.2 and some archive examples
341
347
  used 0.1.1. Release 0.2.1 removed README version pins. T06 adds automation and replaces the release
@@ -384,7 +390,7 @@ command. Entry points, document roots and read limits are operation arguments, w
384
390
  semantic budgets used only for comparison. No configuration/cache identity or hydration selection
385
391
  is changed. [PR 38](https://github.com/jchewitt/weftlet/pull/38) merged T07a with hosted Ubuntu
386
392
  and native Windows checks; exact source validation is recorded in [validation](VALIDATION.md).
387
- No npm publication is claimed by implementation status.
393
+ All three increments are now published in 0.6.0; registry verification is recorded separately in [validation](VALIDATION.md).
388
394
 
389
395
  [ADR 025](ADR-025-document-classification.md) records T07b's shared classification contract
390
396
  and standalone deterministic document-evidence API. `documents plan --document-policy <json-file>`
@@ -418,6 +424,10 @@ Acceptance:
418
424
 
419
425
  ## Official 1.0 acceptance
420
426
 
427
+ Also review the [A1–A3 assessment and B1–B6 task list](PRE-1.0-BASELINE.md), added after the
428
+ 0.6.0 candidate was published. The original list below remains necessary; a successful consumer
429
+ hydration alone does not close the requested business-context and exploration improvements.
430
+
421
431
  With T01's upstream patch published, work through T02–T07 in bounded increments and record implementation
422
432
  PRs and validation evidence here or in the linked validation record. Review the exact 1.0 scope
423
433
  against completed evidence; any deferral needs an explicit maintainer decision and must remain
package/docs/RELEASING.md CHANGED
@@ -202,14 +202,14 @@ Verify the matching public version in a fresh disposable project after publicati
202
202
 
203
203
  ```sh
204
204
  npm init -y
205
- npx --yes @weftlet/toolkit@0.6.0 init --yes
206
- npx --yes @weftlet/toolkit@0.6.0 config validate
205
+ npx --yes @weftlet/toolkit@0.6.1 init --yes
206
+ npx --yes @weftlet/toolkit@0.6.1 config validate
207
207
  ```
208
208
 
209
209
  For local installation, use both prepared archives from the same reviewed release:
210
210
 
211
211
  ```sh
212
- npm install --save-dev "/path/to/weftlet/.release/weftlet-core-0.6.0.tgz" "/path/to/weftlet/.release/weftlet-toolkit-0.6.0.tgz"
212
+ npm install --save-dev "/path/to/weftlet/.release/weftlet-core-0.6.1.tgz" "/path/to/weftlet/.release/weftlet-toolkit-0.6.1.tgz"
213
213
  ```
214
214
  <!-- weftlet:release:end -->
215
215
 
package/docs/ROADMAP.md CHANGED
@@ -1,11 +1,17 @@
1
1
  # Delivery roadmap
2
2
 
3
- Release checkpoint: 2026-10-27, after verified 0.5.0 publication.
3
+ Release checkpoint: 2026-10-28, after verified 0.6.0 candidate publication.
4
4
  Evidence is recorded in [validation](VALIDATION.md); this roadmap is not a live registry status.
5
5
 
6
6
  Project: `jchewitt/weftlet`. Extraction provenance is recorded in the
7
7
  [source inventory](SOURCE-INVENTORY.md).
8
8
 
9
+ The maintainer's subsequent [pre-1.0 business-context baseline](PRE-1.0-BASELINE.md) records
10
+ three bounded public acceptance checks and the additional B1–B6 task list. Exact-node exploration,
11
+ function-level intent bindings, cross-boundary obligations, monorepo coverage and a measured
12
+ [Graphify/SCIP evaluation](GRAPHIFY-EVALUATION.md) are open before the official release decision.
13
+ The published 0.6.0 candidate remains available for the separate private consumer report.
14
+
9
15
  T09 shipped in 0.5.0 with T05a work, accepting the consumer's approved
10
16
  `semantic.timeoutMs: 600000`. The default remains 120000 and retry/cancellation behavior is
11
17
  unchanged. The consumer's actual ten-minute retry has not run; upstream installation and
@@ -14,14 +20,14 @@ deterministic checks do not establish that outcome. See [provider limits and rec
14
20
  Forward direction is captured in the [Weftlet 2.0 product plan](WEFTLET-2.0-PLAN.md):
15
21
  consumer hardening, cited code-derived drafts, scoped approvals and reconciliation, an optional
16
22
  review website, source publication, managed AI and guided setup. “2.0” is a planning label;
17
- the verified release at this checkpoint is 0.5.0. The received consumer findings are tracked in the
23
+ the verified release at this checkpoint is 0.6.0. The received consumer findings are tracked in the
18
24
  [consumer hardening and 1.0 task list](RELEASE-1.0-PLAN.md): the document-identity patch is
19
25
  published and passes upstream checks; genuine consumer acceptance remains pending. T02's
20
26
  no-model preview and T05's cold-validation improvement shipped in 0.3.0. T03 operational cache
21
27
  reuse, T04 timeout diagnostics and T08 deterministic physical-file consistency shipped in 0.4.0.
22
28
  T09 timeout support and T05a identity preflight/phase timing shipped in 0.5.0.
23
- T06 [release-documentation consistency](ADR-022-release-documentation.md) is implemented for the
24
- next release: generated current examples, actual archive checks and fresh documented installation.
29
+ T06 [release-documentation consistency](ADR-022-release-documentation.md) shipped in 0.6.0:
30
+ generated current examples, actual archive checks and fresh documented installation.
25
31
  T07a [prospective document coverage](ADR-023-document-coverage-preview.md) is implemented separately
26
32
  from hydration. It follows committed Markdown links and reports coverage/budget gaps without
27
33
  model calls or graph writes. T07b [document roles and ownership](ADR-025-document-classification.md)
@@ -32,16 +38,17 @@ approval. T07c [traversal hydration](ADR-026-traversal-hydration.md) connects th
32
38
  explicit configuration, a shared no-model plan, compatible artifact reuse and draft invalidation.
33
39
  Direct-mode configuration retains its existing behavior; validation sources are excluded from
34
40
  model work in traversal mode. T07c merged in PR 44 after local and hosted Ubuntu/Windows checks;
35
- exact evidence is in [validation](VALIDATION.md). npm publication remains pending.
36
- T10 [implementation coverage reporting](ADR-024-implementation-coverage.md) is merged for the next
37
- release: actual code relationships can count as both contract and implementation evidence while
41
+ exact evidence is in [validation](VALIDATION.md). All three T07 increments shipped in 0.6.0.
42
+ T10 [implementation coverage reporting](ADR-024-implementation-coverage.md) shipped in 0.6.0:
43
+ actual code relationships can count as both contract and implementation evidence while
38
44
  display groups remain stable. Existing snapshots benefit without hydration; gaps are page-scoped.
39
45
  T05 [performance/validation closeout](ADR-027-validation-closeout.md) records the remaining
40
46
  engineering evaluations: cold/repeat/changed inputs, worker isolation, exact-result reuse,
41
47
  incremental dependencies and a bounded Rust comparison. Retain full direct validation; no worker,
42
- cache, incremental or native runtime capability is claimed. Complete source/release checks, publish
43
- a reviewed minor candidate, validate it in TradePilot, then review official 1.0. The candidate and consumer/final release gates remain
44
- separate acceptance work; the 2.0 plan remains a separate future direction.
48
+ cache, incremental or native runtime capability is claimed. The original T01–T10 engineering
49
+ work is complete and the reviewed 0.6.0 candidate is published. Validate it in TradePilot and
50
+ address acceptance blockers alongside the newly requested B1–B6 baseline work before reviewing
51
+ official 1.0. The 2.0 platform plan remains a separate future direction.
45
52
 
46
53
  The maintainer reported SHACL pushing generation past a 30-minute timeout before graph
47
54
  publication. T02 and the focused T05 optimization shipped together in 0.3.0 through
@@ -73,7 +80,7 @@ snapshots retain their full configuration identity. Exact legacy reads and expli
73
80
  adoption preserve prior artifacts; custom providers remain conservative.
74
81
  [T04 diagnostics](ADR-019-semantic-failure-diagnostics.md) shipped in the same release, adding
75
82
  safe failure reports, opaque source mapping and settled progress without changing extraction/cache
76
- identity. T05 engineering evaluation is recorded; T06 and T07 implementation are pending candidate publication.
83
+ identity. T05 engineering evaluation is recorded; T06 and T07 shipped in the 0.6.0 candidate.
77
84
 
78
85
  [T08 physical-file kind consistency](ADR-020-canonical-physical-file-producers.md) also shipped in
79
86
  0.4.0 after local/hosted Ubuntu/Windows checks, independent archive review and fresh packed and
@@ -8,6 +8,84 @@ The milestone entries below record the original cloud checks. Subsequent
8
8
  establishes live Codex success on Windows and the full deterministic checks on WSL,
9
9
  while identifying remaining native Windows issues.
10
10
 
11
+ ## Physical artifact filename fix, 2026-10-28
12
+
13
+ The consumer requested bounded physical artifact/temp names while retaining logical snapshot
14
+ identity and provenance. [ADR 028](ADR-028-bounded-artifact-paths.md) records the fix and migration
15
+ boundary. The public traversal → unchanged repeat → clean-comparison regression reproduced an
16
+ overlong SCIP staging basename before the change and passes locally after it. Physical names are
17
+ bounded; full IDs, cited facts, cache keys and content digests remain unchanged. Legacy saved files
18
+ remain readable and immutable. The same traversal test and added storage cases run in native
19
+ Windows CI. Local release checks passed: build, 698 deterministic tests (17 core + 681 toolkit;
20
+ one optional OML integration skipped), architecture with 14 advisory findings, inventory,
21
+ licenses and fresh packed-consumer smoke. Hosted outcomes and patch publication are pending
22
+ at this source revision.
23
+
24
+ This is a focused consumer blocker ahead of [B1–B6](PRE-1.0-BASELINE.md). No private consumer
25
+ rerun, paid/model work or live optional OML compilation is claimed.
26
+
27
+ ## Business-context baseline assessment, 2026-10-28
28
+
29
+ The maintainer requested checks for business relationships across asynchronous/stored-data
30
+ boundaries, progressive agent exploration and multiple service/client projects in a monorepo.
31
+ [The assessment and new task list](PRE-1.0-BASELINE.md) explicitly extend the original T01–T10
32
+ scope; the historical completion statements below concern that original list.
33
+
34
+ Against unchanged runtime at `9b4acffe1c4d35f9fd2f91132c576f8934658677`, 24 existing focused
35
+ tests and three new public acceptance tests pass on Linux, Node 24.19.0 / pnpm 10.18.2.
36
+ [Recorded results](assessments/pre-1.0-2026-10-28.json) identify test files, cases, source hashes
37
+ and commands. The new fixture uses real Git, SCIP, semantic-provider plumbing, RDF/SHACL and
38
+ the application/MCP facade. Its small deterministic prose parser is not a live model.
39
+
40
+ The control already reads the two disconnected services' documents. Adding only a documented
41
+ stored-data handoff makes downstream implementations and tests reachable while retaining both
42
+ freshness rules and excluding a same-label unrelated domain. One changed document is extracted,
43
+ four are reused; the next repeat reuses all five with unchanged identity/content. Small result
44
+ pages exhaust to the larger scan exactly; focused follow-up works and depth truncation stays
45
+ explicit. Workspace aliases resolve a shared re-exported contract across API and TSX files.
46
+
47
+ These are mechanism passes. They do not establish actual broker/database delivery, automatic
48
+ rule compatibility or function binding, autonomous-agent usefulness, Expo/service builds, live
49
+ semantic quality or private TradePilot acceptance. Exact-node exploration remains open.
50
+ Graphify source/document review is pinned in [the evaluation note](GRAPHIFY-EVALUATION.md);
51
+ no comparative benchmark, new runtime dependency or backend replacement is claimed.
52
+
53
+ ## Published 0.6.0 acceptance candidate, 2026-10-28
54
+
55
+ Both `@weftlet/core@0.6.0` and `@weftlet/toolkit@0.6.0` are published and were verified as
56
+ the registry `latest` versions. [Release PR 36](https://github.com/jchewitt/weftlet/pull/36)
57
+ merged at `b4c808b9221c5c82f9f7326a310e966d1fee2888`; package versions were committed to main
58
+ before publication. [Release run 40742010093](https://github.com/jchewitt/weftlet/actions/runs/40742010093)
59
+ completed preparation, both trusted npm uploads and GitHub release records on its first attempt.
60
+ No npm token was supplied to this cloud. Public provenance statements and both package-specific
61
+ Git tags identify that exact source commit; both GitHub Releases exist.
62
+
63
+ The version PR's exact head `944b66a7ac9d119b650b7341dc982e12ea45a75b` passed
64
+ [hosted Ubuntu and Windows checks](https://github.com/jchewitt/weftlet/actions/runs/40715307427).
65
+ Frozen local installation/build, package preparation and dry runs passed before merging. Reviewed
66
+ exports contain 13 files in core and 252 in toolkit, including applicable license notices and no
67
+ source history, credentials, caches or native benchmark binary. All 79 original source path/hash
68
+ pairs remain intact. Downloaded public npm archives match the reviewed local archives and the
69
+ workflow's prepared archives byte for byte:
70
+
71
+ | Package | Verified SHA-512 integrity |
72
+ | --- | --- |
73
+ | `@weftlet/core@0.6.0` | `sha512-2o2WO4DyhudgcsGQ//j0mXfXBvyqBHoYPnI52ZiqZSr5qqjCayw7njsRqCxOEIL6dseUYoICsnlkSYrRSDHKKw==` |
74
+ | `@weftlet/toolkit@0.6.0` | `sha512-d7Q9gNdpwWUdkJLhGtY6xpi+gfg3CsLM5BqJqmVH9xgNwtc5e5kDpTwMSv4jq/+gybiXbQOOSsI7x7c+m1W1xA==` |
75
+
76
+ A fresh public-registry consumer on Linux / Node 24.19.0 installed both exact versions, ran the
77
+ documented npx initialization and config validation, imported public APIs, checked canonical file
78
+ nodes, lossless RDF projection, SPARQL and positive/negative strict SHACL, and initialized MCP.
79
+ `impact.scan` discovery and honest missing-snapshot reporting passed without model calls. This
80
+ registry smoke is separate from the release gate's full deterministic/packed-consumer checks;
81
+ neither is a private TradePilot hydration, live model-quality evaluation or browser interaction.
82
+
83
+ T06, T07 and T10 are now available in the published candidate, alongside the T05 evaluation and
84
+ earlier fixes. The planned 1.0 engineering work is complete. TradePilot should use these published
85
+ versions for the [consumer acceptance checklist](RELEASE-1.0-PLAN.md#official-10-acceptance);
86
+ official 1.0 remains conditional on that acceptance and any resulting blocker fixes. Previously
87
+ tentative browser/live-auth work remains explicitly separate. No 1.0 release is claimed.
88
+
11
89
  ## T05 validation closeout, 2026-10-28
12
90
 
13
91
  [ADR 027](ADR-027-validation-closeout.md) records the engineering decision to retain full direct
@@ -0,0 +1,200 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "date": "2026-10-28",
4
+ "runtimeSourceCommit": "9b4acffe1c4d35f9fd2f91132c576f8934658677",
5
+ "releaseSourceCommit": "b4c808b9221c5c82f9f7326a310e966d1fee2888",
6
+ "packageVersions": {
7
+ "@weftlet/core": "0.6.0",
8
+ "@weftlet/toolkit": "0.6.0"
9
+ },
10
+ "environment": {
11
+ "os": "Linux",
12
+ "node": "24.19.0",
13
+ "pnpm": "10.18.2"
14
+ },
15
+ "fixtureProvider": {
16
+ "path": "tests/fixtures/business-context-provider.mjs",
17
+ "sha256": "4261c3261ca2959c89bdec73eda0f6aa5c40ffcb75db4aa64442f67534d8b2f7",
18
+ "mode": "deterministic public prose grammar; no model requests"
19
+ },
20
+ "boundaries": [
21
+ "New test files use unchanged runtime from the recorded source commit.",
22
+ "Real Git and TypeScript SCIP; actual application hydration, RDF/SHACL and MCP facade.",
23
+ "No live provider, actual broker/database execution, service build or private consumer acceptance.",
24
+ "No automatic business compatibility verdict or exact-function binding established.",
25
+ "No autonomous agent trial or new MCP transport exercise.",
26
+ "Graphify source review is separate; no comparative execution."
27
+ ],
28
+ "runs": [
29
+ {
30
+ "name": "existing-regressions",
31
+ "command": "pnpm exec vitest run tests/rdf.test.ts tests/routing.test.ts src/extraction/routing.test.ts src/extraction/scip-project.test.ts src/graph/query.test.ts",
32
+ "success": true,
33
+ "passed": 24,
34
+ "failed": 0,
35
+ "pending": 0,
36
+ "suites": [
37
+ {
38
+ "path": "tests/rdf.test.ts",
39
+ "sha256": "2b0f0fd6314ac28d4c64422d5650d56b540c9d391adab5eac0d24ed06a592397",
40
+ "status": "passed",
41
+ "cases": [
42
+ {
43
+ "name": "unified evidence graph extracts public prose and real TypeScript across queue boundaries, with SPARQL/projection equivalence",
44
+ "status": "passed"
45
+ }
46
+ ]
47
+ },
48
+ {
49
+ "path": "tests/routing.test.ts",
50
+ "sha256": "bac6081701ada81f422e1b7641a212a3f51b0c44a94bc88deb93d610b4a65c34",
51
+ "status": "passed",
52
+ "cases": [
53
+ {
54
+ "name": "committed routing declarations in independent repositories links a typed upstream change across an explicit boundary without shared-channel cross products",
55
+ "status": "passed"
56
+ },
57
+ {
58
+ "name": "committed routing declarations in independent repositories replaces routing edges for source renames/deletions and routing-manifest edits/deletions in drafts",
59
+ "status": "passed"
60
+ },
61
+ {
62
+ "name": "committed routing declarations in independent repositories preserves the last valid saved graph when a committed routing manifest is malformed or absent",
63
+ "status": "passed"
64
+ }
65
+ ]
66
+ },
67
+ {
68
+ "path": "src/extraction/routing.test.ts",
69
+ "sha256": "7b72aefa770bd217435220fa85bf21d5297e01cbf5e23d3765aed549b9300681",
70
+ "status": "passed",
71
+ "cases": [
72
+ {
73
+ "name": "committed routing declarations joins document, test and production endpoints with actual neutral file and document facts",
74
+ "status": "passed"
75
+ },
76
+ {
77
+ "name": "committed routing declarations extracts exact cited bindings with inferred authority while ignoring dirty declarations",
78
+ "status": "passed"
79
+ },
80
+ {
81
+ "name": "committed routing declarations keeps binding, scope, case and repository identities separate despite equal channel labels",
82
+ "status": "passed"
83
+ },
84
+ {
85
+ "name": "committed routing declarations suppresses every duplicate scoped binding across files, including identical duplicates",
86
+ "status": "passed"
87
+ },
88
+ {
89
+ "name": "committed routing declarations does not guess case, extensions or directories, and suppresses the complete missing-endpoint pair",
90
+ "status": "passed"
91
+ },
92
+ {
93
+ "name": "committed routing declarations reads Unicode and spaced paths exactly from a nested repository root despite Git quoting",
94
+ "status": "passed"
95
+ },
96
+ {
97
+ "name": "committed routing declarations accepts executable blobs but rejects committed symlink modes without creating host symlinks",
98
+ "status": "passed"
99
+ },
100
+ {
101
+ "name": "committed routing declarations invalidates deleted or renamed endpoints until the mapping is updated, leaving historical results intact",
102
+ "status": "passed"
103
+ },
104
+ {
105
+ "name": "committed routing declarations fails closed on missing source files except explicit draft deletion diagnostics",
106
+ "status": "passed"
107
+ },
108
+ {
109
+ "name": "committed routing declarations rejects malformed, ambiguous and unsupported schemas or path forms",
110
+ "status": "passed"
111
+ },
112
+ {
113
+ "name": "committed routing declarations enforces file-count, combined declaration-count and source-byte bounds",
114
+ "status": "passed"
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "path": "src/extraction/scip-project.test.ts",
120
+ "sha256": "8a92ffd963ca5818c102aec3487ea21405d75bbaf593b13e2256b6f5a1914b23",
121
+ "status": "passed",
122
+ "cases": [
123
+ {
124
+ "name": "links committed workspace contracts and excluded tests through real SCIP, preserving dirty bytes and rename/delete boundaries",
125
+ "status": "passed"
126
+ },
127
+ {
128
+ "name": "fails before indexing on absent aliases, empty/oversized scopes and reserved generated paths",
129
+ "status": "passed"
130
+ }
131
+ ]
132
+ },
133
+ {
134
+ "path": "src/graph/query.test.ts",
135
+ "sha256": "7b6653f767c2e7445ec19f0cafc9d3fe97494ae139835ec63d335a7210e62c6c",
136
+ "status": "passed",
137
+ "cases": [
138
+ {
139
+ "name": "impact scan facade rejects snapshot traversal before the service can read outside snapshot storage",
140
+ "status": "passed"
141
+ },
142
+ {
143
+ "name": "impact scan facade returns the same bounded Context Pack through the application service used by CLI and MCP",
144
+ "status": "passed"
145
+ },
146
+ {
147
+ "name": "impact scan facade keeps skill command names aligned with the MCP facade and generic template",
148
+ "status": "passed"
149
+ },
150
+ {
151
+ "name": "impact scan facade expands changed code files through symbols without traversing the project hub",
152
+ "status": "passed"
153
+ },
154
+ {
155
+ "name": "impact scan facade returns the broader Fulfillment policy, PM, execution, worker, and validation purpose chain",
156
+ "status": "passed"
157
+ },
158
+ {
159
+ "name": "impact scan facade uses the owner document as the traversal anchor and task terms to rank connected context",
160
+ "status": "passed"
161
+ },
162
+ {
163
+ "name": "impact scan facade shows observed runtime behavior beside declared intent and flags unmapped observations",
164
+ "status": "passed"
165
+ }
166
+ ]
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "name": "business-context-acceptance",
172
+ "command": "pnpm exec vitest run tests/business-context-acceptance.test.ts",
173
+ "success": true,
174
+ "passed": 3,
175
+ "failed": 0,
176
+ "pending": 0,
177
+ "suites": [
178
+ {
179
+ "path": "tests/business-context-acceptance.test.ts",
180
+ "sha256": "c5e196db080cc798dc3abb21fb2cdb4ac3ecb07b4307cc3aa6764f04f60bb9cb",
181
+ "status": "passed",
182
+ "cases": [
183
+ {
184
+ "name": "public business-context acceptance boundaries bridges isolated service code only after the stored-data handoff is documented, retaining both rules and authority",
185
+ "status": "passed"
186
+ },
187
+ {
188
+ "name": "public business-context acceptance boundaries supports bounded MCP-facade pagination and focused follow-up without hiding depth exhaustion",
189
+ "status": "passed"
190
+ },
191
+ {
192
+ "name": "public business-context acceptance boundaries resolves shared contracts across separate workspace packages and TSX, with source and repeat identity intact",
193
+ "status": "passed"
194
+ }
195
+ ]
196
+ }
197
+ ]
198
+ }
199
+ ]
200
+ }
@@ -108,7 +108,7 @@
108
108
  "destinationPath": "package.json",
109
109
  "sourceSha256": "a575dbb2fed8c554b95e8e9b3e03a0c21cab1be7249860bbebc18e046b2ff78d",
110
110
  "modified": true,
111
- "destinationSha256": "f7da7073324381a463ddef7bbe1bbffa7f8ff3426b8738420cd41596d0f48332"
111
+ "destinationSha256": "86942a3aa4159f35199b68ebda97fb6998cd42491f724c6cfcf6ac3121ea243a"
112
112
  },
113
113
  {
114
114
  "sourcePath": "tools/context-graph/packages/core/LICENSE",
@@ -129,7 +129,7 @@
129
129
  "destinationPath": "packages/core/README.md",
130
130
  "sourceSha256": "6044bf7b9a3dc793f41e2ff048546ed11938957d10a5b143eb1739ac4cd7477c",
131
131
  "modified": true,
132
- "destinationSha256": "93afe33e737bc8f1d01d53361f6f4ef4b2856be6c2e977f3c3a494bedd2229bf"
132
+ "destinationSha256": "2fc3c2eedee047c100d9ea6b9b185ca9da18909549016e23a1f5359c458beb72"
133
133
  },
134
134
  {
135
135
  "sourcePath": "tools/context-graph/packages/core/THIRD_PARTY_NOTICES.md",
@@ -143,7 +143,7 @@
143
143
  "destinationPath": "packages/core/package.json",
144
144
  "sourceSha256": "2a29066eb8452f22fafcb06bb035a84dda93c5705dba32aba600a1b7e5aaf19c",
145
145
  "modified": true,
146
- "destinationSha256": "b8fe4bb56bdce5da3c5b09c281c185c836a17be941fa406482b2835d83c77467"
146
+ "destinationSha256": "030ba1501e8a94449494dfd28a3ee04333d3410a7437f681a6d1ebf698d0c63e"
147
147
  },
148
148
  {
149
149
  "sourcePath": "tools/context-graph/packages/core/src/core.ts",
@@ -367,7 +367,7 @@
367
367
  "destinationPath": "src/extraction/ontology.ts",
368
368
  "sourceSha256": "800fd0a0f8d7e43dcc598a168640563e26919fa2f1fcc871f0a842510b78f319",
369
369
  "modified": true,
370
- "destinationSha256": "912041a3148f7bbc005218c4b70d331406b656d4e751555b32fa4fb04b859bdd"
370
+ "destinationSha256": "4e52ee6a41192ae60f98ada522f27668115e145525c7afb6ec373b034c902f24"
371
371
  },
372
372
  {
373
373
  "sourcePath": "tools/context-graph/src/portable-fixture.test.ts",
@@ -479,14 +479,14 @@
479
479
  "destinationPath": "src/extraction/static.ts",
480
480
  "sourceSha256": "f8dcff3e10361314c06911dc7cec1e2cb0f8d9af68a6c61a30b2a741c5c3a385",
481
481
  "modified": true,
482
- "destinationSha256": "99147784d567ff9ccf2619a5452824fb13dc7b8061fc269c1fc90b36cdd96851"
482
+ "destinationSha256": "93dac6495ebe45baec5022aabf5c8515b1af3e6e64ec9e1be752220765662e7f"
483
483
  },
484
484
  {
485
485
  "sourcePath": "tools/context-graph/src/storage.ts",
486
486
  "destinationPath": "src/storage/storage.ts",
487
487
  "sourceSha256": "9e38af8e34dc84ccaed5322b37b485e60706c68542271926228fb6d4af3d1f71",
488
488
  "modified": true,
489
- "destinationSha256": "48a4eabe1954f612b1d27f2ac56cb63ae064b0b957570c25c349154adfc2d34d"
489
+ "destinationSha256": "82945a91cc1e02970225e7f9247ee1e3526754462d0f29607a6543c9f07f1619"
490
490
  },
491
491
  {
492
492
  "sourcePath": "tools/context-graph/src/telemetry.test.ts",
@@ -620,11 +620,14 @@
620
620
  "docs/ADR-025-document-classification.md",
621
621
  "docs/ADR-026-traversal-hydration.md",
622
622
  "docs/ADR-027-validation-closeout.md",
623
+ "docs/ADR-028-bounded-artifact-paths.md",
623
624
  "docs/CLOUD-ENVIRONMENT.md",
624
625
  "docs/CONSUMER-TRIAL.md",
625
626
  "docs/ENVIRONMENT-VALIDATION.md",
627
+ "docs/GRAPHIFY-EVALUATION.md",
626
628
  "docs/IMPACT-EVALUATION.md",
627
629
  "docs/MIGRATING-TO-WEFTLET.md",
630
+ "docs/PRE-1.0-BASELINE.md",
628
631
  "docs/PROVIDERS.md",
629
632
  "docs/RELEASE-1.0-PLAN.md",
630
633
  "docs/RELEASING.md",
@@ -635,6 +638,7 @@
635
638
  "docs/WEFTLET-2.0-PLAN.md",
636
639
  "docs/architecture-baseline.json",
637
640
  "docs/architecture-policy.md",
641
+ "docs/assessments/pre-1.0-2026-10-28.json",
638
642
  "docs/benchmarks/validation-2026-10-28/README.md",
639
643
  "docs/benchmarks/validation-2026-10-28/large.json",
640
644
  "docs/benchmarks/validation-2026-10-28/lifecycle.json",
@@ -826,6 +830,7 @@
826
830
  "src/graph/rdf.ts",
827
831
  "src/graph/shacl-shapes.ts",
828
832
  "src/graph/validation-progress.ts",
833
+ "src/infrastructure/artifact-paths.ts",
829
834
  "src/infrastructure/module-resolution.ts",
830
835
  "src/interfaces/cache-adoption.test.ts",
831
836
  "src/interfaces/doctor.ts",
@@ -841,16 +846,19 @@
841
846
  "src/repository/git-entries.test.ts",
842
847
  "src/repository/working-content.test.ts",
843
848
  "src/repository/working-content.ts",
849
+ "src/storage/artifact-paths.test.ts",
844
850
  "src/storage/atomic-rename.test.ts",
845
851
  "src/storage/atomic-rename.ts",
846
852
  "src/telemetry.ts",
847
853
  "src/visualization/viewer-interaction.ts",
848
854
  "tests/architecture.test.ts",
855
+ "tests/business-context-acceptance.test.ts",
849
856
  "tests/cache-adoption.test.ts",
850
857
  "tests/document-coverage.test.ts",
851
858
  "tests/document-evidence.test.ts",
852
859
  "tests/document-source-rdf.test.ts",
853
860
  "tests/extractor-compatibility.test.ts",
861
+ "tests/fixtures/business-context-provider.mjs",
854
862
  "tests/fixtures/shacl.ts",
855
863
  "tests/fixtures/traversal.ts",
856
864
  "tests/hydration-failure.test.ts",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weftlet/toolkit",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Evidence-backed context graphs for AI development agents: product intent, contracts, code, tests and runtime behavior",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -63,7 +63,7 @@
63
63
  "n3": "2.7.2",
64
64
  "rdf-validate-shacl": "0.6.5",
65
65
  "sparqljs": "3.7.4",
66
- "@weftlet/core": "^0.6.0"
66
+ "@weftlet/core": "^0.6.1"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@changesets/cli": "3.0.3",