Skip to content

fix: merge upstream reliability fixes into house - #14

Merged
jazz127 merged 19 commits into
housefrom
fm/backpass-house-upstream-sync-1030
Oct 30, 2026
Merged

jazz127 merged 19 commits into
housefrom
fm/backpass-house-upstream-sync-1030

Conversation

@jazz127

@jazz127 jazz127 commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

Merge upstream main at 0c864ce29e355590a4ccea6eea79e5c3147b302b into the fork's house line with merge commit 3e6becc74f755fae3fa53dd9bc81a7c9f18223b7. Upstream has not moved from the launch pin; the first parent is origin/house at d432590d6233a8411408d1fee069052740c72f48.

Upstream changes brought in:

  • 0c864ce: stamp successfully applied proposals, refuse replay, and roll back writes if persistence fails.
  • df9cdce: recognize CLAUDE.md import pointers with leading headings.
  • a2d710b: report measured UTF-8 prompt size on synthesis failure.
  • 24f8283: redact standalone apikey_ credentials.
  • 1a1a175: report watched-file changes as observed and preserve fingerprint checks across candidate fallthrough.
  • 9ded619: deduplicate symlinked skills in the analysis index while retaining per-copy budget accounting.
  • 3882b86: finish the first attempted Claude analysis call before fan-out.
  • 46a2169: exclude VCS internals and binary files from synthesis staging.
  • 3986087: classify adapter-rejected models as unavailable.
  • Upstream release bookkeeping through 0.1.42 is retained exactly, including CHANGELOG.md, package.json and the release manifest.

Conflicts and resolutions:

  • README.md: use upstream's precise pointer definition with leading headings; retain house observer terminology and source, private-state and routing documentation.
  • src/analyze.js: retain house resolved-route evidence keys; adopt upstream warm-up ordering and count analysis/usage once, after evidence persistence succeeds.
  • src/apply/writer.js: retain house rejection provenance inside upstream guarded state persistence, applied stamps and rollback handling.
  • src/synthesize.js: retain house external-source route binding and rejection reset alongside upstream staging fingerprint checks, prompt-size diagnostics and observed-change reporting.

Also read every file modified on both branches, including clean merges in agents, apply command, memory, state and regression tests. No house behavior was dropped or replaced.

Pipeline follow-up commits preserve the merge history: e8ce638b fixes the review findings, 2435d002 documents the invocation and watched-file behavior, and e5314226 fixes formatting and the optional workspace identity type annotation. All final lint, format and type checks passed after frozen dependency installation.

Pipeline review fixes in e8ce638b: serialize the first actual Claude invocation even after fallthrough, refresh skill metadata and budget context with the staged snapshot, and derive originals from the staged bytes to avoid a fingerprint race.

Known follow-up (R4): concurrent apply reviews can pass freshness checks together; a losing proposal-stamp write can then roll back a successful apply. Firstmate approved retaining this known pre-existing concurrency gap for a separate follow-up because cross-process serialization adds coordination state outside this upstream merge.

Offline validation before review fixes: 527 affected-stage tests passed, with zero failures or skips. After the pipeline fixes, 327 targeted checks and 12 agent checks passed. A synthetic pre-fix comparison exercised seven regression cases: six failed against the original merge and one control passed; the target checks pass at the fixed head. The focused CLI merge regression also passed: mixed accept/reject review stamps the proposal and preserves rejection reason and provenance. Lint, formatting and type checks passed. This coverage uses fixtures and stand-in model adapters; authenticated provider behavior was not exercised. The requested manual full-suite follow-up remains post-merge; the configured House CI also runs its full check.

Authenticated scenarios not exercised (approved Test exception):

  • Claude analysis concurrency, including fallthrough and preparation failures.
  • Synthesis staging exclusions and concurrent repository writes.
  • Skill changes during synthesis snapshot preparation and accounting.
  • Synthesis prompt-failure byte-size diagnostics.
  • Adapter-rejected model classification.

These scenarios have offline regression coverage; authenticated model sessions were unavailable. The isolated adapter attempt stopped at authentication. Firstmate approved continuing on this basis.

The fetched Git refs/history and offline validation logs were captured in the artifact below. VISION.md's closing accept/resist test supports this merge: it strengthens evidence accuracy and review persistence without expanding write scope or weakening evidence floors.

evidence-artifact: /evidence.txt
evidence-command: cat /sync-report.txt /targeted-tests.log /merge-regression.log /lint.log /format.log /typecheck.log /resolution-lint.log /resolution-format.log /pipeline-report.txt /nm-lint-current.txt /pipeline-evidence/targeted-tests-corrected.log /pipeline-evidence/agent-fallthrough-tests.log /pipeline-evidence/pre-fix-regressions.log /pipeline-evidence/live-cli.json /pipeline-evidence/real-adapter-attempt.json
evidence-captured: 2026-10-30T21:05:11Z

Pipeline

Updates from git push no-mistakes

dmmdea and others added 19 commits October 19, 2026 21:34
…unchenguid#219)

When the Claude ACP adapter rejects the requested model after session/new,
acpx prints `Failed session/set_config_option for model "<id>": Invalid value
for config option model` and exits 1. classifyAcpxFailure did not recognize
that line, so openSession reported "has no session support" and an analysis
pass with an effort stopped with "its acpx adapter does not support sessions -
upgrade acpx or omit the effort override", although sessions worked and acpx
was current. Seen with acpx 0.19.6, claude-agent-acp 0.81.2 and a Claude Code
build whose advertised model list predates the pinned model.

The classifier now reads that line as model-unavailable, the verdict kunchenguid#185
gave "does not support this model": a pinned pass names the model, and an
auto-picked one falls through to the next candidate.

Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…g copy (kunchenguid#220)

* fix(workspace): keep VCS internals and binary files out of the staging copy

prepareWorkspace walked every skill directory whole, so a skill checked out
with its own .git, or one that ships compiled tools, was copied into
.backpass/synthesis/ and read into `originals` as utf-8 text. On a 1.7 GB
user skills directory (one skill carried a 173 MB object store and six
~82 MB executables) synthesis exhausted Node's 4 GB heap while building the
staging copy, before the edit turn opened, and the process died with exit
134.

The walk now prunes `.git`, `.hg` and `.svn` without descending into them,
and a file whose first 8,000 bytes hold a NUL (git's own binary test) is not
staged. Both are named in `unstageable` with their reason, so nothing is
dropped silently. A binary read as utf-8 was never a faithful original, and
no text edit applies to it. Supporting text files such as notes.txt are
still copied whole.

Fixes kunchenguid#75.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* no-mistakes(ci): Fixed ci-1 in src/workspace.js. The invariant is that nothing synthesis writes is silently dropped. measureWorkspace now passes a collector to its walkFiles call, so VCS entries (.git, .hg, .svn, directories or a .git file) that the walk prunes are reported in `stray`. The reason is a new named constant, STRAY_VCS: "synthesis wrote version-control internals, which are never carried or applied". Staging never copies a VCS entry, so any one found at measure time was written during synthesis. Pruning in walkFiles is unchanged: those entries are still never descended into or copied. Paths are named the way other stray notes are, mapped back to the logical repo path. To do that I pulled the existing mapping lookup and logical-path code into two small local helpers, `mappingFor` and `logicalFor`, which the normal stray loop now uses too. Binary files, confinement reasons and the other stray rules are untouched, and I added no tests. Checks: eslint and tsc are clean and prettier --write was applied. I ran test/workspace.test.js, test/synthesize.test.js and test/synthesis-cli.test.js: the same 46 tests fail before and after the change (compared by name). The ones I looked at fail with EPERM on fs.symlink, the Windows host limit noted in the intent. A one-off script confirmed the behaviour: prepareWorkspace still reports `.agents/skills/foo/.git` as unstageable, measureWorkspace shows no stray before a write, and after writing `.agents/skills/foo/.git/config` and a root `.git` file it reports both in `stray` with STRAY_VCS and zero changes

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…#226)

* fix(analyze): run the first Claude analysis call alone before the fan-out

At --jobs above 1 the first wave of analysis calls each starts with its own
short-lived 'sessions new' helper. When Claude's OAuth token is due, one helper
takes .oauth_refresh.lock and exits before the refresh ends, so every parallel
session then fails with 'another Claude Code process is refreshing it' and the
run dies before analysing anything.

With the claude agent, run transcripts one at a time until one has made a model
call (a skipped trivial session made none), so a due refresh finishes inside a
single long-lived process, then fan out. Other agents keep the full fan-out.
This is not a retry: nothing is re-run.

Closes kunchenguid#203

Signed-off-by: Gaurav Jadhav <[email protected]>

* no-mistakes(review): Fix warm-up to detect model-call attempts, not failure vs skip

* no-mistakes(document): Fix no-useless-assignment lint error in analyze.js warm-up loop

* no-mistakes(review): Fix outcome overwrite when writeEvidence throws after model call succeeds

* no-mistakes(document): Format new warmup test file; no stale docs found

* no-mistakes(ci): Addressed the Greptile finding (ci-1) in test/analyze-claude-warmup.test.js: the existing warm-up tests never exercised a failed first model call, so `err.modelCallAttempted` had no coverage. Added a new test case plus a corresponding branch in the fake acpx fixture: a session id starting with "fail" now returns unparseable text after the fake prompt call (a genuine model-call attempt that fails analysis afterward, not a blank/empty-output case, since a pinned agent turns empty-output into a fatal UserError that would abort the whole run). The new test asserts the failing first call still runs alone (new/prompt/failed, nothing else starts), counts as attempted/failed, and the remaining calls then run together (overlapping prompts) and succeed. Ran `pnpm run check` (lint, format:check, typecheck, full test suite — 956 tests) with zero failures

---------

Signed-off-by: Gaurav Jadhav <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
)

* fix(skills): dedupe the analysis index by realpath

List each shared skill file once in analysis prompts while preserving every loaded entry for per-copy budget accounting. Keep distinct same-name skills visible.

Closes kunchenguid#202

* no-mistakes(document): Document realpath-deduplicated skill analysis indexing
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…served (kunchenguid#224)

* fix(synthesize): report a mid-run change to a watched repo file as observed

assertRepoUntouched blamed the synthesis harness for any change to a
fingerprinted in-repo file, so a concurrent editor in a shared workspace
aborted the run with the wrong cause. Name the observation instead, list
concurrent writers as a possible cause, and keep the harness attribution
only when the repo file now equals the staging copy.

Closes kunchenguid#199

Signed-off-by: Gaurav Jadhav <[email protected]>

* fix(synthesize): keep the fingerprint in step with the rebuilt staging copy

A skill another process edits after the fingerprint but before the
workspace is rebuilt was copied into staging, so the later equality check
named the harness for a change it did not make. Point each staged skill's
fingerprint at the text its staging copy was built from.

An absolute in-repo memory path was read as repo.root joined with the
absolute path, so a real write-through got the softer wording. Resolve
fingerprint keys the same way repoFingerprint does.

Closes kunchenguid#199

Signed-off-by: Gaurav Jadhav <[email protected]>

* fix(synthesize): report a write by an earlier candidate before rebuilding

The fingerprint is re-pointed at the rebuilt staging copy so a concurrent
edit made before the first harness runs is not blamed on it. A candidate
after the first runs behind a harness that may have written to the
repository, and rebuilding over that write would hide it. Check the
repository first on every attempt after the first.

Closes kunchenguid#199

Signed-off-by: Gaurav Jadhav <[email protected]>

* no-mistakes(document): fix: rewrap jsdoc comment, clean lint/format/typecheck

---------

Signed-off-by: Gaurav Jadhav <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…guid#242)

* fix(redact): cover standalone apikey credentials

* no-mistakes(review): Prevent standalone API key matching from exposing assignment secrets

* no-mistakes(document): Document redaction ordering invariant
* fix: report synthesis prompt bytes on adapter failure

* no-mistakes(review): Preserve synthesis size diagnostics through pinned resolver failures

* no-mistakes(document): Document synthesis prompt size diagnostics
…enguid#240)

* fix: recognize leading headings in memory pointers

* no-mistakes(document): Clarify headed memory pointers and consolidate documentation

* no-mistakes(ci): Fixed ci-1 at the shared parser boundary. Headings accept 0–3 leading ASCII spaces; four spaces and tabs preserve content and the existing warning. Parser and real CLI regressions failed before the fix and passed afterward. The permitted command, node --import ./test/helpers/hermetic-config.js --test test/memory-resolution.test.js, passed 25/25 with exit 0. Targeted lint and formatting passed. Changes remain uncommitted for the outer executor’s single additive commit, independent fresh-copy closure test, and PR delivery
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
…id#241)

* fix: mark successfully applied proposals as consumed

* no-mistakes(review): Roll back apply when proposal persistence fails

* no-mistakes(document): Document apply completion and format writer

* no-mistakes(ci): Fixed ci-1 at the shared persistence boundary: stamping now verifies the reviewed proposal under a lock shared by saves and clears. Reproduced the overwrite on 8efafaa, then verified fresh bytes survive and old edits roll back. All 34 authorized focused tests pass. No scratch files remain in the worktree

* no-mistakes(ci): Removed proposal locking while retaining compare-before-stamp and rollback. Replaced the lock-specific test with an interrupted-save regression, reproduced before the fix. All 34 tests pass using the authorized focused command, including stale/cleared proposal, rollback, retry, replay, dry-run, and rejection coverage. No worktree scratch files remain
Preserve house source provenance, routing and observer protections
while importing upstream replay prevention and synthesis safeguards.

Keep release bookkeeping identical to upstream 0c864ce.
@jazz127
jazz127 merged commit c41fa41 into house Oct 30, 2026
1 check passed
@jazz127
jazz127 deleted the fm/backpass-house-upstream-sync-1030 branch October 30, 2026 21:37
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.

5 participants