@surlymochan/evalid 0.5.3 → 0.5.5
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/CHANGELOG.md +17 -0
- package/RELEASE_NOTES.md +18 -0
- package/docs/launch-dossier.md +2 -2
- package/package.json +1 -1
- package/src/agent_team/common.js +0 -26
- package/src/core/pending-gates.js +0 -9
- package/src/core/phase-run-read.js +0 -6
- package/src/core/workflow-loader.js +0 -10
- package/src/index.js +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ All notable changes to this project are documented here. Detailed notes live in
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.5.5] - 2026-11-07
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **Missing package main entry `src/index.js` (#46)**: the published package had no main entry file, so `import '@surlymochan/evalid'` / `require('@surlymochan/evalid')` could not resolve. The entry module is added and pinned by `test/package-entry.test.js`.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- **Dead code removed (#47)**: `writePlanMarkdown` (+ its only caller `buildPlanCommands`), `readPendingGate`, `getLatestMissionSession`, and `resolveAtom` — 51 lines deleted, 0 added. Each was verified dead by repo-wide grep (src, bin, test, docs, scripts, including string-form references): only the definition site remained, with no documentation references. None of the four was part of the public `src/index.js` export surface. Test evidence: full `npm run verify` exit 0 on the merged tree.
|
|
15
|
+
|
|
16
|
+
Acceptance debt, stated plainly: the bench-number acceptance for P1-2 / P1-3 / P2-1 / P2-3 still awaits the MiniMax full-matrix batch (15 instances × 4 arms × reps 3), which is running — no bench numbers are claimed in this release.
|
|
17
|
+
|
|
18
|
+
## [0.5.4] - 2026-11-07
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- **Phase-cost drift test stops flaking under load (#44, issue #5 P1-1)**: the two `within_tolerance` integration tests used 2 x 400 ms sleeps, so the 5% drift budget was 40 ms against tens of ms of fixed executor overhead outside phases (run setup plus `phase_completed` log / state writes). On main this tripped at 5.7% drift while the MiniMax batch was running, then the same file went 7/7 green on a quiet re-run — a load-dependent flake at a marginal threshold, not an accounting bug (the accounting correctly flagged the drift). The sleeps are now 2 x 1500 ms, putting the same overhead at ~2% of the phase sum with headroom under load. Production tolerance and accounting unchanged. Test evidence: `node test/phase-cost.test.js` 7/7 green; full `npm run verify` exit 0 (43 files, 361 tests, 360 pass, 1 skipped pre-existing, 0 fail).
|
|
22
|
+
|
|
23
|
+
Acceptance debt, stated plainly: the bench-number acceptance for P1-2 / P1-3 / P2-1 / P2-3 still awaits the MiniMax full-matrix batch (15 instances × 4 arms × reps 3), which is running — no bench numbers are claimed in this release.
|
|
24
|
+
|
|
8
25
|
## [0.5.3] - 2026-11-07
|
|
9
26
|
|
|
10
27
|
### Fixed
|
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## 0.5.5 - Package entry restored; dead code removed
|
|
4
|
+
|
|
5
|
+
Patch release. Two small fixes since 0.5.4, both verified by the full test suite (`npm run verify` exit 0 on the merged tree).
|
|
6
|
+
|
|
7
|
+
**Missing package main entry (#46).** The published package had no main entry file, so importing the package by name could not resolve. `src/index.js` is now present as the package entry and is pinned by `test/package-entry.test.js`.
|
|
8
|
+
|
|
9
|
+
**Dead code removed (#47).** Four exported functions with zero callers are deleted (51 lines, 0 added): `writePlanMarkdown` (plus `buildPlanCommands`, which only it called), `readPendingGate`, `getLatestMissionSession`, and `resolveAtom`. Each was verified dead by repo-wide grep across src, bin, test, docs, and scripts, including string-form references — only the definition site remained in every case. None of the four was exported from the public `src/index.js` surface, so this is not a public API change. The modules themselves stay: their other exports (`load` / `dryRun`, `listPendingGates` / `ackPendingGate`, `getLatestPhaseRun`, `writeReviewArtifact`) are still used.
|
|
10
|
+
|
|
11
|
+
Acceptance debt, stated plainly: the bench-number acceptance for P1-2, P1-3, P2-1 and P2-3 — the wall-clock/token/resolved lines from issue #5 — still awaits the MiniMax full-matrix batch (15 instances × 4 arms × reps 3), which is running. No bench numbers are claimed in this release.
|
|
12
|
+
|
|
13
|
+
## 0.5.4 - Phase-cost drift test stops flaking under load
|
|
14
|
+
|
|
15
|
+
Patch release. One test-only fix: `npm run verify` was red on main because the phase-cost drift test tripped its 5% bound at 5.7% while the MiniMax batch was running, then went 7/7 green on a quiet re-run of the same file.
|
|
16
|
+
|
|
17
|
+
**Longer sleeps in the drift tests (#44, issue #5 P1-1).** The two `within_tolerance` integration tests used 2 x 400 ms sleeps, so the 5% budget was 40 ms against tens of ms of fixed executor overhead that structurally sits outside phases (run setup plus the `phase_completed` log / state writes between phases). The sleeps are now 2 x 1500 ms, putting the same overhead at ~2% of the phase sum with headroom under load. The production tolerance (`PHASE_COST_TOLERANCE_PCT = 5`) and the accounting in `src/core/phase-cost.js` / `workflow-executor.js` are unchanged — the accounting behaved correctly by flagging real overhead. Test evidence (from the PR): `node test/phase-cost.test.js` 7/7 green; full `npm run verify` exit 0 (43 files, 361 tests, 360 pass, 1 skipped pre-existing, 0 fail).
|
|
18
|
+
|
|
19
|
+
Acceptance debt, stated plainly: the bench-number acceptance for P1-2, P1-3, P2-1 and P2-3 — the wall-clock/token/resolved lines from issue #5 — still awaits the MiniMax full-matrix batch (15 instances × 4 arms × reps 3), which is running. No bench numbers are claimed in this release.
|
|
20
|
+
|
|
3
21
|
## 0.5.3 - Bench planner stops timing out and stops wandering
|
|
4
22
|
|
|
5
23
|
Patch release. Two bench-harness fixes from the MiniMax pilot, both pinned by tests rather than by a live run.
|
package/docs/launch-dossier.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# evalid Launch Dossier
|
|
2
2
|
|
|
3
|
-
Generated: 2026-11-
|
|
3
|
+
Generated: 2026-11-07T11:18:35.000Z
|
|
4
4
|
Mode: post_publish
|
|
5
5
|
Verdict: conditionally ready: engine and adoption evidence are strong, registry publication remains required for a splash launch
|
|
6
6
|
Launch ready: not yet
|
|
@@ -117,7 +117,7 @@ Evidence:
|
|
|
117
117
|
- Adoption records: 1; status: pass
|
|
118
118
|
- Goal audit: pass; goal: Keep evalid credible as an open-source agent delivery runtime: repo-owned workflow contracts, executable verification gates, durable project context, and honest benchmark evidence.
|
|
119
119
|
- Package evidence: missing; source: registry_json
|
|
120
|
-
- Package name/version: @surlymochan/evalid@0.5.
|
|
120
|
+
- Package name/version: @surlymochan/evalid@0.5.5
|
|
121
121
|
|
|
122
122
|
## Passing Evidence
|
|
123
123
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@surlymochan/evalid",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "Claimed != verified: a runtime verification layer for coding agents. It seals each test run and replays it from a clean snapshot, with a zero-judge gate pipeline (spec clarification, code review, TDD proof) and the xflow CLI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-agents",
|
package/src/agent_team/common.js
CHANGED
|
@@ -271,32 +271,6 @@ export async function synthesizePhaseArtifact(input = {}, context = {}, options
|
|
|
271
271
|
};
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
-
export function buildPlanCommands(projectRoot) {
|
|
275
|
-
const packageJsonPath = resolve(projectRoot, 'package.json');
|
|
276
|
-
const packageJson = readJsonFile(packageJsonPath, null);
|
|
277
|
-
if (packageJson?.scripts?.test) {
|
|
278
|
-
return ['npm test'];
|
|
279
|
-
}
|
|
280
|
-
return ['echo "no test script configured"'];
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
export function writePlanMarkdown(projectRoot, changeId, phase = 'plan') {
|
|
284
|
-
const commands = buildPlanCommands(projectRoot);
|
|
285
|
-
const mdPath = resolveChangePath(projectRoot, changeId, `${phase}.md`);
|
|
286
|
-
const lines = [
|
|
287
|
-
'# Plan',
|
|
288
|
-
'',
|
|
289
|
-
'## Verification',
|
|
290
|
-
'',
|
|
291
|
-
'```bash',
|
|
292
|
-
...commands,
|
|
293
|
-
'```',
|
|
294
|
-
'',
|
|
295
|
-
];
|
|
296
|
-
writeTextFile(mdPath, lines.join('\n'));
|
|
297
|
-
return mdPath;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
274
|
export function writeReviewArtifact(projectRoot, changeId, summary, findings = []) {
|
|
301
275
|
const outputPath = resolveChangePath(projectRoot, changeId, 'review.json');
|
|
302
276
|
writeJsonFile(outputPath, {
|
|
@@ -34,15 +34,6 @@ export function listPendingGates(projectRoot = process.cwd()) {
|
|
|
34
34
|
.sort((left, right) => String(right.created_at || '').localeCompare(String(left.created_at || '')));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
export function readPendingGate(projectRoot = process.cwd(), phase) {
|
|
38
|
-
const gateFile = resolve(resolvePendingGatesDir(projectRoot), `${phase}.json`);
|
|
39
|
-
if (!existsSync(gateFile)) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
const gate = readGateFile(gateFile);
|
|
43
|
-
return gate ? { ...gate, gate_file: gateFile } : null;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
37
|
export function ackPendingGate(projectRoot = process.cwd(), phase, options = {}) {
|
|
47
38
|
const gateFile = resolve(resolvePendingGatesDir(projectRoot), `${phase}.json`);
|
|
48
39
|
if (!existsSync(gateFile)) {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { listPhaseRunSessions } from './mission-state.js';
|
|
2
|
-
|
|
3
1
|
function ensureArray(value) {
|
|
4
2
|
return Array.isArray(value) ? value : [];
|
|
5
3
|
}
|
|
@@ -21,7 +19,3 @@ export function getLatestPhaseEntry(phaseRun, phase) {
|
|
|
21
19
|
const entries = ensureArray(phaseRun.phases).filter((entry) => entry.phase === phase);
|
|
22
20
|
return entries.sort((left, right) => String(right.updated_at || '').localeCompare(String(left.updated_at || '')))[0] || null;
|
|
23
21
|
}
|
|
24
|
-
|
|
25
|
-
export function getLatestMissionSession(state, missionId) {
|
|
26
|
-
return listPhaseRunSessions(state, missionId)[0] || null;
|
|
27
|
-
}
|
|
@@ -151,13 +151,3 @@ export function dryRun(workflowPath, input = {}) {
|
|
|
151
151
|
|
|
152
152
|
return { workflow, phases };
|
|
153
153
|
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Resolve a single atom from the registry to its invocation descriptor.
|
|
157
|
-
* Used by the execution layer to dispatch atoms.
|
|
158
|
-
*/
|
|
159
|
-
export function resolveAtom(atomId, registry) {
|
|
160
|
-
const def = registry.atoms[atomId];
|
|
161
|
-
if (!def) throw new Error(`Unknown atom: ${atomId}`);
|
|
162
|
-
return { ...def, id: atomId };
|
|
163
|
-
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic entry point for @surlymochan/evalid.
|
|
3
|
+
*
|
|
4
|
+
* This is the file package.json "main" points to. It used to not exist at
|
|
5
|
+
* all, so `import '@surlymochan/evalid'` / `require('@surlymochan/evalid')`
|
|
6
|
+
* failed with MODULE_NOT_FOUND even though the published tarball shipped
|
|
7
|
+
* "main": "src/index.js". The package is CLI-first (bin: xflow), but the
|
|
8
|
+
* control-plane server is the one documented programmatic surface, so this
|
|
9
|
+
* module re-exports its starter. Importing this module has no side effects:
|
|
10
|
+
* it does not start a server.
|
|
11
|
+
*/
|
|
12
|
+
export { default, default as startServer } from './server.js';
|