Skip to content

fix(mate): a bare change's own title, and a describe through HQ's roll - #38

Merged
fxck merged 5 commits into
mainfrom
p43/change
Oct 6, 2026
Merged

fxck merged 5 commits into
mainfrom
p43/change

Conversation

@fxck

@fxck fxck commented Oct 6, 2026

Copy link
Copy Markdown
Member

A change's title and description from a long Mate run, and the review's findings.

A bare change's title

  • A change no description has reached is titled by what its own repository holds: the newest commit the Mate wrote beyond main, or its changed files, never the session's intent. Both repositories of one session used to share the session's long intent as their title.
  • The baseline commit is marked (Zcp-Commit: baseline) and skipped, as are zcp's own delivery commits (Zcp-Commit: delivery) and history that already landed.
  • The title stays zcp's until the Mate names it: the pair records the title zcp set, and a delivery retitles only while HQ still holds that title.

A describe through HQ's rolling deploy

  • The describe's HQ calls are retried for up to a minute on an unreachable HQ, 502, 503 or 504, never on a 4xx or 500. When the minute runs out, the agent hears whether the words surely did not land or may have.
  • A describe holds the pair's checkout lock, so it can't interleave with a delivery from another chat.
  • Without a recorded change, the read of the Mate's state is retried the same way.

Tests for each case; go test passes for tools, ops, workflow and content, go vet is clean, and golangci-lint reports no issues.

🤖 Generated with Claude Code

fxck added 5 commits October 6, 2026 01:39
R12-15: a backend and a storefront both read the session's long task as
their changes' titles for seven minutes, until the Mate described them.
A change was opened with the work session's intent, which is the same line
in every repository the session touched.

A change no description has reached is now titled by what it holds: the
subject of the newest commit beyond main the Mate wrote (no merge, no
commit of zcp's own, no zcp init), else the files that differ from main
("Add index.js and package.json"), else "Mate: <hostname>", cut at a word
as before. Every commit zcp writes carries a "Delivered-by: zcp" trailer so
its own words are never read as the Mate's. A push retitles a change while
its body is empty; once described, the title is the Mate's. A delivery
still commits the deployed tree under the task's words.
…g a draft

HQ's Core rolls for about 20 s. A describe that met it failed once, nothing
tried it again, and the change stayed a draft.

describe-change now tries its calls to HQ again — a growing wait apart, a
minute in all, each call sent once and bounded — while HQ is not reached
(refused, reset, no connection within the bound) or answers 502, 503 or
504. HQ's own refusal (a 4xx, a 500) and a try HQ connected for and left
unanswered stay final. A picture upload that meets a 5xx is HQ not serving
it, no longer read as HQ refusing the picture. When the minute is spent the
answer says plainly that the description did not land and the change is
still a draft, the words kept. Deliveries still fail fast.
…istory

The briefing asks every repository for a baseline commit before any change.
With zcp's own commits skipped, that commit stayed the Mate's newest one, so
every repository's change read "baseline commit" and R12-15 was back. And a
checkout that took a squash in by an ordinary merge, before deliveries
started from a fresh base, still held the landed change's commits, so a new
change could be titled by one that had already landed.

The briefing now writes the baseline under a "Zcp-Commit: baseline" trailer,
and zcp's own trailer becomes "Zcp-Commit: delivery"; a change's title
skips any commit with that key. For checkouts from before the marker, a
commit under "baseline commit" or sitting on the pair's zcp init or on the
join of the repository's base is skipped too. History that already landed,
refs/zcp/landed/* and each landedHead of a merged change the Mate's state
lists, or the pair records, is left out.
title is optional on describe-change, and retitling stopped once a change
had a body, so a describe without a title froze zcp's title of the moment
("baseline commit", before the last fix), and that title became main's
squash subject. And a delivery read the title, then retitled it: a describe
from another chat landing in between was written over.

The pair now records the title zcp last gave its change (ZcpTitle), and a
delivery retitles the change only while HQ still holds that title. A
describe without a title leaves it zcp's, following the work; one with a
title drops the record, so the title is the Mate's for good. A describe now
holds the pair's checkout as a delivery does, so the two never interleave;
held past the wait, it writes nothing and says so.

Requiring title on a describe was the other way: it would refuse the Mate
and still need the record to know whose title HQ holds.
…its change through the roll

A retried describe whose PATCH reached HQ but whose answer was lost said
"did not land ... still a draft", while the change was described. HQ has no
read of a change's words to check, so the answer now says so: when every try
surely never reached HQ (refused, no connection within the bound, a
standby's own 503) the words did not land; when one may have (a connection
dropped after the words were sent, a balancer's 502 or 504), they may not
have landed, and describing again with the same words changes nothing.

With no change on record, the describe read the Mate's state once, and HQ's
roll made it answer "No change is open". That read is now tried as the
description is, and HQ staying away is said as not knowing which change is
open, with nothing written or kept.
@fxck
fxck merged commit cf5f141 into main Oct 6, 2026
3 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