Skip to content

Release 3.5.1: fixes from a team's upgrade to 3.5.0 - #10

Merged
Hyper-AI-Lab merged 4 commits into
mainfrom
fix/kit-3.5.1
Nov 5, 2026
Merged

Hyper-AI-Lab merged 4 commits into
mainfrom
fix/kit-3.5.1

Conversation

@Hyper-AI-Lab

Copy link
Copy Markdown
Owner

What

Release 3.5.1: fixes for the problems that reviewers found in the 3.5.0 runtime while checking a team project's upgrade to 3.5.0. No change to the method. Nothing to configure when upgrading.

Fixes

Each fix has a test in test/review-fixes.test.mjs that failed before it: 12 tests failed on 3.5.0 (a3a7fa9), and 6 more failed before the fixes from two fresh-context reviews of this branch. One more test guards behaviour that a fix keeps (19 tests).

Severity Problem in 3.5.0 Fix
high An invalid .agent/paacm.json crashed the stop hook (loadConfig outside any try). The hook is not fail-closed, so the turn ended without the gate (3.4.1 blocked). One project's error also discarded another project's block The configuration error is reported like the gate's own (could not verify this task). Any other error blocks that stop once and names it; on the continuation the stop is let through as a hook error (stderr, exit 1), never silently. The other projects are still judged
medium A gate.log that could not be written made paacm gate crash after recording the result Warning; the result and the paacm gate: exit line stand. An untracked file that cannot be inspected (a symbolic link loop) no longer breaks the fingerprint
medium Every exit 127 counted as "a missing tool", including a script the change removed or renamed. The agent was told not to fix it Only the failing command's own not-found message counts. A command named by a path inside the project is an ordinary failure, and the verify instructions say so. A missing program stays a missing tool, also one named by a path outside the project (/opt/tools/bin/x). The hint and stop message keep 3.5.0's wording
medium When git could not run in the hook (not on PATH, safe.directory), an edit in a sibling worktree was allowed sameRepository(…, { strict: true }) throws with git's own message and the folder, and the fail-closed protect hook refuses the edit
medium After the finish nudge, a dirty tree re-ran the whole gate once 15 s had passed (about 6 min for a DEEP task in the reporting project) A continuation reuses a passing gate for the same fingerprint, however old it is; a failing one is run again. The fingerprint now includes untracked files' size and modification time (lstat)
medium review-input included the content of untracked files, keys included Untracked files named like secrets (.env, .env.*, *.pem, *.key, *.p12, *.pfx, id_rsa* and the other SSH keys), anywhere in the repository, are listed by repository-relative name only
medium A blocked task in another worktree held every worktree whose commit had a change to its frozen files, even for test files added after its approval Only files that existed at the approval count
low The finish nudge came back at every turn while the agent waited for the human (15 s dedup) Once per working tree and phase
low An unreadable state.json silently hid a blocked task from the check A warning on standard error
low The skip-git-hooks rule backtracked exponentially on many -c options (about 40 hit the hook timeout) Each option has one reading. 60 options take under 5 ms; the same commands still match

Deliberately not changed

  • A change from the base branch still holds other worktrees over a blocked task. I tried exempting commits that a remote-tracking branch has, and reverted it. 3.5.0's audit rejected trusting remote-tracking refs for the audit, and a writer can create one without any approval (git fetch from a local folder). The new troubleshooting entry says how to settle it.
  • A non-git session folder still runs each edited checkout's postEdit and checks. Making that opt-in is a change to the method. It only applies when PAACM is installed as a plugin and the session folder is not a repository.
  • The broad catch in prune (session start) stays. Cleaning up old baselines must never fail a session start.
  • 3.4.x baselines in the shared temporary folder are not removed by the upgrade. The changelog says when to delete them.

Docs

  • CHANGELOG.md 3.5.1, docs/project/requirements.md release 3.5.1
  • docs/guide/troubleshooting.md: the nudge, exit 127 for a path, and a new entry for "task … (in the worktree at …) is blocked"
  • ALGORITHM.md §7 (exit 127)
  • 07-verify.md and paacm-verify (exit 127 for a path)
  • Version 3.5.1 (package, kit, marketplaces, README, setup guide)

Checks

  • node bin/paacm.mjs check --tier quick → exit 0 (validate, build-drift, diff-whitespace, node --test 179 pass / 0 fail)
  • Two fresh-context reviews of this branch (correctness, error handling) found six more problems, each fixed with a test that failed before it, and one wording problem (a sentence added to the missing-tool messages, now removed)
  • npx markdownlint-cli2@0.23.3 "**/*.md" → 0 issues
  • Two Windows-specific paths are skipped on Windows in the new tests (POSIX shell messages, emptying PATH); CI covers the rest there

- The stop hook reports an invalid .agent/paacm.json like the gate's own
  configuration errors instead of crashing, and an error while judging one
  project blocks that stop once instead of discarding the others' results.
- A gate.log that cannot be written is a warning; the result and the exit
  line stand.
- Exit 127 for a command named by a path is an ordinary failure; the hint,
  the stop message and the verify instructions say so.
- The protect hook fails closed when git cannot say whether another
  worktree belongs to the same repository.
- A continuation reuses a passing gate for the same working tree however
  old it is; a nudge is given once per working tree and phase; the
  fingerprint includes untracked files' size and modification time.
- Untracked files named like secrets are withheld from the review input.
- A test added after a blocked task's approval does not hold other
  worktrees.
- An unreadable task state is reported when blocked tasks are checked.
- The hook-skipping shell rule reads each git option one way only, so it
  runs in linear time.

Each fix has a test in test/review-fixes.test.mjs that failed on 3.5.0.
- An error on a continuation lets the stop through as a hook error (stderr,
  exit 1), never silently.
- The fingerprint uses lstat and folds an error code into the hash, so an
  untracked symbolic link loop does not break the gate.
- Only the failing command's own not-found message counts, and only a path
  inside the project makes it an ordinary failure.
- Secret-named untracked files are withheld from the whole repository and
  listed by repository-relative path.
- The strict same-repository error names the folder and git's message.
…ool messages stay as they were

- Only a passing result is reused on a continuation however old it is; a
  failing one is run again, since the agent may have fixed what the
  fingerprint cannot see.
- The hint and the stop message keep 3.5.0's wording: a path inside the
  project no longer reaches them, and the added sentence invited working
  around a missing program.
@Hyper-AI-Lab
Hyper-AI-Lab merged commit 06d87d0 into main Nov 5, 2026
10 checks passed
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