Skip to content

07 · update-cursor-node

What this scenario proves

Updating Archon from one tagged version to the next must not overwrite runtime ledgers (drift.md, debt.md, memos.md, run/state files) and must update only the canonical files whose sha256 has changed.

Specifically:

  1. The agent fetches a new manifest.json from aaep.site (or a pinned ?version= query for reproducibility).
  2. It diffs the local files against the new sha256 list.
  3. It writes only changed files, keeping a .bak for any non-trivial overwrite.
  4. runtime_ledger_paths from the manifest are read-only the entire time.
  5. The .archon/VERSION file moves to the new version exactly once, at the end, with original line endings preserved.

Test environment

Fixtureoutput of scenario 01 + scenario 05 (i.e. has 1 real drift row)
IDECursor
Manifest "from" versionv0.1.0
Manifest "to" versionv0.1.1 (or any newer tag at run time)
OSsame as scenario 01

Pre-conditions

  1. Scenarios 01 + 05 both ✅.
  2. git status is clean — pending changes would obscure the diff.
  3. A newer tagged manifest exists at aaep.site/manifest.json?version=v0.1.1 (or skip if not yet tagged — re-run when one ships).

Steps

text
1. In Cursor, paste exactly:
     hi archon, update yourself
   (URL-less; the wake rule routes this to the update protocol.)
2. The agent should:
   - fetch the new manifest
   - print a planned-changes table (file, old-sha, new-sha, action)
   - ask for confirmation
3. Confirm.
4. Watch it write changed files + create .bak siblings for any
   overwrite that isn't byte-identical to the prior canonical bytes.
5. Inspect `.archon/VERSION` — should match the new version.
6. Inspect `git diff` — only the planned files should appear changed.
7. Run `npm run validate` — should still be 0.

Expected outcome

CheckExpected
Agent prints a planned-changes table before writingyes
.archon/drift.md row countunchanged (preserved)
.archon/debt.md contentunchanged
.archon/memos.md contentunchanged
.archon/VERSIONmatches the "to" manifest version
python3 scripts/archon-check.py --root . exit code0
Any Cursor commands / rules / skills file changed only when its sha256 differs from the new manifestyes
npm run validate exit code0
For each non-trivially overwritten file, a <file>.bak existsyes (or all bak files cleaned per protocol — match whichever the protocol page specifies)

Demo recordings

Will be replaced by docs/public/videos/update-cursor-node.mp4 once recorded. See videos/README for upload conventions.
Will be replaced by docs/public/asciinema/update-cursor-node.cast embedded via the asciinema-player web component. See asciinema/README for the recording command.

Run records

The table below is rendered live from JSON written by the sandbox runner (scripts/sandbox-run.mjs) under docs/testing/sandbox/runs/update-cursor-node/. To add a new row, run

bash
node scripts/sandbox-run.mjs --only=update-cursor-node
Started (UTC)ManifestRunnerResultDurationNotesRecord
2026-05-06 10:24:37 UTCv0.1.0cli✅ passing353 msJSON
2026-05-06 06:10:27 UTCv0.1.0cli✅ passing366 msJSON
2026-05-06 00:55:45 UTCv0.1.0cli✅ passing351 msJSON
2026-05-06 00:40:11 UTCv0.1.0cli✅ passing373 msJSON
2026-05-05 15:00:36 UTCv0.1.0cli✅ passing314 msJSON
2026-05-05 14:55:21 UTCv0.1.0cli✅ passing374 msJSON
2026-05-05 14:22:55 UTCv0.1.0cli✅ passing366 msJSON
2026-05-05 14:04:55 UTCv0.1.0cli✅ passing363 msJSON
2026-05-05 14:00:02 UTCv0.1.0cli✅ passing375 msJSON
2026-05-05 13:55:07 UTCv0.1.0cli✅ passing369 msJSON

Known limitations

  • This scenario cannot be executed until at least two consecutive tagged manifest versions exist on aaep.site. Until then the status stays ⏳ and the run record carries the "awaiting tag" note.
  • Does not test rollback. A separate update-rollback scenario can be added if/when rollback is part of the protocol.

Cross-references

json
{
  "runnable": "cli",
  "fixture": "fixtures/sandbox-node-ts",
  "ide_platform": "cursor",
  "prerequisites": [
    {
      "name": "archon install",
      "cli": "install",
      "flags": [
        "--with=cli"
      ]
    }
  ],
  "steps": [
    {
      "name": "archon update (self-update)",
      "cli": "update",
      "flags": []
    }
  ],
  "assertions": [
    {
      "file_exists": ".archon/VERSION"
    },
    {
      "file_exists": ".archon/soul.md"
    },
    {
      "dir_exists": "tools/archon-cli"
    }
  ],
  "notes": "Same-version self-update (manifest only ships v0.1.0). Proves the update path is non-destructive. Extend when v0.2.0 ships to install a pinned older version first."
}

Released under the Apache-2.0 License.