agy-context-saver 1.3.0 → 1.3.2
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 +19 -0
- package/mcp/index.js +1 -1
- package/package.json +1 -1
- package/rules/AGENTS.md +26 -6
- package/scripts/execution-guard-hook.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ All notable changes to `Agy-Context-Saver` will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.3.2] - 2026-10-07
|
|
9
|
+
|
|
10
|
+
### Governance & Command Semantics (LH-11 Hardening)
|
|
11
|
+
- **Opt-In Fail-Fast Semantics**: Reverted forced `-x -q` parameter injection on bare test runner invocations to preserve native command semantics. Fail-fast (`-x`, `--maxfail=1`) remains strictly opt-in, preventing the "whack-a-mole" repair loop and preserving complete failure blast radius visibility across multi-module test suites.
|
|
12
|
+
- **Architectural Separation**: Replaced forced command mutation with the **Coordinated Watchdog Protocol** and **Mandatory Pre-Yield Status Cards** in `rules/AGENTS.md`, ensuring visibility during multi-minute full-repository sweeps without distorting test results.
|
|
13
|
+
- **Loophole Ledger Synchronization**: Updated `LEDGER.md` (LH-11) documenting the trade-offs of fail-fast injection vs native command semantics.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [1.3.1] - 2026-10-07
|
|
18
|
+
|
|
19
|
+
### Governance & Asynchronous Execution Observability (LH-11)
|
|
20
|
+
- **Fail-Fast Auto-Injection on Bare Test Sweeps**: `execution-guard-hook.mjs` transparently normalizes bare `pytest` and `python -m pytest` invocations to include `-x -q` (fail-fast, quiet mode). In large codebases (e.g. 900+ tests), this prevents multi-minute unconstrained sweeps by stopping execution immediately at the first failure.
|
|
21
|
+
- **Coordinated Watchdog Protocol Codification**: Updated `rules/AGENTS.md` to explicitly train agents on the Coordinated Watchdog Protocol: when launching heavy background operations ($> 15\text{s}$), agents must schedule a coordinated watchdog timer (`schedule(DurationSeconds=45, ...)`) to prevent silent yielding into unmonitored execution black holes.
|
|
22
|
+
- **Mandatory Pre-Yield Status Cards**: Codified in `rules/AGENTS.md` that agents launching background tasks must output a structured markdown status card (command, scope, estimated duration, watchdog tier) before yielding their turn, eliminating user uncertainty during prolonged runs.
|
|
23
|
+
- **Loophole Ledger LH-11 Addition**: Formally documented LH-11 (Silent Background Deadlock & Bare Sweep Exhaustion) from Incident `07b0f8d8` in `LEDGER.md`.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
8
27
|
## [1.3.0] - 2026-10-07
|
|
9
28
|
|
|
10
29
|
### Governance & Loophole Elimination
|
package/mcp/index.js
CHANGED
|
@@ -98,7 +98,7 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
|
98
98
|
const rulesPath = path.resolve(__dirname, "../rules/AGENTS.md");
|
|
99
99
|
|
|
100
100
|
const SERVER_NAME = "agy-context-saver";
|
|
101
|
-
const SERVER_VERSION = "1.3.
|
|
101
|
+
const SERVER_VERSION = "1.3.2";
|
|
102
102
|
|
|
103
103
|
// --- Tools Specification ---
|
|
104
104
|
const TOOLS = [
|
package/package.json
CHANGED
package/rules/AGENTS.md
CHANGED
|
@@ -6,11 +6,27 @@
|
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
## Layer 1: Background Tasks &
|
|
10
|
-
- **Zero-Tolerance on
|
|
11
|
-
- **
|
|
12
|
-
|
|
13
|
-
-
|
|
9
|
+
## Layer 1: Background Tasks & Proportional Backoff Protocol (Reactive Wakeup SSOT)
|
|
10
|
+
- **Zero-Tolerance on Busy-Polling**: Do NOT call `manage_task(Action='status')` in tight loops or schedule rapid timers to wait for running background tasks. Background tasks execute asynchronously and automatically resume the agent via **Reactive Wakeup** (`<SYSTEM_MESSAGE>`).
|
|
11
|
+
- **Proportional Backoff Protocol**: Diagnostic inspections scale along an exponential backoff curve:
|
|
12
|
+
$\text{Cooldown} = \min(600, \text{round}(30 \times 2.5^{\text{pollCount} - 1})) \quad [0\text{s} \to 30\text{s} \to 75\text{s} \to 188\text{s} \to 469\text{s} \to 600\text{s}]$
|
|
13
|
+
- Check #1 (Immediate upon launch): Permitted ($0\text{s}$).
|
|
14
|
+
- Premature status checks within an active backoff window are denied. 5 consecutive premature checks trigger the `force_ask` circuit breaker.
|
|
15
|
+
- Silent/hung background tasks: Once the backoff window elapses, a single diagnostic check is permitted to inspect logs, detect deadlocks, and issue `manage_task(Action='kill')` if needed.
|
|
16
|
+
- **Coordinated Watchdog Protocol (`schedule`)**: For long-running operations (builds, migrations, test suites) expected to take $> 15\text{s}$:
|
|
17
|
+
- Schedule a coordinated watchdog timer: `schedule(DurationSeconds=45, Prompt="Check status of background task-X", TimerCondition="task-X")`.
|
|
18
|
+
- Watchdog timers must satisfy `DurationSeconds >= Math.max(30, requiredBackoffSec)`. Short timers are denied.
|
|
19
|
+
- If the task completes early, Reactive Wakeup auto-cancels the timer and resumes the agent immediately.
|
|
20
|
+
- If the task is still running when the watchdog fires, perform a legal diagnostic check (`manage_task(status)`) and post a live progress update in chat for the user.
|
|
21
|
+
- **Mandatory Pre-Yield Status Card**: When a command moves to the background, NEVER yield with a silent or generic one-liner. Output a structured Markdown card so the user is never left wondering if the IDE has stalled:
|
|
22
|
+
```markdown
|
|
23
|
+
### ⏳ Background Execution Started
|
|
24
|
+
- **Command**: `<cmd>`
|
|
25
|
+
- **Scope / Target**: `<scope>`
|
|
26
|
+
- **Estimated Duration**: `~X minutes`
|
|
27
|
+
- **Watchdog Active**: Coordinated check scheduled in 45s via Reactive Wakeup.
|
|
28
|
+
```
|
|
29
|
+
- **Kill & Stdin Immediate Exemption**: `manage_task(Action='kill')` and `manage_task(Action='send_input')` are ALWAYS permitted immediately ($0\text{s}$ backoff, zero penalties).
|
|
14
30
|
|
|
15
31
|
---
|
|
16
32
|
|
|
@@ -34,7 +50,11 @@
|
|
|
34
50
|
|
|
35
51
|
## Layer 3: Synchronous Execution & Subagent Delegation
|
|
36
52
|
- **Maximum Synchronous Window**: Non-daemon `run_command` calls are automatically set to `WaitMsBeforeAsync: 10000` to complete synchronously and prevent unnecessary background detachment.
|
|
37
|
-
- **Targeted Test Execution
|
|
53
|
+
- **Targeted Test Execution & Opt-In Fail-Fast (LH-11)**:
|
|
54
|
+
- **Targeted Invocations**: In interactive turns, prefer targeting specific test files or directories (e.g. `pytest tests/test_core.py`) rather than running full multi-minute repository sweeps.
|
|
55
|
+
- **Fail-Fast Flags are Opt-In**: Fail-fast flags (`-x`, `--maxfail=1`) are opt-in. Use them when quickly debugging a localized failure, but omit them when assessing the full blast radius across the codebase to avoid the "whack-a-mole" loop.
|
|
56
|
+
- **Coordinated Watchdog Mandatory for Full Sweeps**: When running full multi-minute test sweeps without `-x`, agents **MUST** pair execution with the **Coordinated Watchdog Protocol** (`schedule(DurationSeconds=45, ...)`) and output a **Pre-Yield Status Card**. Never yield silently.
|
|
57
|
+
- **Subagent Delegation for Deep Audits**: When a comprehensive repository-wide test audit is required, delegate the sweep to a subagent (`invoke_subagent`) to keep the main thread responsive.
|
|
38
58
|
- **Subagent Delegation**: Delegate heavy multi-file exploration and exploratory research to subagents (`invoke_subagent`). Subagents absorb intermediate steps and return high-signal summaries.
|
|
39
59
|
- **Benchmark / Evaluator Integrity**: Never mutate benchmark definitions, prompt templates, or scoring artifacts during an active evaluation without explicit user confirmation.
|
|
40
60
|
|
|
@@ -290,7 +290,7 @@ function rewriteCommandWithRtk(rawCmd) {
|
|
|
290
290
|
return trimmed;
|
|
291
291
|
}
|
|
292
292
|
|
|
293
|
-
|
|
293
|
+
// Fast-path bypass for shell builtins, non-rewritable binaries, and powershell cmdlets
|
|
294
294
|
const firstWord = (trimmed.match(/^[^\s"']+/)?.[0] || "").toLowerCase();
|
|
295
295
|
if (
|
|
296
296
|
NON_REWRITABLE_BINARIES.has(firstWord) ||
|