core-agent-ide/docs
Curtis 'Fjord' Hawthorne 657841e7f5
Persist initialized js_repl bindings after failed cells (#13482)
## Summary

- Change `js_repl` failed-cell persistence so later cells keep prior
bindings plus only the current-cell bindings whose initialization
definitely completed before the throw.
- Preserve initialized lexical bindings across failed cells via
module-namespace readability, including top-level destructuring that
partially succeeds before a later throw.
- Preserve hoisted `var` and `function` bindings only when execution
clearly reached their declaration site, and preserve direct top-level
pre-declaration `var` writes and updates through explicit write-site
markers.
- Preserve top-level `for...in` / `for...of` `var` bindings when the
loop body executes at least once, using a first-iteration guard to avoid
per-iteration bookkeeping overhead.
- Keep prior module state intact across link-time failures and
evaluation failures before the prelude runs, while still allowing failed
cells that already recreated prior bindings to persist updates to those
existing bindings.
- Hide internal commit hooks from user `js_repl` code after the prelude
aliases them, so snippets cannot spoof committed bindings by calling the
raw `import.meta` hooks directly.
- Add focused regression coverage for the supported failed-cell
behaviors and the intentionally unsupported boundaries.
- Update `js_repl` docs and generated instructions to describe the new,
narrower failed-cell persistence model.

## Motivation

We saw `js_repl` drop bindings that had already been initialized
successfully when a later statement in the same cell threw, for example:

    const { context: liveContext, session } =
      await initializeGoogleSheetsLiveForTab(tab);
    // later statement throws

That was surprising in practice because successful earlier work
disappeared from the next cell.

This change makes failed-cell persistence more useful without trying to
model every possible partially executed JavaScript edge case. The
resulting behavior is narrower and easier to reason about:

- prior bindings are always preserved
- lexical bindings persist when their initialization completed before
the throw
- hoisted `var` / `function` bindings persist only when execution
clearly reached their declaration or a supported top-level `var` write
site
- failed cells that already recreated prior bindings can persist writes
to those existing bindings even if they introduce no new bindings

The detailed edge-case matrix stays in `docs/js_repl.md`. The
model-facing `project_doc` guidance is intentionally shorter and focused
on generation-relevant behavior.

## Supported Failed-Cell Behavior

- Prior bindings remain available after a failed cell.
- Initialized lexical bindings remain available after a failed cell.
- Top-level destructuring like `const { a, b } = ...` preserves names
whose initialization completed before a later throw.
- Hoisted `function` bindings persist when execution reached the
declaration statement before the throw.
- Direct top-level pre-declaration `var` writes and updates persist, for
example:
  - `x = 1`
  - `x += 1`
  - `x++`
- short-circuiting logical assignments only persist when the write
branch actually runs
- Non-empty top-level `for...in` / `for...of` `var` loops persist their
loop bindings.
- Failed cells can persist updates to existing carried bindings after
the prelude has run, even when the cell commits no new bindings.
- Link failures and eval failures before the prelude do not poison
`@prev`.

## Intentionally Unsupported Failed-Cell Cases

- Hoisted function reads before the declaration, such as `foo(); ...;
function foo() {}`
- Aliasing or inference-based recovery from reads before declaration
- Nested writes inside already-instrumented assignment RHS expressions
- Destructuring-assignment recovery for hoisted `var`
- Partial `var` destructuring recovery
- Pre-declaration `undefined` reads for hoisted `var`
- Empty top-level `for...in` / `for...of` loop vars
- Nested or scope-sensitive pre-declaration `var` writes outside direct
top-level expression statements
2026-03-05 11:01:46 -08:00
..
agents_md.md Rename hierarchical_agents to child_agents_md (#9215) 2026-01-14 19:14:24 +00:00
authentication.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
CLA.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
config.md notify: include client in legacy hook payload (#12968) 2026-02-26 22:27:34 -08:00
contributing.md [Codex][CLI] Gate image inputs by model modalities (#10271) 2026-02-02 18:56:39 -08:00
example-config.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
exec.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
execpolicy.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
exit-confirmation-prompt-design.md feat(tui): retire the tui2 experiment (#9640) 2026-01-22 01:02:29 +00:00
getting-started.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
install.md feat: discourage the use of the --all-features flag (#12429) 2026-02-20 23:02:24 -08:00
js_repl.md Persist initialized js_repl bindings after failed cells (#13482) 2026-03-05 11:01:46 -08:00
license.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
open-source-fund.md chore: subject docs/*.md to Prettier checks (#4645) 2025-10-03 11:35:48 -07:00
prompts.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
sandbox.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
skills.md Point skills docs to developer documentation site (#8407) 2025-12-21 16:18:58 -08:00
slash_commands.md Replaced user documentation with links to developers docs site (#8662) 2026-01-02 13:01:53 -07:00
tui-alternate-screen.md fix: add tui.alternate_screen config and --no-alt-screen CLI flag for Zellij scrollback (#8555) 2026-01-09 18:38:26 +00:00
tui-chat-composer.md tui: preserve kill buffer across submit and slash-command clears (#12006) 2026-03-03 02:06:08 +00:00
tui-request-user-input.md tui: make Esc clear request_user_input notes while notes are shown (#10569) 2026-02-03 16:17:06 -08:00
tui-stream-chunking-review.md feat(tui): pace catch-up stream chunking with hysteresis (#10461) 2026-02-03 15:01:51 -08:00
tui-stream-chunking-tuning.md feat(tui): pace catch-up stream chunking with hysteresis (#10461) 2026-02-03 15:01:51 -08:00
tui-stream-chunking-validation.md feat(core): add configurable log_dir (#10678) 2026-02-05 01:23:30 +00:00