instar 1.3.1140 → 1.3.1141

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.
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
5
- "packageVersion": "1.3.1140",
5
+ "packageVersion": "1.3.1141",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "15c9d6c3753ee5491f6774991e683e3b99cc67f05376ab66dcbd63ebd26a9f38",
2
+ "sha256": "adce98bd928dd093c27e5fc91bcc6e5d9591b5214386ae330a7df922818f24db",
3
3
  "registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
4
- "packageVersion": "1.3.1140"
4
+ "packageVersion": "1.3.1141"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
3
3
  "articleCount": 88,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1140"
5
+ "packageVersion": "1.3.1141"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "instar",
3
- "version": "1.3.1140",
3
+ "version": "1.3.1141",
4
4
  "description": "Coherence infrastructure for self-evolving AI agents — on the Claude Code or Codex subscription you already have.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -81,12 +81,29 @@ const EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.mjs', '.cjs']);
81
81
  // Found by a peer-agent audit for checks defeatable by renaming. Resolve the
82
82
  // local bindings FIRST, then match constructions under any of them.
83
83
 
84
- /** Every local name a provider class is bound to in this file, plus namespace forms. */
84
+ /** Every local name a provider class is bound to in this file, plus namespace forms.
85
+ *
86
+ * Widened 2026-08-14 after a peer-agent SABOTAGE pass against the first version
87
+ * found two SAME-FILE evasions the alias resolution missed:
88
+ * const C = ClaudeCliIntelligenceProvider; new C({}); // plain re-binding
89
+ * new Providers['ClaudeCliIntelligenceProvider']({}); // computed access
90
+ * The first is probably the easiest bypass of all to write. Re-binding is
91
+ * resolved to a FIXPOINT so chains (`const C = Cls; const D = C;`) close too. */
85
92
  export function localProviderBindings(content, cls) {
86
93
  const names = new Set([cls]);
87
94
  // `import { Cls as Alias }` and `const { Cls: Alias } = await import(...)`
88
95
  for (const m of content.matchAll(new RegExp(`\\b${cls}\\s+as\\s+([A-Za-z_$][\\w$]*)`, 'g'))) names.add(m[1]);
89
96
  for (const m of content.matchAll(new RegExp(`\\b${cls}\\s*:\\s*([A-Za-z_$][\\w$]*)`, 'g'))) names.add(m[1]);
97
+ // `const|let|var Alias = <knownName>;` — plain re-binding, resolved to a
98
+ // fixpoint so a chain of re-bindings cannot walk out of the set.
99
+ for (let pass = 0; pass < 10; pass++) {
100
+ const before = names.size;
101
+ for (const known of [...names]) {
102
+ const re = new RegExp(`\\b(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*${known}\\s*[;,\\n]`, 'g');
103
+ for (const m of content.matchAll(re)) names.add(m[1]);
104
+ }
105
+ if (names.size === before) break;
106
+ }
90
107
  return [...names];
91
108
  }
92
109
 
@@ -108,7 +125,11 @@ export function findProviderConstructions(content, classes = PROVIDER_CLASSES) {
108
125
  const bare = names.some((n) => new RegExp(`\\bnew\\s+${n}\\s*\\(`).test(lines[i]));
109
126
  // `new <ns>.<Cls>(` — a namespace import the bare form cannot see.
110
127
  const viaNs = new RegExp(`\\bnew\\s+[A-Za-z_$][\\w$]*\\.${cls}\\s*\\(`).test(lines[i]);
111
- if (bare || viaNs) { hits.push({ line: i + 1, cls }); break; }
128
+ // `new <ns>['<Cls>'](` computed access; found by sabotage 2026-08-14.
129
+ const viaComputed = new RegExp(
130
+ `\\bnew\\s+[A-Za-z_$][\\w$]*\\s*\\[\\s*['"\`]${cls}['"\`]\\s*\\]\\s*\\(`,
131
+ ).test(lines[i]);
132
+ if (bare || viaNs || viaComputed) { hits.push({ line: i + 1, cls }); break; }
112
133
  }
113
134
  }
114
135
  return hits;
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "./builtin-manifest.schema.json",
3
3
  "schemaVersion": 1,
4
- "generatedAt": "2026-08-14T19:14:01.581Z",
5
- "instarVersion": "1.3.1140",
4
+ "generatedAt": "2026-08-14T19:38:02.081Z",
5
+ "instarVersion": "1.3.1141",
6
6
  "entryCount": 202,
7
7
  "entries": {
8
8
  "hook:session-start": {
@@ -2,7 +2,7 @@
2
2
  "schemaVersion": 1,
3
3
  "generatedFrom": "source-tree",
4
4
  "registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
5
- "packageVersion": "1.3.1140",
5
+ "packageVersion": "1.3.1141",
6
6
  "guards": [
7
7
  {
8
8
  "ref": "docs/audits/phase-b/f10-triage.md",
@@ -1,5 +1,5 @@
1
1
  {
2
- "sha256": "15c9d6c3753ee5491f6774991e683e3b99cc67f05376ab66dcbd63ebd26a9f38",
2
+ "sha256": "adce98bd928dd093c27e5fc91bcc6e5d9591b5214386ae330a7df922818f24db",
3
3
  "registrySha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
4
- "packageVersion": "1.3.1140"
4
+ "packageVersion": "1.3.1141"
5
5
  }
@@ -2,5 +2,5 @@
2
2
  "sha256": "81b53363a440e832672618965540b3e507ae0d93adcc67ec2b93daf7933b3ab4",
3
3
  "articleCount": 88,
4
4
  "generatedFrom": "docs/STANDARDS-REGISTRY.md",
5
- "packageVersion": "1.3.1140"
5
+ "packageVersion": "1.3.1141"
6
6
  }
@@ -0,0 +1,30 @@
1
+ # Upgrade Guide — vNEXT
2
+
3
+ <!-- assembled-by: assemble-next-md -->
4
+ <!-- bump: patch -->
5
+
6
+ ## What Changed
7
+
8
+ After hardening the runaway-process guard against renamed imports this morning, a second agent was asked to break it — and got past it twice more.
9
+
10
+ - **Assigning the class to a variable and building from the variable** slipped through. That is probably the simplest bypass anyone could write, and it was not anticipated.
11
+ - **Reaching the class out of a module with bracket notation** instead of a dot also slipped through.
12
+ - **Both are now recognised.** Variable assignments are followed to a fixed point, so passing the class along several times cannot walk out of the set.
13
+ - **The written statement of what the guard still misses has been corrected.** It named one kind of gap; there were three. Two of them were inside the ground the earlier fix implied was covered, so leaving that statement unchanged would have left a claim on record narrower than the truth.
14
+ - **No new work.** The same constructions are forbidden as before, the codebase passes cleanly before and after.
15
+
16
+ ## What to Tell Your User
17
+
18
+ This morning's fix made the guard understand renamed imports. It was then attacked on purpose, and two more ways past turned up — both of them ordinary code, both inside a single file, which is exactly what that fix claimed to have handled.
19
+
20
+ Those are closed. Three ways past remain, all involving a class passed onward through several modules; closing those needs the check to follow symbols across files, which it does not do. That limit is now written down and pinned by a test, so nobody later mistakes it for an oversight.
21
+
22
+ Worth noting how this was found: not by re-reading the fix, but by asking someone else to break it and telling them plainly that finding a hole would be more useful than a clean report. A review that can only confirm is not a review.
23
+
24
+ ## Summary of New Capabilities
25
+
26
+ None. This widens what an existing check can see and corrects a written claim about its limits. No new command, route, setting, or rule.
27
+
28
+ ## Evidence
29
+
30
+ The two bypasses are the reviewer's own snippets, reproduced verbatim as tests. Proven in both directions: reverting both additions fails four tests while thirteen still pass — those thirteen including all six deliberate opposite-direction controls and a test that pins the remaining cross-module gap as still open. Among the controls is a new one specifically for this change: assigning an unrelated symbol to a variable and building from it is not flagged, because a rule that treated every variable as suspicious would pass every bypass test and fail on ordinary code. The real codebase passes cleanly before and after; source restored byte-identical after the check.