instar 1.3.196 → 1.3.197
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +12 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/AgentRegistry.d.ts +15 -0
- package/dist/core/AgentRegistry.d.ts.map +1 -1
- package/dist/core/AgentRegistry.js +26 -2
- package/dist/core/AgentRegistry.js.map +1 -1
- package/package.json +1 -1
- package/scripts/validate-retro-harvest.mjs +272 -0
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.197.md +24 -0
- package/upgrades/side-effects/APPRENTICESHIP-STEP0-RETRO-HARVEST-SPEC.md +78 -0
- package/upgrades/side-effects/fix-fetch-blocked-ports.md +74 -0
|
@@ -14,6 +14,21 @@
|
|
|
14
14
|
* Agent names are display labels only — NOT unique.
|
|
15
15
|
*/
|
|
16
16
|
import type { AgentRegistry, AgentRegistryEntry, AgentType, AgentStatus } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* WHATWG Fetch "bad ports" — node's global `fetch` (undici) throws
|
|
19
|
+
* `TypeError: fetch failed { cause: 'bad port' }` for any URL on one of these
|
|
20
|
+
* ports. Instar's multi-machine mesh does ALL of its cross-machine I/O over node
|
|
21
|
+
* fetch (pairing `POST /api/pair`, lease broadcast/pull, heartbeat), so an agent
|
|
22
|
+
* whose server lands on a blocked port is SILENTLY unreachable over the mesh —
|
|
23
|
+
* curl works (it ignores the blocklist), so the failure is invisible. Observed
|
|
24
|
+
* live 2026-06-02: a paired test agent on port 4045 (NFS `lockd`, on this list)
|
|
25
|
+
* could never be joined ("fetch failed: bad port") despite curl reaching it. The
|
|
26
|
+
* default allocation range (4040–4099) contains 4045, so the allocator MUST skip
|
|
27
|
+
* these. Source: the WHATWG Fetch spec "bad ports" table.
|
|
28
|
+
*/
|
|
29
|
+
export declare const FETCH_BLOCKED_PORTS: ReadonlySet<number>;
|
|
30
|
+
/** True if `port` is on the WHATWG fetch bad-ports list (node `fetch` refuses it). */
|
|
31
|
+
export declare function isFetchBlockedPort(port: number): boolean;
|
|
17
32
|
/**
|
|
18
33
|
* Validate an agent name for use in paths and registration.
|
|
19
34
|
* Rejects names with path separators, null bytes, or `..`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRegistry.d.ts","sourceRoot":"","sources":["../../src/core/AgentRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"AgentRegistry.d.ts","sourceRoot":"","sources":["../../src/core/AgentRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY5F;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAOlD,CAAC;AAEH,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAkBD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKvD;AAuBD;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAoB5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAU1D;AAoKD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,aAAa,GAAG,aAAa,CA2BxE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,SAA2B,EACjC,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CA8CN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAKvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAUvF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CASjD;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAYjD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe,GAAG,MAAM,IAAI,CA+BzF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE;IAClC,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,GAAG,kBAAkB,EAAE,CAavB;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAIrE;AAiBD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,MAAiC,EAC7C,QAAQ,GAAE,MAA+B,GACxC,MAAM,CAyBR;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,GAAG,CAAC,EAAE,MAAM,GACX,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,GAAE,MAAe,GAAG,MAAM,IAAI,CA+BjG;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,EAAE,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAiC,EAC7C,QAAQ,GAAE,MAA+B,GACxC,MAAM,CAwBR"}
|
|
@@ -26,6 +26,30 @@ function registryPath() { return path.join(registryDir(), 'registry.json'); }
|
|
|
26
26
|
function legacyRegistryPath() { return path.join(registryDir(), 'port-registry.json'); }
|
|
27
27
|
const DEFAULT_PORT_RANGE_START = 4040;
|
|
28
28
|
const DEFAULT_PORT_RANGE_END = 4099;
|
|
29
|
+
/**
|
|
30
|
+
* WHATWG Fetch "bad ports" — node's global `fetch` (undici) throws
|
|
31
|
+
* `TypeError: fetch failed { cause: 'bad port' }` for any URL on one of these
|
|
32
|
+
* ports. Instar's multi-machine mesh does ALL of its cross-machine I/O over node
|
|
33
|
+
* fetch (pairing `POST /api/pair`, lease broadcast/pull, heartbeat), so an agent
|
|
34
|
+
* whose server lands on a blocked port is SILENTLY unreachable over the mesh —
|
|
35
|
+
* curl works (it ignores the blocklist), so the failure is invisible. Observed
|
|
36
|
+
* live 2026-06-02: a paired test agent on port 4045 (NFS `lockd`, on this list)
|
|
37
|
+
* could never be joined ("fetch failed: bad port") despite curl reaching it. The
|
|
38
|
+
* default allocation range (4040–4099) contains 4045, so the allocator MUST skip
|
|
39
|
+
* these. Source: the WHATWG Fetch spec "bad ports" table.
|
|
40
|
+
*/
|
|
41
|
+
export const FETCH_BLOCKED_PORTS = new Set([
|
|
42
|
+
1, 7, 9, 11, 13, 15, 17, 19, 20, 21, 22, 23, 25, 37, 42, 43, 53, 69, 77, 79, 87,
|
|
43
|
+
95, 101, 102, 103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 137, 139,
|
|
44
|
+
143, 161, 179, 389, 427, 465, 512, 513, 514, 515, 526, 530, 531, 532, 540, 548,
|
|
45
|
+
554, 556, 563, 587, 601, 636, 989, 990, 993, 995, 1719, 1720, 1723, 2049, 3659,
|
|
46
|
+
4045, 4190, 5060, 5061, 6000, 6566, 6665, 6666, 6667, 6668, 6669, 6679, 6697,
|
|
47
|
+
10080,
|
|
48
|
+
]);
|
|
49
|
+
/** True if `port` is on the WHATWG fetch bad-ports list (node `fetch` refuses it). */
|
|
50
|
+
export function isFetchBlockedPort(port) {
|
|
51
|
+
return FETCH_BLOCKED_PORTS.has(port);
|
|
52
|
+
}
|
|
29
53
|
/** Agent name validation: alphanumeric, underscore, hyphen. Max 64 chars. */
|
|
30
54
|
const AGENT_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,63}$/;
|
|
31
55
|
const LOCK_OPTIONS_ASYNC = {
|
|
@@ -500,7 +524,7 @@ export function allocatePort(agentPath, rangeStart = DEFAULT_PORT_RANGE_START, r
|
|
|
500
524
|
// agents that may still be running but have stale registry entries
|
|
501
525
|
const usedPorts = new Set(registry.entries.map(e => e.port));
|
|
502
526
|
for (let port = rangeStart; port <= rangeEnd; port++) {
|
|
503
|
-
if (!usedPorts.has(port) && isPortFreeSync(port)) {
|
|
527
|
+
if (!usedPorts.has(port) && !FETCH_BLOCKED_PORTS.has(port) && isPortFreeSync(port)) {
|
|
504
528
|
return port;
|
|
505
529
|
}
|
|
506
530
|
}
|
|
@@ -587,7 +611,7 @@ export function allocatePortByName(projectName, rangeStart = DEFAULT_PORT_RANGE_
|
|
|
587
611
|
// agents that may still be running but have stale registry entries
|
|
588
612
|
const usedPorts = new Set(registry.entries.map(e => e.port));
|
|
589
613
|
for (let port = rangeStart; port <= rangeEnd; port++) {
|
|
590
|
-
if (!usedPorts.has(port) && isPortFreeSync(port)) {
|
|
614
|
+
if (!usedPorts.has(port) && !FETCH_BLOCKED_PORTS.has(port) && isPortFreeSync(port)) {
|
|
591
615
|
return port;
|
|
592
616
|
}
|
|
593
617
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentRegistry.js","sourceRoot":"","sources":["../../src/core/AgentRegistry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentRegistry.js","sourceRoot":"","sources":["../../src/core/AgentRegistry.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* validate-retro-harvest.mjs — the schema validator for Apprenticeship Step 0
|
|
4
|
+
* retro-harvest artifacts (`apprenticeship-retro-harvest/v1`).
|
|
5
|
+
*
|
|
6
|
+
* Per APPRENTICESHIP-STEP0-RETRO-HARVEST-SPEC.md §9, this is the structural
|
|
7
|
+
* SIGNAL — not the authority. It checks the artifact's SHAPE deterministically;
|
|
8
|
+
* the LLM fidelity review (recorded in frontmatter) is the AUTHORITY for whether
|
|
9
|
+
* the harvest is faithful. (Signal vs Authority / The Body and the Mind.)
|
|
10
|
+
*
|
|
11
|
+
* Two layers:
|
|
12
|
+
* - validateRetroHarvest(text, opts) — PURE, offline, unit-tested. Structure,
|
|
13
|
+
* reconciliation, redaction backstop, path safety, completeness, scope rules.
|
|
14
|
+
* - checkLiveLedger(frontmatter, fetchImpl) — OPTIONAL live cross-check that
|
|
15
|
+
* seeded ids resolve in the running ledger. Network; run by the integration
|
|
16
|
+
* test / `--check-live`, never by the pure unit path.
|
|
17
|
+
*
|
|
18
|
+
* CLI: node scripts/validate-retro-harvest.mjs <artifact.md> [--prior] [--check-live]
|
|
19
|
+
* exit 0 = valid, exit 1 = invalid (errors to stderr).
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { readFileSync } from 'node:fs';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
24
|
+
import path from 'node:path';
|
|
25
|
+
import yaml from 'js-yaml';
|
|
26
|
+
|
|
27
|
+
export const SCHEMA_ID = 'apprenticeship-retro-harvest/v1';
|
|
28
|
+
export const INSTANCE_TYPES = ['mentorship', 'apprenticeship'];
|
|
29
|
+
export const SCOPE_MODES = ['full', 'incremental'];
|
|
30
|
+
export const COMPLETENESS = ['complete', 'partial-accepted'];
|
|
31
|
+
export const FIDELITY_VERDICTS = ['faithful', 'partial', 'rejected'];
|
|
32
|
+
export const HARVEST_DIR = 'docs/apprenticeship/retro-harvests';
|
|
33
|
+
|
|
34
|
+
/** Scrubbers Step 0 trusts. A missing/unknown/failed scrub refuses the artifact (§7). */
|
|
35
|
+
export const APPROVED_SCRUBBERS = ['correction-scrub', 'instar-pii-scrub'];
|
|
36
|
+
|
|
37
|
+
/** Evidence-pointer URI schemes (§6). */
|
|
38
|
+
export const POINTER_PATTERNS = {
|
|
39
|
+
ledger: /^ledger:[0-9a-f-]{6,}$/i, // validator-resolvable
|
|
40
|
+
pr: /^pr:\d+$/, // validator-resolvable
|
|
41
|
+
thread: /^thread:\d+#[\w.-]+$/, // immutable msg locator; fidelity-review-only
|
|
42
|
+
memory: /^memory:[a-z0-9_-]+@[0-9a-f]{6,}#[\w.-]+$/i, // slug@hash#anchor; fidelity-review-only
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Secret-shaped strings the backstop rejects (§7). A LIMITED backstop, not a scrub. */
|
|
46
|
+
const SECRET_PATTERNS = [
|
|
47
|
+
{ name: 'bearer-token', re: /\bBearer\s+[A-Za-z0-9._-]{8,}/ },
|
|
48
|
+
{ name: 'tunnel-sig', re: /[?&]sig=[0-9a-f]{16,}/i },
|
|
49
|
+
{ name: 'long-hex-blob', re: /\b[0-9a-f]{40,}\b/i },
|
|
50
|
+
{ name: 'long-base64-blob', re: /\b[A-Za-z0-9+/]{50,}={0,2}\b/ },
|
|
51
|
+
{ name: 'email', re: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/ },
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Split a markdown doc into { frontmatter (parsed), body (string) }.
|
|
56
|
+
* Throws if there is no `---`-delimited YAML frontmatter.
|
|
57
|
+
*/
|
|
58
|
+
export function parseArtifact(text) {
|
|
59
|
+
const m = /^---\n([\s\S]*?)\n---\n?([\s\S]*)$/.exec(text);
|
|
60
|
+
if (!m) throw new Error('no YAML frontmatter (--- … ---) found');
|
|
61
|
+
const frontmatter = yaml.load(m[1]) || {};
|
|
62
|
+
return { frontmatter, body: m[2] || '' };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Count top-level `- ` bullet items directly under a `## <heading>` section. */
|
|
66
|
+
export function countSectionItems(body, heading) {
|
|
67
|
+
const lines = body.split('\n');
|
|
68
|
+
let inSection = false;
|
|
69
|
+
let count = 0;
|
|
70
|
+
const headingRe = new RegExp('^##\\s+' + heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
|
|
71
|
+
for (const line of lines) {
|
|
72
|
+
if (/^##\s+/.test(line)) inSection = headingRe.test(line);
|
|
73
|
+
else if (inSection && /^-\s+\S/.test(line)) count++;
|
|
74
|
+
}
|
|
75
|
+
return count;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** True when the body contains a secret-shaped string (returns the matched pattern name or null). */
|
|
79
|
+
export function findSecret(body) {
|
|
80
|
+
for (const { name, re } of SECRET_PATTERNS) {
|
|
81
|
+
if (re.test(body)) return name;
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Resolve + confine an artifact path to HARVEST_DIR. Returns the safe relative
|
|
88
|
+
* path or throws on traversal / bad component (§6 security).
|
|
89
|
+
*/
|
|
90
|
+
export function safeArtifactPath(from, to, instanceType) {
|
|
91
|
+
for (const [k, v] of Object.entries({ from, to, instanceType })) {
|
|
92
|
+
if (typeof v !== 'string' || !/^[a-z0-9-]+$/.test(v)) {
|
|
93
|
+
throw new Error(`unsafe path component ${k}="${v}" (must match ^[a-z0-9-]+$)`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
const rel = `${HARVEST_DIR}/${from}-to-${to}-${instanceType}.md`;
|
|
97
|
+
const resolved = path.normalize(rel);
|
|
98
|
+
if (resolved.includes('..') || !resolved.startsWith(HARVEST_DIR + path.sep) && !resolved.startsWith(HARVEST_DIR + '/')) {
|
|
99
|
+
throw new Error(`path escapes ${HARVEST_DIR}: ${resolved}`);
|
|
100
|
+
}
|
|
101
|
+
return rel;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* PURE structural validation of a retro-harvest artifact.
|
|
106
|
+
* @param {string} text - full artifact markdown
|
|
107
|
+
* @param {{ priorHarvestExists?: boolean }} [opts]
|
|
108
|
+
* @returns {{ valid: boolean, errors: string[] }}
|
|
109
|
+
*/
|
|
110
|
+
export function validateRetroHarvest(text, opts = {}) {
|
|
111
|
+
const errors = [];
|
|
112
|
+
const priorHarvestExists = !!opts.priorHarvestExists;
|
|
113
|
+
|
|
114
|
+
let parsed;
|
|
115
|
+
try {
|
|
116
|
+
parsed = parseArtifact(text);
|
|
117
|
+
} catch (e) {
|
|
118
|
+
return { valid: false, errors: [`parse: ${e.message}`] };
|
|
119
|
+
}
|
|
120
|
+
const { frontmatter: fm, body } = parsed;
|
|
121
|
+
|
|
122
|
+
// --- schema id
|
|
123
|
+
if (fm.schema !== SCHEMA_ID) errors.push(`schema must be "${SCHEMA_ID}" (got "${fm.schema}")`);
|
|
124
|
+
|
|
125
|
+
// --- required scalar fields
|
|
126
|
+
for (const f of ['instanceType', 'from', 'to', 'framework', 'harvestedAt', 'scopeMode', 'completeness']) {
|
|
127
|
+
if (fm[f] == null || fm[f] === '') errors.push(`missing required field: ${f}`);
|
|
128
|
+
}
|
|
129
|
+
if (fm.instanceType && !INSTANCE_TYPES.includes(fm.instanceType))
|
|
130
|
+
errors.push(`instanceType must be one of ${INSTANCE_TYPES.join('|')}`);
|
|
131
|
+
if (fm.scopeMode && !SCOPE_MODES.includes(fm.scopeMode))
|
|
132
|
+
errors.push(`scopeMode must be one of ${SCOPE_MODES.join('|')}`);
|
|
133
|
+
if (fm.completeness && !COMPLETENESS.includes(fm.completeness))
|
|
134
|
+
errors.push(`completeness must be one of ${COMPLETENESS.join('|')}`);
|
|
135
|
+
|
|
136
|
+
// --- path safety on the identity components
|
|
137
|
+
if (fm.from && fm.to && fm.instanceType) {
|
|
138
|
+
try { safeArtifactPath(fm.from, fm.to, fm.instanceType); }
|
|
139
|
+
catch (e) { errors.push(`path: ${e.message}`); }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// --- scope rule: first harvest (no prior baseline) MUST be full (§8)
|
|
143
|
+
if (fm.scopeMode === 'incremental' && !priorHarvestExists)
|
|
144
|
+
errors.push('scopeMode "incremental" requires a prior harvest baseline; the first harvest must be "full"');
|
|
145
|
+
|
|
146
|
+
// --- sourcesCovered: coverage EXTENT, not bare booleans (§8)
|
|
147
|
+
const sc = fm.sourcesCovered;
|
|
148
|
+
if (!sc || typeof sc !== 'object') {
|
|
149
|
+
errors.push('missing sourcesCovered');
|
|
150
|
+
} else {
|
|
151
|
+
if (!sc.ledger || typeof sc.ledger.issueCount !== 'number')
|
|
152
|
+
errors.push('sourcesCovered.ledger must carry { read, issueCount }');
|
|
153
|
+
if (!sc.playbook || typeof sc.playbook.entryCount !== 'number')
|
|
154
|
+
errors.push('sourcesCovered.playbook must carry { read, entryCount }');
|
|
155
|
+
if (!Array.isArray(sc.threads))
|
|
156
|
+
errors.push('sourcesCovered.threads must be an array of { id, messagesRead, truncated }');
|
|
157
|
+
else for (const t of sc.threads) {
|
|
158
|
+
if (typeof t.messagesRead !== 'number' || typeof t.truncated !== 'boolean')
|
|
159
|
+
errors.push(`sourcesCovered.threads[${t && t.id}] needs numeric messagesRead + boolean truncated (coverage extent, not presence)`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// --- completeness vs truncation (§8): complete ⇒ nothing truncated
|
|
164
|
+
if (fm.completeness === 'complete' && sc && Array.isArray(sc.threads)) {
|
|
165
|
+
if (sc.threads.some((t) => t.truncated === true))
|
|
166
|
+
errors.push('completeness "complete" is invalid when a source is truncated; use "partial-accepted" with named gaps');
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// --- counts reconcile with body (§9)
|
|
170
|
+
const counts = fm.counts || {};
|
|
171
|
+
const bodyLessons = countSectionItems(body, 'Lessons');
|
|
172
|
+
const bodyMeta = countSectionItems(body, 'Meta-lessons');
|
|
173
|
+
const bodyProc = countSectionItems(body, 'Process-insights');
|
|
174
|
+
const bodyNeeds = countSectionItems(body, 'What the program needs');
|
|
175
|
+
if (counts.lessons !== bodyLessons)
|
|
176
|
+
errors.push(`counts.lessons=${counts.lessons} but body has ${bodyLessons} "## Lessons" items`);
|
|
177
|
+
if (counts.metaLessons !== bodyMeta)
|
|
178
|
+
errors.push(`counts.metaLessons=${counts.metaLessons} but body has ${bodyMeta} "## Meta-lessons" items`);
|
|
179
|
+
if (counts.processInsights !== bodyProc)
|
|
180
|
+
errors.push(`counts.processInsights=${counts.processInsights} but body has ${bodyProc} "## Process-insights" items`);
|
|
181
|
+
if (fm.programNeeds !== bodyNeeds)
|
|
182
|
+
errors.push(`programNeeds=${fm.programNeeds} but body has ${bodyNeeds} "## What the program needs" items`);
|
|
183
|
+
|
|
184
|
+
// --- redaction: approved scrubber, not failed (§7)
|
|
185
|
+
const r = fm.redaction;
|
|
186
|
+
if (!r || typeof r !== 'object') {
|
|
187
|
+
errors.push('missing redaction { scrubber, findingsRemoved, scrubbedAt }');
|
|
188
|
+
} else {
|
|
189
|
+
const scrubberName = String(r.scrubber || '').split('@')[0];
|
|
190
|
+
if (!APPROVED_SCRUBBERS.includes(scrubberName))
|
|
191
|
+
errors.push(`redaction.scrubber "${r.scrubber}" not in approved list (${APPROVED_SCRUBBERS.join(', ')})`);
|
|
192
|
+
if (r.status === 'failed') errors.push('redaction.status is "failed" — scrub must succeed before write');
|
|
193
|
+
if (typeof r.findingsRemoved !== 'number') errors.push('redaction.findingsRemoved must be a number');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// --- fidelity review: the authority's stamp (§9)
|
|
197
|
+
const fr = fm.fidelityReview;
|
|
198
|
+
if (!fr || typeof fr !== 'object') {
|
|
199
|
+
errors.push('missing fidelityReview { reviewer, verdict, at }');
|
|
200
|
+
} else {
|
|
201
|
+
if (!FIDELITY_VERDICTS.includes(fr.verdict))
|
|
202
|
+
errors.push(`fidelityReview.verdict must be one of ${FIDELITY_VERDICTS.join('|')}`);
|
|
203
|
+
if (fr.verdict === 'rejected') errors.push('fidelityReview.verdict is "rejected" — harvest is not faithful');
|
|
204
|
+
if (fr.verdict === 'partial' && !fr.gaps && !(fr.audit && fr.audit.gaps))
|
|
205
|
+
errors.push('fidelityReview "partial" must name the gaps (fidelityReview.gaps)');
|
|
206
|
+
if (!fr.reviewer) errors.push('fidelityReview.reviewer required (must be independent of the harvesting pass)');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// --- evidence pointers well-formed (§6). Strip trailing sentence punctuation
|
|
210
|
+
// so a pointer at a clause boundary ("ledger:abc123, priority…") still validates.
|
|
211
|
+
const pointerTokens = (body.match(/\b(?:ledger|pr|thread|memory):[^\s)\]]+/g) || [])
|
|
212
|
+
.map((t) => t.replace(/[.,;:]+$/, ''));
|
|
213
|
+
for (const tok of pointerTokens) {
|
|
214
|
+
const scheme = tok.split(':')[0];
|
|
215
|
+
const re = POINTER_PATTERNS[scheme];
|
|
216
|
+
if (re && !re.test(tok)) errors.push(`malformed evidence pointer: ${tok}`);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// --- secret backstop (§7)
|
|
220
|
+
const secret = findSecret(body);
|
|
221
|
+
if (secret) errors.push(`secret-shaped string in body (${secret}) — pointers-not-payloads (§7)`);
|
|
222
|
+
|
|
223
|
+
return { valid: errors.length === 0, errors };
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* OPTIONAL live cross-check: every seededToPlaybook id resolves at candidate+ in
|
|
228
|
+
* the running ledger. Network — never part of the pure unit path. Inject fetch.
|
|
229
|
+
* @returns {Promise<{ ok: boolean, errors: string[] }>}
|
|
230
|
+
*/
|
|
231
|
+
export async function checkLiveLedger(frontmatter, fetchImpl) {
|
|
232
|
+
const errors = [];
|
|
233
|
+
const seeded = Array.isArray(frontmatter.seededToPlaybook) ? frontmatter.seededToPlaybook : [];
|
|
234
|
+
for (const s of seeded) {
|
|
235
|
+
const id = s && s.id;
|
|
236
|
+
if (!id) { errors.push('seededToPlaybook entry without id'); continue; }
|
|
237
|
+
try {
|
|
238
|
+
const res = await fetchImpl(id);
|
|
239
|
+
if (!res || !res.found) errors.push(`seeded id ${id} not found in live ledger`);
|
|
240
|
+
else if (!['candidate', 'extracted'].includes(res.playbookStatus))
|
|
241
|
+
errors.push(`seeded id ${id} is "${res.playbookStatus}", expected candidate+`);
|
|
242
|
+
} catch (e) {
|
|
243
|
+
errors.push(`live check for ${id} failed: ${e.message}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return { ok: errors.length === 0, errors };
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// --- CLI entry (guarded so importing for tests is side-effect-free)
|
|
250
|
+
const isMain = (() => {
|
|
251
|
+
try { return process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1]); }
|
|
252
|
+
catch { return false; }
|
|
253
|
+
})();
|
|
254
|
+
|
|
255
|
+
if (isMain) {
|
|
256
|
+
const args = process.argv.slice(2);
|
|
257
|
+
const file = args.find((a) => !a.startsWith('--'));
|
|
258
|
+
const priorHarvestExists = args.includes('--prior');
|
|
259
|
+
if (!file) {
|
|
260
|
+
console.error('usage: validate-retro-harvest.mjs <artifact.md> [--prior] [--check-live]');
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
const text = readFileSync(file, 'utf8');
|
|
264
|
+
const { valid, errors } = validateRetroHarvest(text, { priorHarvestExists });
|
|
265
|
+
if (!valid) {
|
|
266
|
+
console.error(`INVALID: ${file}`);
|
|
267
|
+
for (const e of errors) console.error(' - ' + e);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
}
|
|
270
|
+
console.log(`valid: ${file}`);
|
|
271
|
+
process.exit(0);
|
|
272
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-06-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-06-02T04:46:08.483Z",
|
|
5
|
+
"instarVersion": "1.3.197",
|
|
6
6
|
"entryCount": 193,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
Agents are no longer assigned a network port that the multi-machine mesh secretly can't reach.
|
|
9
|
+
|
|
10
|
+
The mesh talks between machines using Node's built-in web-request function, which refuses a short standard list of "bad ports" (for example 4045, the old file-lock service port). That list includes a port inside the default range agents were picked from — so an agent could be handed a port on which it would silently fail to pair or fail over, with no error in normal tools. The port picker now skips those bad ports, and any agent already running on one prints a clear startup warning telling you to change its port.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
Nothing to do for new agents — they'll automatically avoid the handful of reserved ports that break multi-machine networking. If you run multiple machines and one happens to be on a bad port, the agent now warns you at startup with the exact fix (change its port and restart). This removes a silent, very-hard-to-spot failure where an agent looked healthy but could never join the mesh.
|
|
15
|
+
|
|
16
|
+
## Summary of New Capabilities
|
|
17
|
+
|
|
18
|
+
- The agent port allocator skips WHATWG fetch "bad ports" (4045, 6000, 6566, 6697, …), so a new agent never lands on a port the mesh's node-fetch comms can't reach.
|
|
19
|
+
- A new exported helper, isFetchBlockedPort, plus an unconditional server-startup warning when an existing agent's configured port is on that list (the migration path for already-running agents).
|
|
20
|
+
|
|
21
|
+
## Evidence
|
|
22
|
+
|
|
23
|
+
- Root cause of a real 2026-06-02 failure: a paired test agent on port 4045 could never be joined ("fetch failed: bad port") even though curl reached its pairing endpoint; moving it off 4045 fixed the join immediately.
|
|
24
|
+
- `tsc --noEmit` clean; 34 agent-registry unit tests green, including 3 new ones covering the blocklist helper (both sides of the boundary) and the allocator skipping a blocked port. Side-effects review: upgrades/side-effects/fix-fetch-blocked-ports.md.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Side-Effects Review — Apprenticeship Step 0: Retro-Harvest
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `APPRENTICESHIP-STEP0-RETRO-HARVEST-SPEC`
|
|
4
|
+
**Date:** `2026-06-01`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Second-pass reviewer:** `not required` (converged via /spec-converge: 5 internal reviewers + codex gpt-5.5, 3 rounds)
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
Builds Step 0 of the Apprenticeship Program (Tier-3 umbrella #675). Ships:
|
|
11
|
+
- `scripts/validate-retro-harvest.mjs` — the pure, offline schema validator (the structural
|
|
12
|
+
SIGNAL) for `apprenticeship-retro-harvest/v1` artifacts, plus an optional injected-fetch
|
|
13
|
+
live-ledger cross-check.
|
|
14
|
+
- `tests/unit/validate-retro-harvest.test.ts` (34 cases, both sides of every boundary) +
|
|
15
|
+
`tests/integration/retro-harvest-artifact.test.ts` (the real artifact as a fixture-of-record).
|
|
16
|
+
- `docs/apprenticeship/RETRO-HARVEST-PROCEDURE.md` — the repeatable how-to.
|
|
17
|
+
- `docs/apprenticeship/retro-harvests/echo-to-codey-mentorship.md` — the first real harvest,
|
|
18
|
+
grounded in the live ledger (28 issues), reviewed by an independent fidelity reviewer.
|
|
19
|
+
- `docs/apprenticeship/retro-harvests/INDEX.json` — the latest-harvest pointer.
|
|
20
|
+
|
|
21
|
+
No `src/` is touched. The validator is a standalone `scripts/` tool not imported by `src/`.
|
|
22
|
+
|
|
23
|
+
## Decision-point inventory
|
|
24
|
+
|
|
25
|
+
One: the validator's pass/fail boundary (`validateRetroHarvest`). It is a **signal**, not an
|
|
26
|
+
authority (spec §9) — it asserts artifact SHAPE (schema, required fields, count/programNeeds
|
|
27
|
+
reconciliation, coverage-extent, scope/completeness rules, evidence-pointer well-formedness,
|
|
28
|
+
a limited secret-pattern backstop, path confinement, an approved+succeeded scrub, and a
|
|
29
|
+
non-`rejected` fidelity verdict). It does NOT judge harvest fidelity — that is the independent
|
|
30
|
+
LLM fidelity review, recorded in the artifact frontmatter.
|
|
31
|
+
|
|
32
|
+
## 1. Over-block
|
|
33
|
+
|
|
34
|
+
**What legitimate inputs does this reject?** A structurally malformed artifact (missing fields,
|
|
35
|
+
counts that disagree with the body, an incremental first harvest, a `complete` artifact with a
|
|
36
|
+
truncated source, an unapproved/failed scrub, a `rejected` fidelity verdict, a secret-shaped
|
|
37
|
+
string, a malformed pointer). All are genuine defects the gate is meant to refuse. Trailing
|
|
38
|
+
sentence punctuation after a pointer is tolerated (stripped before validation) so a clause-
|
|
39
|
+
boundary pointer is not falsely rejected.
|
|
40
|
+
|
|
41
|
+
## 2. Under-block
|
|
42
|
+
|
|
43
|
+
**What does this still miss?** By design, the validator does NOT judge whether the harvest is
|
|
44
|
+
*truthful or complete* — a well-shaped but hollow harvest passes the validator; the LLM fidelity
|
|
45
|
+
review is the authority that catches that (Signal vs Authority). The secret-pattern scan is an
|
|
46
|
+
explicit *limited backstop*, not a scrub guarantee (it misses API keys, hostnames, sig-less
|
|
47
|
+
URLs, names, phone numbers, contextual PII); the authoritative defense is the approved scrubber.
|
|
48
|
+
Live-ledger resolution of seeded ids runs only under `--check-live` / the integration path, not
|
|
49
|
+
the pure unit path.
|
|
50
|
+
|
|
51
|
+
## 3. Level-of-abstraction fit
|
|
52
|
+
|
|
53
|
+
**Right layer?** Yes. The validator is a pure function with a thin CLI guard, in `scripts/`
|
|
54
|
+
beside the other repo-invariant validators, unit-testable with no git/fs/network mocking. The
|
|
55
|
+
harvest artifact + procedure + index are plain repo docs under `docs/apprenticeship/`. The gate
|
|
56
|
+
that will *require* a valid harvest before an instance starts is deliberately deferred to Step 1
|
|
57
|
+
(spec §12–13) — this step ships the artifact + the validator the gate will call.
|
|
58
|
+
|
|
59
|
+
## 4. Testing
|
|
60
|
+
|
|
61
|
+
- **Unit** (`tests/unit/validate-retro-harvest.test.ts`): 34 cases — valid baseline + a targeted
|
|
62
|
+
failing mutation per decision boundary + `checkLiveLedger` with an injected fetch.
|
|
63
|
+
- **Integration** (`tests/integration/retro-harvest-artifact.test.ts`): the REAL
|
|
64
|
+
`echo-to-codey-mentorship.md` validates against the REAL validator; it is a full first harvest
|
|
65
|
+
with an independent (non-Echo) fidelity reviewer; seeds nothing (#50-independent); is INDEX-
|
|
66
|
+
registered.
|
|
67
|
+
- **E2E:** genuinely n/a — pure CLI validator, no HTTP route, no DI (spec §9, §11).
|
|
68
|
+
|
|
69
|
+
## 5. Migration / rollback / Agent-Awareness
|
|
70
|
+
|
|
71
|
+
- **Migration Parity:** N/A. No agent-installed files (`.claude/`, `.instar/config.json`, hooks,
|
|
72
|
+
skills, CLAUDE.md template), no config defaults, no `src/`. Pure repo docs + one `scripts/`
|
|
73
|
+
helper + tests.
|
|
74
|
+
- **Rollback:** revert the commit; nothing is deployed to agents, no state is written.
|
|
75
|
+
- **Agent-Awareness:** explicitly deferred to Step 1 (spec §12) — the awareness surface ("a valid
|
|
76
|
+
harvest is required before an instance starts") belongs with the gate Step 1 wires, not before
|
|
77
|
+
it exists.
|
|
78
|
+
- **NEXT.md / publish:** no `src/` change → no fleet-release/publish concern.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Side-Effects Review — Skip WHATWG fetch-blocked ports in agent port allocation
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `fix-fetch-blocked-ports`
|
|
4
|
+
**Date:** `2026-06-02`
|
|
5
|
+
**Author:** `echo`
|
|
6
|
+
**Tier:** 1 (small, low-risk; ELI16 + side-effects, no converged spec)
|
|
7
|
+
**Parent principle:** Cross-Machine Coherence — One Agent, Robust Under Degraded Conditions
|
|
8
|
+
|
|
9
|
+
## Summary of the change
|
|
10
|
+
|
|
11
|
+
Instar's multi-machine mesh does ALL cross-machine I/O over node's global `fetch`
|
|
12
|
+
(pairing `POST /api/pair`, lease broadcast/pull, heartbeat). Node's `fetch` (undici)
|
|
13
|
+
throws `TypeError: fetch failed { cause: 'bad port' }` for any URL whose port is on the
|
|
14
|
+
WHATWG Fetch spec "bad ports" list. The default agent port-allocation range (4040–4099)
|
|
15
|
+
**contains 4045** (NFS `lockd`, a blocked port), so the allocator could hand an agent a
|
|
16
|
+
port on which it can **never** be reached over the mesh — silently, because `curl`
|
|
17
|
+
ignores the blocklist so the endpoint looks healthy.
|
|
18
|
+
|
|
19
|
+
**Observed live (2026-06-02):** a freshly-paired throwaway test agent landed on 4045 and
|
|
20
|
+
could not be joined — `instar join` failed with "fetch failed" despite `curl` to the same
|
|
21
|
+
`/api/pair` returning 400. Moving it off 4045 fixed the join instantly.
|
|
22
|
+
|
|
23
|
+
### What changed
|
|
24
|
+
- `src/core/AgentRegistry.ts`: added `FETCH_BLOCKED_PORTS` (the WHATWG bad-ports set) +
|
|
25
|
+
exported `isFetchBlockedPort(port)`. Both `allocatePort` and `allocatePortByName` now
|
|
26
|
+
skip blocked ports (in addition to used + lsof-busy ones).
|
|
27
|
+
- `src/commands/server.ts`: an unconditional startup warning when `config.port` is a
|
|
28
|
+
blocked port — the migration-parity path for EXISTING agents already on one (the
|
|
29
|
+
allocator guard only protects newly-allocated agents).
|
|
30
|
+
|
|
31
|
+
## Decision-point inventory
|
|
32
|
+
- allocator: skip vs allocate a port → skip if on the blocklist (the check precedes the
|
|
33
|
+
lsof probe, so it's deterministic).
|
|
34
|
+
- startup: warn vs silent → warn (loud, non-fatal) when an existing config sits on a
|
|
35
|
+
blocked port; we do NOT auto-re-port (that would change a running agent's port — left
|
|
36
|
+
to the operator).
|
|
37
|
+
|
|
38
|
+
## 1. Over-correction risk
|
|
39
|
+
The blocklist is the fixed WHATWG set; legitimate agent ports (4040–4044, 4046–4099, etc.)
|
|
40
|
+
are unaffected. Only 4045 falls in the default range. Skipping reduces the usable range by
|
|
41
|
+
one port — negligible (60→59).
|
|
42
|
+
|
|
43
|
+
## 2. Under-correction risk
|
|
44
|
+
Existing agents already on a blocked port aren't auto-fixed (that would change their port);
|
|
45
|
+
the startup warning surfaces it so the operator re-ports. Acceptable — auto-re-porting a
|
|
46
|
+
live agent is riskier than a loud warning.
|
|
47
|
+
|
|
48
|
+
## 3. Level-of-abstraction fit
|
|
49
|
+
The skip lives in the single port allocator both callers use; the warning at the single
|
|
50
|
+
server-start path. No scattering.
|
|
51
|
+
|
|
52
|
+
## 4. Signal vs Authority
|
|
53
|
+
Pure deterministic check against a fixed spec list — no LLM, no heuristic. Appropriate.
|
|
54
|
+
|
|
55
|
+
## 5. External surfaces
|
|
56
|
+
None. No route/config-schema change. `isFetchBlockedPort` is a new pure export.
|
|
57
|
+
|
|
58
|
+
## 6. Interactions with existing primitives
|
|
59
|
+
The allocator's existing used-port + lsof checks are unchanged; the blocklist is an
|
|
60
|
+
additional AND condition. The warning composes with the existing startup logs.
|
|
61
|
+
|
|
62
|
+
## 7. Rollback cost
|
|
63
|
+
Trivial: remove the `&& !FETCH_BLOCKED_PORTS.has(port)` clauses + the warning. No state.
|
|
64
|
+
|
|
65
|
+
## Migration parity
|
|
66
|
+
- New agents: allocator skips blocked ports (no action needed).
|
|
67
|
+
- Existing agents on a blocked port: the startup warning surfaces it (operator re-ports).
|
|
68
|
+
- Pure code; reaches existing agents on the normal dist update. No config/hook migration.
|
|
69
|
+
|
|
70
|
+
## Tests
|
|
71
|
+
`tsc --noEmit` clean. 34 `agent-registry` unit tests green, including 3 new: `isFetchBlockedPort`
|
|
72
|
+
both sides of the boundary (4045/6000/6697/2049 blocked; 4040/4046/4050/4099 not),
|
|
73
|
+
`allocatePort` throws rather than return a sole blocked candidate, and `allocatePort` skips
|
|
74
|
+
a blocked port to return the next usable one.
|