Repository navigation
fix: merge upstream reliability fixes into house - #14
Merged
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Merge upstream
mainat0c864ce29e355590a4ccea6eea79e5c3147b302binto the fork'shouseline with merge commit3e6becc74f755fae3fa53dd9bc81a7c9f18223b7. Upstream has not moved from the launch pin; the first parent isorigin/houseatd432590d6233a8411408d1fee069052740c72f48.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 standaloneapikey_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.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:
e8ce638bfixes the review findings,2435d002documents the invocation and watched-file behavior, ande5314226fixes 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):
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