> For AI agents: the complete documentation index is available at https://docs.phax.run/llms.txt, the full documentation bundle is available at https://docs.phax.run/llms-full.txt.

# phax 0.35.0 \{#phax-0350}

Changes since 0.34.0: [v0.34.0...v0.35.0](https://github.com/lbdremy/phax/compare/v0.34.0...v0.35.0).

## Upgrading \{#upgrading}

- **Commit trailers name no path of the machine.** Phase, interactive and held review commits no longer carry `Worktree` or `Session-Id`, and `Gate-Log` is relative to the run's folder (`phase-02/checks-attempt-01.log`), or `none`. A stop whose commit was written by an older version still closes, and no record or run file changes. A script that read those trailers reads the phase folder instead: `<run>/<phase>/agent-binding.json` for the session, the `checks-attempt-NN.log` files for the gate. See [The phase commit](https://github.com/lbdremy/phax/blob/v0.35.0/README.md#the-phase-commit) for history already written.
- **Records: `phax records sync` aligns the local records branch.** It creates the branch at the remote's tip when it is missing, fast-forwards it when it is behind, and refuses when it has diverged from the remote's or shares no commit with it. `--replay` recommits the local-only records onto the remote's tip, keeping their trees, messages and authors, and prints the previous tip; a record the remote already holds file for file is left out, and a key the remote also holds with other content is replayed and named. phax never forces the branch. See [When the records branch and its remote disagree](https://github.com/lbdremy/phax/blob/v0.35.0/README.md#when-the-records-branch-and-its-remote-disagree).
- **Records: `phax records sync` works for the in-repo destination.** It fetches the records branch from `publish.remote` and no longer says `nothing to sync`, so it now needs that remote to answer: a script that runs it unconditionally can see it exit 1 on a network or authentication failure.
- **Records: `phax records sync --json` gains a required `branch` outcome** (`created`, `fast-forwarded`, `replayed` or `unchanged`) on a `cloned` or `fetched` answer, which also gains `remoteName`. The `replayed` outcome carries `skipped` and `sharedKeys`, and the answer gains `replay`. A refusal adds one error: `RecordsBranchDivergedError` (`reason`, `localTip`, `remoteTip`, `localOnly`, `remedy`). A script that matches the answer's keys exactly adds them.
- **Records: `phax records status --json` gains a required `branch` object** (`state`, `localTip`, `remoteTip`), between `remote` and `pending`. The text gains a `Records branch:` line with its remedy; before anything is written or fetched it names `phax records sync` instead of saying every record is pushed.
- **Records: pending counts only local-only records.** On a diverged or unrelated branch, the records the remote already holds are no longer counted.
- **Records: a refused records push names the branch state and the fix.** When the branch is behind, diverged or unrelated, the message gives the state and `phax records sync` or `phax records sync --replay`, not a plain `git push`. A record is also written on top of the remote's tip as phax last fetched it, so a lagging branch catches up with the write.
- **Records: a refused records push is always reported.** `phax publish` and `phax run` print it as a warning, where it was shown only with `--verbose`.
- **Artifacts: the `--json` record of `artifact new --headless` and `artifact decide` gains a required `branchNote`** beside `pushWarning`: the note of a record kept on a diverged or unrelated records branch, or null. `pushWarning` still names only a failed push.

Record format, manifests and versions are unchanged. No migration is needed, but records an earlier version left on a stranded branch (a fresh clone, a second machine) stay pending until you run `phax records status`, then `phax records sync --replay` when it names it.

## Fixes \{#fixes}

- fix(commit): drop machine paths and session id from phase commit trailers ([faed20e](https://github.com/lbdremy/phax/commit/faed20e8aa17cef9543b843ccfae7107c1b447c0))
- fix(commit): review fixes for the commit trailers ([c7839fd](https://github.com/lbdremy/phax/commit/c7839fd59363c83be68d564af6c4b761c46387f9))
- fix(records): review fixes for the records branch tip ([39008aa](https://github.com/lbdremy/phax/commit/39008aae90d762d54ad0dda7697ac9b18c4b63a5))
- fix(records): a shared key no longer stops a replay ([2a7527d](https://github.com/lbdremy/phax/commit/2a7527d21d46b7a4f0be89c43c8423a447204be8))

## Other \{#other}

- feat(records): classify the records branch against its remote tip ([ee3467c](https://github.com/lbdremy/phax/commit/ee3467ce3c683276b77893f777232bd39490b6e6))
- feat(git): add merge-base, commit listing, recommit and guarded ref updates ([26321a6](https://github.com/lbdremy/phax/commit/26321a658abc5a174073603dbd5269d40346babd))
- feat(records): parent each record on the remote tip when the local branch lags ([a997261](https://github.com/lbdremy/phax/commit/a997261f17ee9b8e4da5d306e7c516b2e1ed3c82))
- feat(records): sync creates, fast-forwards and replays the records branch ([fffd5e0](https://github.com/lbdremy/phax/commit/fffd5e0d32d11ca4b8ae31867c1960f56a3d4d08))
- feat(records): status shows the branch state and refused pushes name the fix ([81d0a60](https://github.com/lbdremy/phax/commit/81d0a6026b3c9ce1601b3f693098a796f9e51ba6))
