Skip to content

Harness² ideas (2/2): lessons.md + stall probes (stacked on #46) - #47

Merged
dancingteeth merged 17 commits into
mainfrom
feat/harness2-ideas
Oct 21, 2026
Merged

dancingteeth merged 17 commits into
mainfrom
feat/harness2-ideas

Conversation

@dancingteeth

@dancingteeth dancingteeth commented Oct 21, 2026 •

Copy link
Copy Markdown
Owner

Harness² ideas, part 2 of 2: lessons-file + stall-probes.

Based on main, not stacked. Part 1 (#46) was squash-merged; this branch merged origin/main in (no rebase, no force-push), and git diff origin/main... shows only this PR's changes.

What's in it

  • lessons.md (feat(loop)), opt-in: lessons defaults to false (per Paul in chat 2026-10-21 19:15). The frozen lessons-file acceptance, its sha pin and GOAL.md are updated to match.
    • After a green verifier run, deduped verify gotchas are written to the loop bundle and injected into the stable prompt head of the next run.
    • Gotchas are the most informative lines of each failure overcome: FAIL/error/assertion lines, stderr first, tagged with the failing [verify] step. Banner, progress and summary lines are skipped. The caps are 3 lines × 240 chars per failure and 6000 chars per file.
    • Verifier output is stored and injected as a fenced block labelled as data, not instructions. The fence is longer than any backtick run in the output.
  • stallProbes (feat(loop)), off by default: on the first hard stall, two differently guided probe workers run in sequence on one workspace before the model escalates. The better workspace is kept.
  • Workspace snapshot/restore on git objects:
    • snapshot = HEAD + branch ref + index tree + worktree tree + info/exclude;
    • restore puts the branch back first. A probe's checkout -b, orphan or detach is undone, and a deleted branch is recreated. A probe's own commits are soft-reset, and an unrelated HEAD is refused;
    • the snapshot's ignore sources are restored before deciding what to delete. A path the snapshot's ignore rules ignore is never deleted. That covers a probe that edits or deletes .gitignore or force-adds .env;
    • only the paths that changed are rewritten, symlinks are never followed, file permission bits are kept, and nothing under .cursor/loops is deleted;
    • a failed restore parks the run (status: waiting, failure domain stall_probe_restore_failed) with an AggregateError that keeps both the restore error and the original probe/worker error.
  • Limits (documented in the CHANGELOG and README): ignored files are not snapshotted, and restore isn't safe with concurrent writers (one loop per worktree; don't edit while probes run).
  • CHANGELOG also adds the missing Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46 entries: ## Facts, the plain-text tool-call warning + safety rule 7, and the HTTP/2 CANCEL crash fix.

Gates (clean committed head 083cc73)

  • bash .cursor/loops/lessons-file/verify.sh: exit 0
  • bash .cursor/loops/stall-probes/verify.sh: exit 0
  • pnpm build, pnpm typecheck: pass
  • pnpm test: 136 files, 1258 tests passed, plus the node test scripts
  • Ray's repro (exp.mjs): .env and node_modules are kept after a .gitignore edit or delete, the branch is restored after checkout -b, and mode 0600 is kept. The two concurrent-writer cases still revert, as documented.
  • The 11 new restore guard tests all fail on the previous code.
  • prompt-rules verify.sh step 8 was gated on Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46. This PR changes loopStagnationPolicy.ts on purpose.

Open items

dancingteeth and others added 12 commits October 21, 2026 18:38
…tool-call warning (Harness² prompt-rules)

- Stable ## Facts block states the verifier command and any deliverables.
- Optional loop.json deliverables + deliverableNudges (default 2): the
  harness re-prompts the worker before verify while files are missing/empty.
- Safety rule 7: never write a tool call as plain text; the next iteration
  gets a warning section when the previous reply contained one.
Review (prompt-rules, should-fix): missingDeliverables joined repoRoot
with the configured string, so an absolute path or a .. segment was
stat'd as given and the nudge told the worker to create it outside the
repo.

- loop.json parse rejects absolute (POSIX/Windows) and escaping paths.
- missingDeliverables never reports a path that is absolute or resolves
  outside repoRoot (defence in depth for callers that bypass the schema).
- Tests for both.
The run-scope doctor test asserts the 'telegramNotify is enabled'
warning, which only appears when Telegram env is unset. Under
`doppler run` (how loops run verify.sh) AGENT_LOOP_TELEGRAM_* are set, so
the test failed. The loop workers had worked around it by deleting the
vars in a file-wide afterEach, leaving process env cleared for later
tests (review should-fix, out of scope for the loops). Clear the three
vars inside that test only and restore the caller's values in finally.
… CANCEL' as a detached HTTP/2 transport error

stall-probes run 1 died with exit 1 in the JUDGE phase: @cursor/sdk
1.0.23's detached team-repo RPC (getTeamReposOrEmptyIfNotInTeam →
checkRepoBlocked → shouldBlockRead) rejected with
`[canceled] http/2 stream closed with error code CANCEL (0x8)`. The
HTTP/2 unhandled-rejection guard exists for exactly this RPC but only
matched NGHTTP2_* / ERR_HTTP2_STREAM_ERROR text, so it rethrew and Node
exited before the judge-error classification (#45) could run.

Match Connect-node's RST_STREAM wording in both the HTTP/2 guard
pattern and the general transport pattern; tests use the observed error
shape.
…mmand

Review should-fix: the later Facts join left a single newline before
## Workspace (git) when no Facts block was present, and glued the block
onto safety rule 6 (renderLoopPromptRulesSection has no trailing newline).

- Join the optional stable-head block (## Facts) after the rules with
  exactly one blank line; without it the head is byte-identical to main.
- Tests assert every heading starts at line start after a blank line.
- Nits: ## Facts named in the stable-head comment; the verifier command
  is shown exactly as configured (not trimmed).
After a green verifier run the harness writes deduped verify gotchas to
<loop>/lessons.md (capped at 6000 chars); the next run injects them into
the stable prompt head before ## Workspace (git). lessons.md is frozen
(workers cannot edit it). Opt out with "lessons": false.

Includes the lessons review fixes (own-line lessons heading in the stable
head; trim to the cap using the configured verify command rather than
re-parsing a backtick span).
… (Harness² stall-probes)

Opt-in stallProbes (default false). On the first hard stall at
escalateAfterStagnation the harness runs two sequential probe workers
(procedure hints vs repo facts), snapshots/restores the git workspace
between them, keeps the probe whose verify goes green or moves the
failure fingerprint, logs probe: { variant, kept }, then allows normal
model escalation on later stalls (at most once per run).
…und review fixes

Stall-probes loop review (grok-4.7, BLOCKERS) found data-loss bugs in the
default WorkspacePort (reset --hard + untracked delete wiped staged files
under the loop bundle; porcelain-quoted paths reverted/deleted; symlinks
followed on restore; staged renames half-restored; 0755 → 0644; UTF-8
re-encoding of binary bytes; HEAD tripwire after the writes).

createGitWorkspacePort is rebuilt on git plumbing instead of a file copy:
- snapshot is read-only: HEAD + `git write-tree` of the real index +
  a worktree tree built with `git add -A` in a throwaway GIT_INDEX_FILE
  (respects .gitignore, stores symlinks as links, keeps modes and raw
  bytes, -z plumbing so no path quoting). No stash, no ref, no file writes.
- restore diffs the current worktree tree against the snapshot
  (diff-tree -r -z --no-renames), deletes then writes only the changed
  paths, never writes through a symlink (lstat/unlink the link itself,
  parents must be real dirs), restores 0755/0644 and symlinks, never
  deletes under .cursor/loops/, then `git read-tree` restores the index
  exactly (staged adds/renames/deletions).
- HEAD check runs before any write: a probe commit on top of the snapshot
  is undone with reset --soft (reflog keeps it); an unrelated HEAD throws.

agentLoop probe round (review should-fix / must-fix):
- finalVerify runs after a green probe (from the loop's round-2 fix).
- default stagnationThreshold no longer stops the run in the probe round
  itself, so escalation can resume (from the loop's round-2 fix).
- a throwing procedure probe restores s0 before the shared fault path;
  a throwing facts probe restores the procedure attempt and logs it.
- a snapshot failure (e.g. unmerged index) skips probes for the run
  instead of ending it.
- budget stop after the probe round; probes get the deliverable nudges;
  a kept green probe is logged once (with its review), not twice.

Guard tests: quoted/unicode paths, symlink to a file outside the repo,
staged rename, 0755 file, staged new file under .cursor/loops, probe
commit / unrelated HEAD, read-only snapshot, procedure probe that throws,
single log line for a green probe. stallProbes stays off by default.
@dancingteeth

Copy link
Copy Markdown
Owner Author

Reviewey Ray sensor: #47 (Harness² 2/2, lessons-file + stall-probes), full UCR

Risk

HIGH

What could go wrong?

  • Stall-probe restore can delete gitignored files in the user's worktree (reproduced, see Blockers).
  • The restore reverts every change made during the probe window, not just the probe's. That includes the user's IDE edits, another loop's edits in the same worktree, and another loop's commits (soft-reset away).
  • lessons.md defaults to on. After every green run it writes a new file into each consumer's loop bundle, and for [verify] N — …-style verifiers its content is noise.

Review depth

  • Journeys at risk: agent-loop run with stallProbes: true (the user's worktree, index and HEAD); every green run (writes lessons.md; prompt head).
  • Line-by-line: loopStallProbes.ts (all of it), the probe branch in agentLoop.ts (~L635–911), loopStagnationPolicy.ts, loopLessons.ts, loopPrompt.ts, loopFrozenFiles.ts, loopIterationLog.ts, CHANGELOG/README.
  • Empirical checks: on a fresh clone at head. pnpm build passed. pnpm test gave 136 files, 1235 passed and 1 skipped (1236). bash .cursor/loops/lessons-file/verify.sh and bash .cursor/loops/stall-probes/verify.sh both exited 0, and the tree was clean afterwards. CI test (22) is success on this head. I also drove createGitWorkspacePort from dist/ against throwaway repos to reproduce 6 scenarios (below).
  • Reversibility: hard/one-way for deleted ignored files (.env, local data). Easy for the code.
  • Verification gap: adjacent-only. The guard tests cover symlink parents, modes, renames, index, .cursor/loops, and HEAD moves, but not ignore-rule changes, concurrent writers, or branch switches.
  • Release guardrails: stallProbes is off by default, which limits the blast radius. lessons is on by default. Ships in 0.8.3 per Paul in chat. The stall-probe fixes were hand-written and haven't been re-judged (PR body).
  • Change set: base 4209773 (Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46 head) → head da02b88. Merge-base with Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46 is its head, so the PR is cleanly stacked.
  • Overlay (REVIEWS.md): data-loss is a gating impact. The judge-sandbox item is not made worse here because the judge path is untouched, so it's advisory only.

Verdict

BLOCKERS

Blockers

  • severity: error impact: data-loss [must-fix] Restore deletes gitignored files when a probe edits or deletes .gitignore. restoreGitWorkspace computes current = worktreeTree(repoRoot) under the probe's ignore rules, then deletes every path that isn't in the snapshot (loopStallProbes.ts, the deletions loop after changedPaths). If a probe un-ignores files, they show up as "added by the probe" and get removed. Reproduced: the snapshot had .gitignore = .env\nnode_modules/ with .env and node_modules/pkg/index.js on disk. After the probe rewrote .gitignore, restore brought .gitignore back but deleted .env and node_modules/. Deleting .gitignore outright does the same. Those files were never in any git object, so they can't be recovered. Fix: restore the ignore sources first (every .gitignore path in the change set, then recompute current), or skip deleting any path that git check-ignore matches under the snapshot's rules. Add a guard test for both the edit and the delete case.

Advisory

  • The probe window reverts other writers. Reproduced: a file the user created and a tracked edit made during the window were both reverted. A commit made on top by another process was soft-reset, and its file was deleted from the worktree. The commit is still in the reflog. There's no per-worktree run lock. Document "one loop per worktree, don't edit during a probe round" in the README stallProbes row, or take a lock while probes run.
  • HEAD tripwire checks the commit, not the branch. Reproduced: a probe that ran git checkout -b probe-branch left the user on probe-branch after restore. Compare git symbolic-ref -q HEAD too.
  • Unguarded restore throws. restore at ~L841/868/870 isn't wrapped, and the HEAD "not a descendant" throw ends the run with the probe's workspace left in place. Inside the fault catch blocks (~L823/849), a throwing restore also hides the original worker error. Catch it, log both errors, and park the loop.
  • Lessons content is mostly noise. firstOutputLine takes the first line of stdout, then stderr. For this repo's own [verify] N — … scripts that's always [verify] 0 — toolchain. I simulated two different failures and the result was a single bullet with that text. Prefer the last FAIL: line, or stderr first.
  • Lessons default on in a patch release. Every consumer gets a new untracked .cursor/loops/<loop>/lessons.md after a green run. Consider lessons: false by default for 0.8.3, or call it out in the CHANGELOG as a behaviour change.
  • [instruction_injection] via lessons. Verifier output, which the worker can shape through the tests it writes, is persisted into the next runs' stable head. It's bounded to 6000 chars and frozen against edits, but it should be fenced or quoted as data rather than inlined as markdown bullets.
  • Judge sandbox (follow-up, PR body). The grok-4.7 judge ran git in the live repo (identity plus an empty commit). This PR doesn't touch that, so it isn't blocking. Track it as an issue before the next judged loop.
  • Not re-judged. The hand-written snapshot redesign was reviewed here by a human-style read plus repros only. After the blocker fix, at least run the stall-probes verify again plus the new guard tests.
  • CHANGELOG. Unreleased covers stallProbes and lessons (and Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46's deliverables). Add the snapshot limits: ignored files aren't snapshotted, and it's not safe with concurrent writers.

Nits

  • Restored files get mode 0644/0755 whatever their original mode. A probe-touched 0600 file comes back as 0644 (reproduced).
  • ensureRealParentDirs unlinks a file or symlink parent even when it sits under protectedDirs (from reading the code, not reproduced).
  • When no probe wins, lastVerify and the log carry the facts probe's result while the workspace is back at s0. The fingerprints match, so this is only cosmetic.
  • git add -A into a temp index hashes every untracked, non-ignored file into the object DB on each snapshot. That's fine, but it can be slow on large untracked trees.

#46 was squash-merged; its tree equals 4209773, the base of this branch,
so the resolution keeps this branch's content.
@coderabbitai

coderabbitai Bot commented Oct 21, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…rk with both errors on a failed restore

Review of #47 (BLOCKERS):

- Blocker (data-loss): restore decided what to delete under the probe's
  ignore rules, so a probe that edited or deleted .gitignore made .env /
  node_modules look probe-added and they were deleted. Restore now puts
  the snapshot's ignore sources back first (every .gitignore in the
  change set, plus $GIT_DIR/info/exclude, captured in the snapshot),
  recomputes the diff under those rules, and never deletes a path that
  git check-ignore --no-index matches (also covers a probe that
  force-added an ignored file to the index).
- HEAD tripwire also checks the branch: the snapshot records the
  symbolic ref; a probe's git checkout -b / --orphan / --detach is
  switched back (HEAD repointed, worktree untouched; a deleted branch is
  recreated at the snapshot commit) before the commit check runs.
- A restore that throws no longer escapes the probe round or hides the
  worker error: it is wrapped in an AggregateError (restore error +
  original probe/worker error, cause = original) and the run parks
  (status waiting, failure domain stall_probe_restore_failed).
- Nits: a restored regular file keeps its own permission bits (0600
  stays 0600; only the exec bit follows git); a file/symlink parent under
  a protected dir is never unlinked.
- Guard tests from the repro (edit/delete .gitignore, force-add,
  info/exclude, nested .gitignore, checkout -b with and without commits,
  orphan, detached, deleted branch, modes, protected parent; all fail on
  the previous code) and agentLoop tests for parking on a failed restore.
Review of #47:

- lessons defaults to false (opt-in) — no new file in consumers' loop
  bundles on every green run in a patch release.
- Verifier output is stored, and injected into the prompt, as a fenced
  block under a notice that it is data, not instructions. The fence is
  longer than any backtick run in the output so it cannot be closed
  early; older unfenced files are re-quoted when read into the prompt.
- Gotchas are the most informative lines of each failure overcome instead
  of the first output line (always '[verify] 0 — toolchain' for this
  repo's verifiers): FAIL / error / assertion lines, stderr first, tagged
  with the failing [verify] step; banner, progress and summary lines are
  skipped; ANSI stripped; at most 3 lines of 240 chars per failure; the
  6000-char file cap still drops the oldest.

Frozen lessons-file acceptance updated for the default change: its
wiring tests now opt in with lessons: true, and it asserts the default is
false; the pinned sha256 in verify.sh is updated to match. No other
verify.sh change.
…in, #46 entries

- stallProbes: restore behaviour (branch/HEAD, ignore sources, parking on
  a failed restore) and its limits: ignored files are not snapshotted,
  and it is not safe with concurrent writers (one loop per worktree).
- lessons: opt-in, quoted as data, informative lines.
- Missing #46 entries: ## Facts block, plain-text tool-call warning +
  safety rule 7, HTTP/2 CANCEL crash fix.
@dancingteeth
dancingteeth changed the base branch from feat/harness2-prompt-rules to main October 21, 2026 15:03
@dancingteeth

Copy link
Copy Markdown
Owner Author

Reviewey Ray sensor: #47 re-review at c24c7b9 (now based on main), full UCR

Risk

HIGH

What could go wrong?

  • Stall-probe restore can still delete ignored files, but only when a probe changes an ignore source that lives outside the worktree tree (reproduced, see Advisory). The common case, a .gitignore or info/exclude edit, is fixed.
  • If a probe runs git reset --hard <ancestor>, the run parks as designed. The user's uncommitted work then exists only as unreferenced snapshot objects, and the park message doesn't say where they are.
  • A frozen acceptance spec and its sha pin were edited outside the loop to flip a product default. That's an owner call, not a code question.

Review depth

  • Journeys at risk: agent-loop run with stallProbes: true (worktree, index, HEAD/branch); lessons: true runs (prompt head).
  • Line-by-line: loopStallProbes.ts diff since da02b88 (restoreHead, ignoredPaths, applyChanges two-pass, restoredFileMode, wrapProbeRestoreError). The agentLoop.ts probe branch (restoreProbeWorkspace and its 4 call sites). loopLessons.ts (fencing, gotcha picking). loopFailureDomain.ts, loopRunScoreboard.ts, the lessons-file frozen bundle diff, CHANGELOG/README.
  • Empirical checks: on a fresh worktree at c24c7b9. pnpm build passed. pnpm test gave 136 files, 1257 passed and 1 skipped (1258). lessons-file/verify.sh exited 0 and stall-probes/verify.sh exited 0. prompt-rules/verify.sh exited 1, but only at step 8 ("out-of-scope loopStagnationPolicy.ts changed"); steps 0–7 passed, as the PR body expects. The tree was clean afterwards. CI test (22) is success on this head. I re-ran the 6 earlier createGitWorkspacePort scenarios plus 13 variants against the rebuilt dist/, all on throwaway repos with .env, node_modules/, a nested sub/.gitignore → local.db, and an info/exclude → scratch/:
Probe action Ignored files kept Other
rewrite / delete root .gitignore ✅ .gitignore restored
user edits during the window ✅ reverted (documented limit)
checkout -b / --orphan / --detach / branch -m ✅ back on refs/heads/main at s0
orphan + rm -rf + commit ✅ tracked files back, probe file gone
commit on top ✅ soft-reset to s0
mode 0600 file edited — stays 0600, content restored
edit / delete info/exclude ✅ restored
git add -f .env node_modules ✅ content intact, index clean
delete nested .gitignore; add ! negation in nested or new .gitignore ✅ —
create info/exclude with !.env when the snapshot had none (.env ignored via core.excludesFile) ❌ .env deleted —
git config core.excludesFile /dev/null ❌ .env deleted —
reset --hard HEAD~1 with dirty work — parks (refuses); dirty work only in snapshot tree
  • Reversibility: hard/one-way for the two ❌ cases. Easy for the code.
  • Verification gap: adjacent-only. The guard tests cover in-tree ignore sources, but not ignore sources outside the tree or a park-recovery pointer.
  • Release guardrails: stallProbes and lessons are both opt-in now. Ships in 0.8.3 per Paul in chat. The PR is still a draft.
  • Change set: base c9dc3fb (main, Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46 squash) → head c24c7b9. Commits since the last sensor: 10df420 (merge of main), 23fdcd2, ee9e9d4, c24c7b9. No force-push.
  • Overlay (REVIEWS.md): there's no frozen-file law in REVIEWS.md or AGENTS.md beyond "Do not edit GOAL.md mid-loop. The harness restores GOAL.md, verify.sh, loop.json … if a worker edits them" (AGENTS.md), which is about workers during a run. The binding law is in the loop's frozen GOAL.md: "FAILURE POLICY: … Never edit acceptance.ts.txt, verify.sh, GOAL.md or loop.json …" and "HUMAN GATE: … Paul reviews the branch."

Verdict

ADVISORY

Advisory

  • Frozen-spec edit needs Paul's sign-off. ee9e9d4 adds lessons: true to the spec's bundle() defaults, adds it('is opt-in: lessons defaults to false'), and re-pins ACC_SHA (now 447ea4b5…, which matches the file). I diffed it against da02b88: purely additive, with no assertion removed or loosened. Every wiring test still exercises the feature, and the lessons: false override test still works because overrides spread last. It isn't a verify-bypass, but the lessons-file GOAL.md frozen policy forbids the edit and its human gate is Paul. The default flip came from a review advisory, not from Paul. GOAL.md still says "(default true)" (L16, L21), so goal and spec now disagree. Get Paul's yes, then update GOAL.md to match in the same PR, or say it stays as a historical record.
  • Ignore sources outside the tree (reproduced, the two ❌ rows above). info/exclude is only put back when the snapshot had one, so a probe-created exclude file stays. Changes to core.excludesFile aren't covered at all. The robust fix is mechanism-independent: at snapshot time record git ls-files -o -i --exclude-standard -z (plus ignored paths that are force-added), and never delete a path that was ignored at snapshot time, whatever the rules on disk say at restore. Also delete a probe-created info/exclude when snap.infoExclude === null. Narrow cases (a probe has to tamper with git's own config), so I'm not gating on them.
  • Park recovery pointer. On stall_probe_restore_failed, the user's uncommitted work exists only in snap.worktreeTree and snap.indexTree. Those are unreferenced objects, not in the reflog, and gc can prune them. Include the oids in the park message and failure domain, or pin them under a ref such as refs/agent-loop/probe-snapshot, so git read-tree/checkout <tree> -- . can recover. Optionally soft-reset to snap.head even when HEAD moved to an ancestor, since the snapshot commit is still reachable.
  • Unguarded mid-round snapshot. const sA = await workspacePort.snapshot() (agentLoop.ts ~L880) isn't wrapped. If the procedure probe leaves unmerged entries, write-tree throws out of runAgentLoop instead of parking. Route it through the same park path. Found by reading the code, not reproduced.
  • prompt-rules scoreboard on main. After merge, .cursor/loops/prompt-rules/verify.sh step 8 stays red for good, because the frozen out-of-scope check now sees loopStagnationPolicy.ts changed. Mark that loop finished or archived so nobody re-runs it expecting green.
  • Leftovers: the PR body still says "Stacked on Harness² ideas (1/2): prompt-rules — Facts head, deliverable guard, plain-text tool-call warning #46", still says "lessons defaults to true", and still lists gates at da02b88. No concurrent-writer lock exists; it's documented as a limit in the CHANGELOG/README, which is acceptable for an opt-in feature. The judge sandbox (grok-4.7 ran git in the live repo) remains a follow-up issue. It isn't touched here, so it isn't gating.
  • Not re-judged: this sensor stands in for the skipped judged loop run on the restore redesign.

Nits

Copy link
Copy Markdown
Owner Author

Owner decision, per Paul in chat (2026-10-21 19:15 Tbilisi): approved. The edit to the frozen lessons-file acceptance spec and its verify.sh ACC_SHA pin can stay. That edit makes lessons opt-in (off by default) for 0.8.3.

Before merge:

The remaining advisories can be follow-ups. They're in the re-review: ignore rules from outside the repo tree, the recovery pointer when a run parks, the unguarded mid-round snapshot, and marking the prompt-rules loop finished.

— Reviewey Ray

Per Paul in chat 2026-10-21 19:15 (review of #47). verify.sh does not pin
GOAL.md, so no sha change.

Copy link
Copy Markdown
Owner Author

Reviewey Ray sensor: 083cc73 (delta from c24c7b9)

Pass 0: one commit, .cursor/loops/lessons-file/GOAL.md (+4 −2). It updates the frozen spec to match the shipped behaviour: lessons defaults to false (opt-in), per Paul in chat 2026-10-21 19:15.
Pass 1: LOW risk. Docs and spec only, and the code is unchanged since the c24c7b9 re-review. CI test (22) is green, the base is main, and it merges cleanly.

Blockers

None.

Advisories

No new ones. The earlier advisories are now tracked in #48 to #52.

Verdict: PASS

This is a review result, not a merge decision. Paul approved merging #47 once this push is green, so I'm merging it now.

@dancingteeth
dancingteeth marked this pull request as ready for review October 21, 2026 15:21
@dancingteeth
dancingteeth merged commit c5614b5 into main Oct 21, 2026
1 check passed
@dancingteeth dancingteeth mentioned this pull request Oct 21, 2026
dancingteeth added a commit that referenced this pull request Oct 21, 2026
- package.json 0.8.3 (lockfile has no root version; unchanged).
- Version labels kept in sync: README current line, CONSUMERS.md,
  docs/embed-api.md, llms.txt, site/ pages + site/llms.txt, and the site
  version test.
- CHANGELOG: Unreleased -> 0.8.3 — 2026-10-21 with PR links (#44 #45
  #46 #47); adds the parked-runs-exit-2 and deliverables-confined
  entries.

Co-authored-by: dancingteeth <dancingteeth@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant