Login
OCX protocol v1: questions
Login

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 v2). 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 v2; 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 v2); 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 v2).

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 v2) is not its sender its sender alone
names a run that takes no password step (protocol v2), 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 v2, 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 v2), 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 v2)
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 v2), 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), 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 v2 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).