Artifact 5ebb8772df312a7aecaaeee6581c3acd4bbe89cb9a064fc59364e1f02ba63949:
- File
docs/landings.md
— part of check-in
[c6aa693938]
at
2026-08-23 22:01:01
on branch trunk
— landings: a way to open one, and the lifecycle written down
docs/landings.md covers the whole loop and says plainly that a landing is a forum thread plus branch tags. Writing it found the gap: there was no create control at all. A mirror offers its upstream instead. (user: dmestas, size: 5913) [annotate] [blame] [check-ins using] [more...]
Landings
A branch is finished. There is no way to say so.
That is the gap a landing fills. zit can create the branch, commit to it, merge trunk into it and merge it back — but the act of proposing that it land leaves no trace: nothing to review, nothing to comment on, nothing to accept or reject, nothing for CI to fire on. The work goes from "on a branch" to "on trunk" with no event in between.
This is not a pull request
GitHub's pull request is a bazaar mechanism. It exists because a stranger cannot write to your repository, so they fork it and request that you pull. Every piece of its ceremony descends from that premise: the fork, the head/base repository pair, the frozen commit range.
Inside a cathedral that premise does not hold. Anyone with the check-in capability can already push a branch, and the branch is already in the store. Nothing needs to be transported, filtered or quarantined, because there is no trust boundary to cross.
So the artifact is not a request to transfer commits. It is a decision record about a branch that is already here, and the name follows the direction the work actually moves: nobody requests a pull; the branch lands.
What a landing is made of
No new artifact type. This is the constraint the whole feature hangs from, and zit states it as a rule rather than a habit: if the implementation reaches for a new card, the design is wrong.
A landing is three ordinary fossil artifacts:
| part | artifact |
|---|---|
| the record | a forum thread whose root body opens with a marker |
| every comment and state change | a reply in that thread |
| the outcome | a raw tag on the check-in that landed |
The root body carries the header:
zit-landing: 1
branch: <name>
target: <name>
<the author's message>
and a transition is a reply whose body opens with zit-landing-state: X,
where X is one of open, accepted, rejected.
Why it matters: clone a repository carrying landings with stock fossil and it sees forum threads and tagged check-ins. Fully readable, merely not actionable. That is the correct failure mode, and it is why no wire-protocol extension and no compatibility break were needed.
The lifecycle
Open
zit landing open --branch feat/x --to trunk -m "why this should land"
or New landing on the forge's landings page, which offers the
branches that exist rather than a text field that accepts a typo, and
defaults the target to the repository's own default branch. --to
defaults to trunk on the command line. Either way this mints the thread
root and leaves the branch unmerged; zit refuses a second open landing
on the same branch by name.
On a mirror the control names the upstream instead: a tracking store takes no local writes, so proposing there would fork it by accident.
Discuss
Replies in the thread, from the CLI or the record's page. The page renders them as a discussion; markdown previews through the same composer the wiki and forum use.
CI
Opening a landing is an event a pipeline can fire on, as is a new check-in on a branch with an open landing — the intended workflow keeps merging the target into the branch and testing there.
Accept, or reject
zit landing accept <id> # merge to the target, settle the record
zit landing reject <id> -m # settle it, merge nothing
The order is the contract. Accept merges and commits first, then writes the outcome tag and the transition reply. A failure after the merge leaves merged work under a still-open landing, which one command settles. The reverse order would leave an accepted record over an unmerged branch — a lie in a log that cannot retract one.
What the forge adds
Quarry reads landings out of its own index rather than the store: the record is a reading of forum posts, recomputed whenever any post in a thread folds, so a reply indexed before its root converges on the same answer.
Who may accept. Accept writes a merge check-in, so it requires
fossil's i — Write/check-in. Everything else about a landing is a
forum artifact, so opening, commenting and rejecting require 3
(WrForum). Rejecting merges nothing and therefore needs nothing more
than the capability to speak.
There is deliberately no rule against accepting your own landing. Inside a cathedral the author already holds the commit bit, and a required second reviewer is a policy fossil has no capability letter for; inventing one would be quarry policy wearing fossil's clothes.
A moving branch. The record references the branch, never a frozen range, because the intended workflow keeps committing to it after the record is opened. So the diff is computed at view time, and a landing page shows a bounded summary with a link to the whole change.
Conflicts are read, never discovered. A forge must never learn
whether a branch merges by attempting the merge, because on a server the
attempt is the damage. Quarry asks the store (zit landing show), which
answers merges clean, up-to-date, or conflict (N) with the paths.
A conflicted landing renders as blocked, names the files, and disables
accept rather than offering a control that would fail. The answer is
memoised on the pair of check-in tips, so a push invalidates it by
producing a different key.
What a landing is not
It is not a takedown, and it is not an outside-contribution path. A landing assumes the branch is already in the store. Accepting one does not unpublish anything a peer already holds, and no state here reaches across the trust boundary that bundles and imports exist for.
Sources
- zit#127 — the ceremony, and the decision to build it from artifacts fossil already has
- zit#131 — the mergeability probe and bare-store accept, which is what lets a forge with no working tree settle a record
- RFC 0004 §4 — the capability model the accept rule follows