nightshift/docs/2026-05-22/iteration1.md

3.7 KiB

Iteration 1: SCENE-002 Update State Failure

Date: 2026-05-22

Run Reviewed

  • Sandbox: integ_runs/20260522T214944.385761Z
  • Run: .nightshift/runs/20260522T215005.188534Z
  • Task: SCENE-002
  • Final status: failed
  • Failed stage: update_state

What Happened

The scene workflow mostly succeeded:

  • draft_scene wrote the scene.
  • continuity_review correctly failed the first draft for pronoun drift.
  • edit_scene repaired the pronoun issue.
  • continuity_review passed after edit.
  • style_review passed.

The remaining failure happened in update_state.

NightShift reported:

File writer error: no file blocks found. Expected FILE: path with ---CONTENT---/---END--- or fenced blocks like ```file:path.py.

The model output did contain visible FILE: blocks, but it omitted the required ---END--- delimiter. It emitted:

FILE: story/plot-state.md
---CONTENT---
...

FILE: story/characters.md
---CONTENT---
...

The current parser requires ---END---, so it rejected all of the blocks.

Additional Risk Found

The rejected state update also tried to rewrite character canon in unsafe ways:

  • It changed BLOODMONEY's pronoun reference to he/him.
  • It changed Cricket's pronoun reference to they/them.
  • It compressed/replaced larger parts of story/characters.md.

That means simply accepting unterminated blocks is not enough. The parser can be more tolerant, but the state updater still needs stronger constraints so durable canon does not drift.

Suggested Fixes

Short-term fixes for this iteration:

  1. Make parse_file_updates tolerate delimiter blocks that omit ---END--- when a new FILE: block or EOF clearly terminates the previous block.
  2. Keep strict path validation and duplicate-file validation unchanged.
  3. Strengthen the state-updater prompt:
    • never edit Pronouns / Reference sections
    • preserve existing character profiles
    • prefer updating plot-state.md, timeline.md, and unresolved-threads.md
    • edit characters.md only for small additive current-status facts
  4. Add regression tests for unterminated delimiter parsing.

Longer-term follow-up:

  • Add deterministic writing-state validation that rejects changes to protected canon sections such as Pronouns / Reference.
  • Move character canon into structured data so pronoun constraints can be validated directly.

Planned Changes

  • Update delimiter block parsing in nightshift/patches.py.
  • Add parser tests in tests/test_patches.py.
  • Tighten state-updater.md in the tutorial novel template.
  • Run focused parser tests and the full suite.

Changes Made

  • parse_file_updates now accepts delimiter-style file blocks that omit ---END--- when the next FILE: header or EOF clearly terminates the block.
  • Added regression coverage for:
    • unterminated delimiter blocks before another FILE:
    • mixed terminated and unterminated delimiter blocks
  • Strengthened the tutorial novel state updater prompt to protect character canon:
    • never change Pronouns / Reference
    • never change canonical pronouns, narrative reference, identity, or core wound
    • prefer state/timeline/thread files over characters.md
    • edit characters.md only for small additive current-status facts or new named characters
  • Added deterministic protection in file-block patch generation:
    • changes to existing Pronouns / Reference sections in story/characters.md are rejected before a patch is generated
  • Added regression coverage for rejecting protected pronoun canon changes.

Verification

Focused tests:

python -m pytest tests/test_patches.py tests/test_pipeline.py -q

Result:

56 passed

Full suite:

python -m pytest -q

Result:

199 passed, 4 subtests passed