jules-orchestrator-kit 0.72.0 → 0.72.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/CHANGELOG.md +8 -0
- package/README.md +2 -1
- package/ROADMAP_V1.md +8 -3
- package/package.json +1 -1
- package/src/git.mjs +2 -0
- package/src/security.mjs +36 -11
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.72.1] - 2026-09-08
|
|
9
|
+
*A diff cannot judge what it cannot see.*
|
|
10
|
+
|
|
11
|
+
Fixes staged-mode diff extraction and cross-language dead-guard detection uncovered during polyglot trial execution on Python/Make repositories:
|
|
12
|
+
- **Staged Mode Diff Fidelity (`src/git.mjs`)**: `diffText(root, base, "staged")` failed to query the git index, falling through to `git diff <base>...HEAD`. Consequently, staged modifications (`git add`) on feature branches were omitted from the diff passed to the secret scanner and anti-tamper guard. `diffText` now queries `git diff --cached <base>` in staged mode, ensuring cached index additions are fully inspected.
|
|
13
|
+
- **Indentation-Aware Dead Guard Tamper Detection (`src/security.mjs`)**: Extended `DEAD_GUARD_CONDITION` to recognize literal boolean and zero falsities (`if False:`, `if (false)`, `if 0:`). Replaced brace-only block tracking with indentation-aware block traversal, enabling Python, YAML, and brace-less test suites to detect assertions and failure calls shielded inside dead logic.
|
|
14
|
+
- **Assertion Coverage in Dead Conditions (`src/security.mjs`)**: `VACUOUS_ASSERTION` now detects both failure calls (`FAILURE_CALL`) and test assertions (`ASSERTION_PATTERN`) inside dead blocks.
|
|
15
|
+
|
|
8
16
|
## [0.72.0] - 2026-09-08
|
|
9
17
|
*A guard is not a policy if the diff under review can rewrite the rules.*
|
|
10
18
|
|
package/README.md
CHANGED
|
@@ -208,7 +208,7 @@ To maximize PR merge rates, dispatch tasks according to deterministic boundaries
|
|
|
208
208
|
* **Fail-Closed Security & Secret Redaction:** Evaluates explicit Deny rules before Allow rules against canonicalized, case-folded paths. Redacts high-entropy keys and base64-encoded credentials (such as Kubernetes `Secret` manifests).
|
|
209
209
|
* **Complexity & Cost Router:** Zero-dependency heuristic classifier (`src/router.mjs`) routing mechanical tasks to lightweight models while reserving primary models for complex refactors, with a `node --check` syntax-verification gate that transparently escalates a FAST-tier result to the primary provider if it left broken JS on disk.
|
|
210
210
|
* **Terminal UI & Diagnostic Matrix (`agentctl doctor`):** Interactive terminal dashboard, task sidecar manager, and automated transactional self-repair.
|
|
211
|
-
* **Verified Test Suite:** Tested with **
|
|
211
|
+
* **Verified Test Suite:** Tested with **1403 unit tests across 196 suites**, green on every supported platform.
|
|
212
212
|
|
|
213
213
|
<br/>
|
|
214
214
|
|
|
@@ -448,6 +448,7 @@ const result = await fast.dispatch({ prompt: "Fix a typo." }, { root: process.cw
|
|
|
448
448
|
|
|
449
449
|
| Feature | Module / Command | Architectural Description | Status |
|
|
450
450
|
| :--- | :--- | :--- | :---: |
|
|
451
|
+
| **Staged Diff Fidelity & Indentation Dead Guards** | `src/git.mjs`, `src/security.mjs` | Query cached index in staged mode (`git diff --cached <base>`), detect literal falsity dead guards (`if False:`, `if (false)`, `if 0:`), and support indentation-aware block traversal for Python test suites. | **v0.72.1** *(Shipped)* |
|
|
451
452
|
| **Cold-Start Hardened Kernel & Tamper Defense** | `src/config.mjs`, `src/engine.mjs`, `src/git.mjs`, `src/security.mjs` | Full remediation of 22 cold-start audit findings (F01–F22): authoritative base policy resolution, ephemeral snapshot worktree isolation, canonical root test tamper guard, conditional assertion defense, multi-target Cargo test aggregation, Python src-layout injection, and complete repository uninstall documentation. | **v0.72.0** *(Shipped)* |
|
|
452
453
|
| **Silence Is Not A Suite & Scaffolding Linter Fixes** | `src/ops/test-collection.mjs`, `src/wizard-init.mjs`, `src/config.mjs` | Reject zero-output test suite commands, quote-aware YAML parser with scalar emission, test de-registration detection (`TEST_DEREGISTERED`), and active waiver telemetry banner. | **v0.71.0** *(Shipped)* |
|
|
453
454
|
| **Diagnostics That Reach the Operator** | `src/security.mjs`, `src/engine.mjs`, `bin/agentctl.mjs` | Secret findings name the file and line, a failed verify stage reports its command, exit code and output, and `queue`/`swarm` name each failed task and exit `1` rather than reporting success for a run that dispatched nothing. | **v0.41.1** *(Shipped)* |
|
package/ROADMAP_V1.md
CHANGED
|
@@ -11,14 +11,19 @@ The **jules-orchestrator-kit** is the zero-dependency safety gatekeeper and self
|
|
|
11
11
|
## 📌 Release Milestones Overview
|
|
12
12
|
|
|
13
13
|
```
|
|
14
|
-
v0.72.
|
|
15
|
-
(
|
|
14
|
+
v0.72.1 (Current Stable) ──► v0.73.0 (Distributed Swarms & Leases) ──► v1.0.0 (Production Hardened Kernel)
|
|
15
|
+
(Staged Diff & Dead Guards) (Multi-Agent DAG & Resource Locks) (Enterprise Telemetry & SLA)
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## ✅ Shipped Milestones (v0.20.0 – v0.72.
|
|
20
|
+
## ✅ Shipped Milestones (v0.20.0 – v0.72.1)
|
|
21
21
|
|
|
22
|
+
### v0.72.1: Staged Mode Diff Fidelity & Indentation-Aware Tamper Defense
|
|
23
|
+
- [x] **Staged Mode Diff Fidelity (`src/git.mjs`)** — `diffText` in staged mode queries `git diff --cached <base>`, ensuring staged additions on feature branches are visible to secret and tamper scanners.
|
|
24
|
+
- [x] **Universal Dead Guard Detection (`src/security.mjs`)** — extended `DEAD_GUARD_CONDITION` to recognize literal falsities (`if False:`, `if (false)`, `if 0:`).
|
|
25
|
+
- [x] **Indentation-Aware Block Traversal (`src/security.mjs`)** — detects dead-guard assertions and failure calls in indentation-based languages (Python) without requiring `{}` braces.
|
|
26
|
+
- [x] **Comprehensive Guard Call Detection (`src/security.mjs`)** — `VACUOUS_ASSERTION` now covers both failure calls and test assertions.
|
|
22
27
|
|
|
23
28
|
### v0.72.0: Cold-Start Hardened Kernel & Tamper Defense
|
|
24
29
|
- [x] **Canonical Root Test Guard (F01)** — `test.js` at repository root is inside the tamper guard.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jules-orchestrator-kit",
|
|
3
|
-
"version": "0.72.
|
|
3
|
+
"version": "0.72.1",
|
|
4
4
|
"description": "Zero-dependency safety gatekeeper, test oracle generator, and multi-agent coordination protocol for autonomous coding agents — Google Jules, Claude Code, Codex and Gemini CLI.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
package/src/git.mjs
CHANGED
|
@@ -453,6 +453,8 @@ export function diffText(root = process.cwd(), base = "main", mode = "committed"
|
|
|
453
453
|
} catch (_) {}
|
|
454
454
|
}
|
|
455
455
|
return [committed, uncommitted, untrackedDiff].filter(Boolean).join("\n");
|
|
456
|
+
} else if (mode === "staged" || mode === "index") {
|
|
457
|
+
return git(["diff", "--cached", resolvedRef], { cwd: root, raw: true });
|
|
456
458
|
}
|
|
457
459
|
return git(["diff", `${resolvedRef}...HEAD`], { cwd: root, raw: true });
|
|
458
460
|
}
|
package/src/security.mjs
CHANGED
|
@@ -2395,7 +2395,7 @@ export const TAMPER_KIND_NAMES = Object.freeze([...new Set(TAMPER_KINDS.values()
|
|
|
2395
2395
|
* branch behind real state) is not guessable and is deliberately left alone.
|
|
2396
2396
|
*/
|
|
2397
2397
|
const DEAD_GUARD_CONDITION =
|
|
2398
|
-
/\bif\b[^;{}]*\b(?:len|len\s+of|count|size|length|num\w*|total)\s*\([^)]*\)\s*(?:<\s*0|<\s*-0\b
|
|
2398
|
+
/\bif\b[^;{}]*\b(?:len|len\s+of|count|size|length|num\w*|total)\s*\([^)]*\)\s*(?:<\s*0|<\s*-0\b|<=\s*-1\b)|\bif\s+(?:False|false|0)\s*(?::|\{|$|\b)|\bif\s*\(\s*(?:False|false|0)\s*\)/;
|
|
2399
2399
|
|
|
2400
2400
|
/**
|
|
2401
2401
|
* The calls a test uses to say "this failed": the assertion's actual teeth.
|
|
@@ -2983,24 +2983,49 @@ export function checkTestTampering(diffOrText = "", options = {}) {
|
|
|
2983
2983
|
if (L.kind !== "+" || !DEAD_GUARD_CONDITION.test(L.text)) continue;
|
|
2984
2984
|
const guardLineNo = L.newNo;
|
|
2985
2985
|
const guardText = L.text;
|
|
2986
|
-
|
|
2987
|
-
let found =
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2986
|
+
const isFailureOrAssertion = (text) => FAILURE_CALL.test(text) || ASSERTION_PATTERN.test(text);
|
|
2987
|
+
let found = false;
|
|
2988
|
+
|
|
2989
|
+
if (guardText.includes("{")) {
|
|
2990
|
+
let depth = (guardText.match(/\{/g) || []).length - (guardText.match(/\}/g) || []).length;
|
|
2991
|
+
if (depth > 0 && isFailureOrAssertion(guardText.slice(guardText.indexOf("{")))) {
|
|
2992
|
+
found = true;
|
|
2993
|
+
}
|
|
2994
|
+
for (let k = i + 1; k < hunk.lines.length && depth > 0; k++) {
|
|
2995
|
+
const t = hunk.lines[k].text || "";
|
|
2996
|
+
const opens = (t.match(/\{/g) || []).length;
|
|
2997
|
+
const closes = (t.match(/\}/g) || []).length;
|
|
2998
|
+
if (depth > 0 && isFailureOrAssertion(t)) { found = true; break; }
|
|
2999
|
+
depth += opens - closes;
|
|
3000
|
+
}
|
|
3001
|
+
} else {
|
|
3002
|
+
// Indentation-based block (Python, etc.) or single-line guard without braces
|
|
3003
|
+
const colonIdx = guardText.indexOf(":");
|
|
3004
|
+
const parenIdx = guardText.lastIndexOf(")");
|
|
3005
|
+
const afterGuard = colonIdx !== -1 ? guardText.slice(colonIdx + 1) : (parenIdx !== -1 ? guardText.slice(parenIdx + 1) : "");
|
|
3006
|
+
if (afterGuard && isFailureOrAssertion(afterGuard)) {
|
|
3007
|
+
found = true;
|
|
3008
|
+
} else {
|
|
3009
|
+
const guardIndent = (guardText.match(/^\s*/)?.[0] || "").length;
|
|
3010
|
+
for (let k = i + 1; k < hunk.lines.length; k++) {
|
|
3011
|
+
const t = hunk.lines[k].text || "";
|
|
3012
|
+
if (!t.trim() || isCommentLine(t)) continue;
|
|
3013
|
+
const lineIndent = (t.match(/^\s*/)?.[0] || "").length;
|
|
3014
|
+
if (lineIndent <= guardIndent) break;
|
|
3015
|
+
if (isFailureOrAssertion(t)) { found = true; break; }
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
2994
3018
|
}
|
|
3019
|
+
|
|
2995
3020
|
if (found) {
|
|
2996
3021
|
violations.push({
|
|
2997
3022
|
file,
|
|
2998
3023
|
line: guardLineNo,
|
|
2999
3024
|
type: "VACUOUS_ASSERTION",
|
|
3000
3025
|
reason:
|
|
3001
|
-
`Test Tamper Guard: the failure call in ${file}${guardLineNo ? `:${guardLineNo}` : ""} ` +
|
|
3026
|
+
`Test Tamper Guard: the assertion or failure call in ${file}${guardLineNo ? `:${guardLineNo}` : ""} ` +
|
|
3002
3027
|
`is guarded by a condition that can never be true ("${collapseWhitespace(guardText).trim()}"), so the ` +
|
|
3003
|
-
`assertion cannot fail. Keeping the
|
|
3028
|
+
`assertion cannot fail. Keeping the assertion in dead logic is not preservation of verification.`,
|
|
3004
3029
|
});
|
|
3005
3030
|
}
|
|
3006
3031
|
}
|