@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 +1 -1
- package/dist/extraction/ontology.js +2 -2
- package/dist/extraction/static.js +25 -20
- package/dist/infrastructure/artifact-paths.d.ts +4 -0
- package/dist/infrastructure/artifact-paths.js +14 -0
- package/dist/storage/storage.js +41 -13
- package/docs/ADR-028-bounded-artifact-paths.md +58 -0
- package/docs/CONSUMER-TRIAL.md +6 -4
- package/docs/GRAPHIFY-EVALUATION.md +70 -0
- package/docs/PRE-1.0-BASELINE.md +94 -0
- package/docs/RELEASE-1.0-PLAN.md +25 -15
- package/docs/RELEASING.md +3 -3
- package/docs/ROADMAP.md +18 -11
- package/docs/VALIDATION.md +78 -0
- package/docs/assessments/pre-1.0-2026-10-28.json +200 -0
- package/docs/extraction-manifest.json +14 -6
- package/package.json +2 -2
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.
|
|
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-${
|
|
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-${
|
|
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 =
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
...
|
|
45
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
await
|
|
51
|
-
|
|
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
|
+
}
|
package/dist/storage/storage.js
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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 =
|
|
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
|
|
95
|
+
return readWithLegacyPath(snapshotPath(this.root, snapshotId), snapshotPath(this.root, snapshotId, true));
|
|
77
96
|
}
|
|
78
97
|
async readHead(headName) {
|
|
79
|
-
const
|
|
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
|
|
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
|
|
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 =
|
|
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.
|
package/docs/CONSUMER-TRIAL.md
CHANGED
|
@@ -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,
|
|
138
|
-
`storagePath` is `.context-graph`.
|
|
139
|
-
|
|
140
|
-
|
|
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.
|
package/docs/RELEASE-1.0-PLAN.md
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# Consumer hardening and the 1.0 release plan
|
|
2
2
|
|
|
3
|
-
Status:
|
|
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
|
|
16
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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 | **
|
|
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 | **
|
|
59
|
-
| **T07** | Coverage-aware traversal from SOT/roadmap entry points | **
|
|
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
|
|
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
|
|
101
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
206
|
-
npx --yes @weftlet/toolkit@0.6.
|
|
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.
|
|
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-
|
|
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.
|
|
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)
|
|
24
|
-
|
|
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).
|
|
36
|
-
T10 [implementation coverage reporting](ADR-024-implementation-coverage.md)
|
|
37
|
-
|
|
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.
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
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
|
package/docs/VALIDATION.md
CHANGED
|
@@ -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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
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.
|
|
66
|
+
"@weftlet/core": "^0.6.1"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
69
|
"@changesets/cli": "3.0.3",
|