A question is an OCX message to a user, as a run is one to a node: it
asks the user it is for, whose view lists it as waiting until they
decide; anyone who may write where it is may send a decision, which every
view shows; and it stays open until its sender, or, for a question naming
in run the run whose process asked it, whoever sent that run, confirms it
answered with a decision of their own, whatever else is said where it is.
No node acts on either
(protocol v1, section 3). A question's state is
read from the repository each time: the question, and the decisions naming
it that the server received after it, with their receipts, in the server's
order. Nothing of it is kept
(protocol v1, section 4; HISTORY.md
decision 6). The maintainer, 2026-10-20: "consider questions like a "run"
targeting a person. The tool should help the person provide a suitable
response to the prompt."; and, the same day, "we can pay attention to all
users on a thread in most cases" and "i'd say questions stay open until the
asker confirms it is answered" (decision 91); and, 2026-10-21, of a question
a run's user asked, whom no one could confirm once the run ended: "Whoever
sent the run (you, usually) may also confirm its questions. Works for every
run, and patterns stay as they are." (decision 93); which run asked is the
question's own field, never inferred from when runs started, as the
maintainer's standing rules have it: "Just let the OCX message dictate"
(decision 40) and, 2026-10-18, "please don't go down any path with a
possible race condition" (decision 94). Both words are the maintainer's
(section 3).
1. Keys
Besides the envelope's ocx and kind:
| Key | In | Holds | Absent |
|---|---|---|---|
for |
question |
the user it asks, by login, a user of the server, whose view lists it as waiting until they decide, whoever else has; never its sender. Anyone may decide | not a question |
question |
question |
what it asks: plain text of at most 200 characters, naming things in words, with no hash (a run of 6 or more hex digits mixing digits and letters) and no link (a URL, or a Markdown link) | not a question |
options |
question |
two to four choices, each plain text of at most 100 characters, none repeated, with no hash and no link; the first is the one its asker recommends | the decision is in the user's own words |
stakes |
question |
what the decision changes: plain text of at most 200 characters, with no hash and no link | not said |
run |
question |
the run whose process asks it, by its hash in full, as run names a run in a report: post writes it given --run, the hash a run's process reads on the first line of its standard input (protocol v1, section 8.1); whoever sent that run may confirm the question too, when the run counts (section 2) |
no run's process asks it, and only its sender confirms it |
references |
question |
what to read first, each a link from the repository's root that post wrote to the one thing it named: /forumpost/HASH, /tktview/TICKET, /technote/ID, /artifact/HASH?ln=FIRST-LAST (a file's lines, each at most nine ASCII digits), /info/HASH (anything else Fossil names by hash), or /wiki?name=PAGE (a wiki page as it is now, the one link naming no version); every view shows each as a link, its title included |
nothing to read but where it is |
question |
decision |
the question's hash in full: the post or ticket change holding it, as run names a run in a report |
not a decision |
note |
decision |
from anyone whose decision does not confirm it: an option's words exactly when they chose one, never its number, else their own words, plain text of at most 2000 characters, hashes and links allowed, each hash shown by its artifact's title, or cut to "…", as in a reference's excerpt, since every view shows every decision; from one whose decision confirms it (section 2): why it is answered, as stakes is written, plain text of at most 200 characters with no hash and no link, and not digits alone, as an option's number is |
not a decision |
A reader passes over a key it does not know, as in a stop or a report
(protocol v1, section 15).
2. When a question waits
Who may confirm a question answered is its sender; and, when the run it
names in run counts, as the table below gives it, the run's sender: who
sent that run, by the server's receipt of it. Which run asked is the
question's own field, never inferred from which run started last: two runs
of one user at once, as for two clones sharing a login, or a question a kept
workspace pushes after another run of its user has started, each give it to
the sender of the run its process named. The reader checks the run and its
started as the table below says, and trusts the login the run names as its
node: a started from that login is taken as its word that the run passed
every rule. The reader does not check what the run's sender could do when
they sent it, nor that the login is a node's at all, so one who names their
own login as a run's node and writes its started may confirm a question
whose sender names that run; the patterns' --run $$run$$ names only the
run whose process asks. The run's sender may confirm whatever they may do on
the server since, and a confirmation of theirs stands. So a question a run asked can be confirmed
once the run has ended and its user writes no more. A decision from either
confirms it, but for the first decision of the user it is for, who may be
the run's sender: that one is what they decided, and a later one of
theirs confirms it.
A question whose run |
Gives as its confirmers |
|---|---|
is absent, or names no run message the server received, public, before the question: a prefix, another post, or a block that does not read as a run |
its sender alone |
names a run whose process.user (protocol v1, section 8) is not its sender |
its sender alone |
names a run that takes no password step (protocol v1, section 5), whose process cannot write as its user, such as a build; a node refuses that step in a run from a user holding R (protocol v1, section 11, row 1), which this reader does not check, trusting the run's started (next row) |
its sender alone |
names a run whose started that counts (protocol v1, section 3), public, from the login the run names as its node, where the run is, and for a run naming a clone from that clone, the server had not received before the question |
its sender alone |
| names any other run | its sender, and the run's sender |
| A message that | Is |
|---|---|
is a question lacking for or question, past a bound, holding a hash or a link in its words, offering one option, more than four or one twice, naming in for its sender, or holding a reference that is none of the links references lists, which could end the link it is shown as or break its line |
asks no one |
is a question or a decision held private by Fossil, as a post awaiting a moderator is |
counts for nothing until a moderator approves it; then it counts as received when it arrived, not when approved, since Fossil keeps the receipt it arrived by (Fossil 2.27, tried 2026-10-21) |
is a decision written anywhere but where the question is |
counts for nothing as a decision; a session may still be given it as a post (protocol v1, section 9) |
is a decision, a confirmation too, that the server received before the question, as one written for it in a clone and pushed first is |
counts for nothing, even once the question has arrived, and whenever it is made public |
is a decision written where the question is, public, and received after it |
counts, whoever sent it; each shows who sent it, by its receipt, so the asker can check when that matters |
is a question whose references name a wiki page |
answered as any other: whoever answers on the page decides when done, and the asker reads the page itself, with wiki_read or Fossil's history, before confirming it. No version of the page counts above another |
| State | What arrives | Next state |
|---|---|---|
| none | a question that asks someone |
open, listed as waiting on its for |
| none | a moderator's approval of a question that asks someone, held private |
open as of its receipt: each decision received after it counts, one written before the approval too |
| open | a decision that counts, from its for, their first, even when they may confirm it |
open, with one more decision: listed for whoever may confirm it to confirm, and waiting on its for no more |
| open | a decision that counts, from anyone but its for or whoever may confirm it |
open, with one more decision: listed for whoever may confirm it to confirm, and still waiting on its for if they have not decided, whoever else has |
| open | a decision that counts, from its sender, or from the run's sender, but for the first decision of its for: the confirmation, its note saying why it is answered |
closed |
| open | anything else: a later post or change, an edit of it (a new question, protocol v1, section 3), a decision that counts for nothing, its ticket's status set to closed | as it was |
| open | a moderator's approval of a confirmation, held private, received after the question | closed as of the confirmation's receipt: the decisions received after it, meanwhile shown, are none of its decisions |
| closed | a moderator's approval of a decision, held private, received between the question and the confirmation | closed, with one more decision: its decisions are those the server received between the question and the first confirmation, whenever each was made public |
| closed | anything else | closed as it was: the first confirmation, in the server's order, closed it, and none received after is one of its decisions or changes it |
Who sent a question, a decision or a run is the user the server received it
from (Fossil, senders and nodes, section 3),
never the name written in it. post refuses to ask a question where Fossil
would hold for a moderator what its sender or the user it is for writes
there, in a thread or in a ticket's pages: the asker could not read the
decision of the user it is for until a moderator approved it, and the
sender's confirmation would close it only then, as of its receipt, so the
decisions written meanwhile would drop out as received after it
(USAGE.md). A third user's decision is not checked so: it
counts once public, at its receipt; nor is a run's sender's: a node starts
a run that takes a password step only from a user holding admin or setup,
whose confirmation Fossil holds for no moderator while they hold either, but
the reader trusts the run's started without checking that (above), so the
confirmation of a run's sender holding neither may wait for a moderator, and
then closes the question as of its receipt.
3. Its words
question and decision, as protocol v1, section 13
gives them, instead of "the ask", "prompt", "answer", "reply" and
"response". The maintainer, 2026-10-21, on the question asking whether to
approve both: "Approve question; find another word for response"; then, in
a reply to the question offering answer, reply and decision: "decision
sounds good." (HISTORY.md decision 99).
A decision was first written as response, its kind and its tag, as the
answers to the first questions were. A reader takes a message whose kind is
response as a decision, with the same keys, so those still count and
close what they closed; OCX writes only decision.
Why: Clarity (a question names things in words, and what closes it is a message of its own from its asker, or from whoever sent the run it names as asking it, not whatever is said next or inferred from when anything arrived), Demonstrability (who decided, and when, is on the record, by receipt, and the asker confirms it answered there), Parsimony (its state is read from the record each time).