phax 0.35.0
Changes since 0.34.0: v0.34.0...v0.35.0.
Upgrading
- Commit trailers name no path of the machine. Phase, interactive and held review commits no longer carry
WorktreeorSession-Id, andGate-Logis relative to the run's folder (phase-02/checks-attempt-01.log), ornone. 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.jsonfor the session, thechecks-attempt-NN.logfiles for the gate. See The phase commit for history already written. - Records:
phax records syncaligns 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.--replayrecommits 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. - Records:
phax records syncworks for the in-repo destination. It fetches the records branch frompublish.remoteand no longer saysnothing 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 --jsongains a requiredbranchoutcome (created,fast-forwarded,replayedorunchanged) on aclonedorfetchedanswer, which also gainsremoteName. Thereplayedoutcome carriesskippedandsharedKeys, and the answer gainsreplay. 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 --jsongains a requiredbranchobject (state,localTip,remoteTip), betweenremoteandpending. The text gains aRecords branch:line with its remedy; before anything is written or fetched it namesphax records syncinstead 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 syncorphax records sync --replay, not a plaingit 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 publishandphax runprint it as a warning, where it was shown only with--verbose. - Artifacts: the
--jsonrecord ofartifact new --headlessandartifact decidegains a requiredbranchNotebesidepushWarning: the note of a record kept on a diverged or unrelated records branch, or null.pushWarningstill 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
- fix(commit): drop machine paths and session id from phase commit trailers (faed20e)
- fix(commit): review fixes for the commit trailers (c7839fd)
- fix(records): review fixes for the records branch tip (39008aa)
- fix(records): a shared key no longer stops a replay (2a7527d)
Other
- feat(records): classify the records branch against its remote tip (ee3467c)
- feat(git): add merge-base, commit listing, recommit and guarded ref updates (26321a6)
- feat(records): parent each record on the remote tip when the local branch lags (a997261)
- feat(records): sync creates, fast-forwards and replays the records branch (fffd5e0)
- feat(records): status shows the branch state and refused pushes name the fix (81d0a60)