Mycelium
Forester's graph is the work: items, dependencies, claims. It says nothing
about what the work found out. Mycelium is the other graph, the one under
the forest: facts with time, confidence, domain, and provenance attached,
so a worker seated tomorrow starts from what was proven today instead of
from the chat that proved it.
This file owns the pattern. The envelope, the transitions, the query, and
the CLI are in references/log.md. Forester pattern:
forester. Seats: dryad.
Two graphs, one seam
| Graph |
Node |
Owner |
Home |
| Forester |
an item of work and its state |
the plan |
.agents/forester-plan.yml |
| Mycelium |
an assertion and its status |
the log |
<state>/mycelium/<slug>.jsonl |
The seam is one direction only: a seat's done or blocked report may be
proposed as a fact (propose --from-seat, --report blocked for the
latter). Mycelium never changes the plan, never assigns, never marks an
item done.
The rule
Propose is cheap; commit is a judgement. Any worker may propose, and a
proposal is only staging. Only a judge commits: a person, or the worker the
project names in judges. A project that names no judges is permissive,
and status says so; an unattended run wants judges and mode: restricted, never a worker naming itself judge. A committed fact that
stops being true is invalidated, never deleted: the log keeps what was
held and for how long.
Wrong is amended; no longer true is invalidated. A fact you got wrong
gets a corrected copy (amend), and the original is closed as if it never
held. A fact that was true and stopped is invalidated or superseded, and
the moment it held stays answerable. Nothing is ever edited in place.
Every line names its writer. A seat standing in its own worktree is
seat:<id> without saying so; a person or a judging agent passes --by.
The id is a declaration the project trusts, not a login; the reference says
what that means on a shared machine.
Write
When your work produces a fact worth keeping:
- Ask whether it outlives you. A locked decision, a verified cause, a
dependency between lanes, a blocker, a check's pass or fail, an approach
tried and failed: yes. A file hunk, a build log, a heartbeat, a chat
turn: no. The full list is the reference's commit rules.
- Propose it in the envelope. Subject, predicate, object, the subject's
type, the domain, the source you read it from, and your confidence.
The domain, the types, and the predicate must already be in
.agents/mycelium.yml; if the vocabulary lacks one, say so to a person
rather than inventing it. A predicate is one when a subject holds a
single object at a time (a cause, a definition of done) and many when
it holds several (a dependency, a blocker, an owner).
- Name the source precisely. A file path and line, a PR, a seat's
report, a check's output line, and the commit you read it at
(
--ref-commit; --from-seat names the seat's own head). A fact with
no source is a rumour and is not proposed; a fact with a commit can be
told from one the baseline has moved past.
- Correct with
amend, not with a second proposal. If you find your
own proposal wrong, or another's, amend it and say why in the source.
The log then shows the correction as one link, not two unrelated facts.
- Do not commit your own proposal unless the project names you as its
judge. Say what you proposed in your seat report.
Judge
When you hold the judge's role, or are a person reading staging:
query --status staging and read each candidate against its source.
- Commit what is true. A conflict with an active fact on the same subject
and predicate is refused; supersede only when the newer fact replaces
the older, and say so.
- Invalidate with a reason a stranger can read.
--below 0.5 finds the
candidates least sure of themselves; those get a source check first.
Read
Ask the log, not the chat. query --domain <d> for what is held now,
query --at <moment> for what was held then, query --s <entity> --all
for one thing's history, query --since <moment> when you come back to a
seat and want only what changed, trace <id> for how a fact got to be
what it is. Put the answer into the worker's brief with query --brief,
so the brief stays short and the facts stay in one home.
Invariants — not weakenable
- The log is append-only. No edit, no delete. Invalidation is a new line.
- The graph is the fold of the log. Nothing else is consulted.
- Every assertion names its source and its agent. No defaults for either.
- Correction is a new line that points back.
amend links; nothing is edited.
- Vocabulary is declared, not discovered. Unknown domains, types, and predicates are refused.
- A write is one step. Every write re-reads the log under a lock; no two writers pass the same check on a stale graph.
- The CLI never calls a model and never judges. Commit is a person's or the named judge's.
- Mycelium does not write the plan. The Forester seam reads seats; it does not touch them.
Not this skill
- Deciding the work or its order. Forester.
- Seating, reporting, or finishing a worker. Dryad.
- A document a person reads. Understory can point at assertion ids.
- A second store per machine, a query language, a merge across machines.
Those are named as later work in the design note and are not here.
1---2name: mycelium3description: de-novo Mycelium — the facts under the forest. One append-only log of assertions per project: what is held true, since when, with what confidence, in which domain, on whose word. Workers propose; a person or the judging worker commits or invalidates; readers query a moment. Use when work produces a fact that outlives the seat that found it (a locked decision, a verified cause, a blocker, a check result), when a person asks what the project currently holds true, or when the user runs /mycelium. Values live in .agents/mycelium.yml (domains, entity types, predicates with one|many cardinality, and the judges who may commit; tracked). Corrections are amendments that point back; nothing is edited in place. The CLI never judges; the promotion is yours.4---56# Mycelium78Forester's graph is the work: items, dependencies, claims. It says nothing9about what the work found out. Mycelium is the other graph, the one under10the forest: facts with time, confidence, domain, and provenance attached,11so a worker seated tomorrow starts from what was proven today instead of12from the chat that proved it.1314This file owns the pattern. The envelope, the transitions, the query, and15the CLI are in [references/log.md](references/log.md). Forester pattern:16[forester](../forester/SKILL.md). Seats: [dryad](../dryad/SKILL.md).1718## Two graphs, one seam1920| Graph | Node | Owner | Home |21| --- | --- | --- | --- |22| Forester | an item of work and its state | the plan | `.agents/forester-plan.yml` |23| Mycelium | an assertion and its status | the log | `<state>/mycelium/<slug>.jsonl` |2425The seam is one direction only: a seat's done or blocked report may be26proposed as a fact (`propose --from-seat`, `--report blocked` for the27latter). Mycelium never changes the plan, never assigns, never marks an28item done.2930## The rule3132**Propose is cheap; commit is a judgement.** Any worker may propose, and a33proposal is only staging. Only a judge commits: a person, or the worker the34project names in `judges`. A project that names no judges is permissive,35and `status` says so; an unattended run wants `judges` and `mode:36restricted`, never a worker naming itself judge. A committed fact that37stops being true is invalidated, never deleted: the log keeps what was38held and for how long.3940**Wrong is amended; no longer true is invalidated.** A fact you got wrong41gets a corrected copy (`amend`), and the original is closed as if it never42held. A fact that was true and stopped is invalidated or superseded, and43the moment it held stays answerable. Nothing is ever edited in place.4445**Every line names its writer.** A seat standing in its own worktree is46`seat:<id>` without saying so; a person or a judging agent passes `--by`.47The id is a declaration the project trusts, not a login; the reference says48what that means on a shared machine.4950## Write5152When your work produces a fact worth keeping:53541. **Ask whether it outlives you.** A locked decision, a verified cause, a55 dependency between lanes, a blocker, a check's pass or fail, an approach56 tried and failed: yes. A file hunk, a build log, a heartbeat, a chat57 turn: no. The full list is the reference's commit rules.582. **Propose it in the envelope.** Subject, predicate, object, the subject's59 type, the domain, the source you read it from, and your confidence.60 The domain, the types, and the predicate must already be in61 `.agents/mycelium.yml`; if the vocabulary lacks one, say so to a person62 rather than inventing it. A predicate is `one` when a subject holds a63 single object at a time (a cause, a definition of done) and `many` when64 it holds several (a dependency, a blocker, an owner).653. **Name the source precisely.** A file path and line, a PR, a seat's66 report, a check's output line, and the commit you read it at67 (`--ref-commit`; `--from-seat` names the seat's own head). A fact with68 no source is a rumour and is not proposed; a fact with a commit can be69 told from one the baseline has moved past.704. **Correct with `amend`, not with a second proposal.** If you find your71 own proposal wrong, or another's, amend it and say why in the source.72 The log then shows the correction as one link, not two unrelated facts.735. **Do not commit your own proposal** unless the project names you as its74 judge. Say what you proposed in your seat report.7576## Judge7778When you hold the judge's role, or are a person reading staging:79801. `query --status staging` and read each candidate against its source.812. Commit what is true. A conflict with an active fact on the same subject82 and predicate is refused; supersede only when the newer fact replaces83 the older, and say so.843. Invalidate with a reason a stranger can read. `--below 0.5` finds the85 candidates least sure of themselves; those get a source check first.8687## Read8889Ask the log, not the chat. `query --domain <d>` for what is held now,90`query --at <moment>` for what was held then, `query --s <entity> --all`91for one thing's history, `query --since <moment>` when you come back to a92seat and want only what changed, `trace <id>` for how a fact got to be93what it is. Put the answer into the worker's brief with `query --brief`,94so the brief stays short and the facts stay in one home.9596## Invariants — not weakenable9798- **The log is append-only.** No edit, no delete. Invalidation is a new line.99- **The graph is the fold of the log.** Nothing else is consulted.100- **Every assertion names its source and its agent.** No defaults for either.101- **Correction is a new line that points back.** `amend` links; nothing is edited.102- **Vocabulary is declared, not discovered.** Unknown domains, types, and predicates are refused.103- **A write is one step.** Every write re-reads the log under a lock; no two writers pass the same check on a stale graph.104- **The CLI never calls a model and never judges.** Commit is a person's or the named judge's.105- **Mycelium does not write the plan.** The Forester seam reads seats; it does not touch them.106107## Not this skill108109- Deciding the work or its order. Forester.110- Seating, reporting, or finishing a worker. Dryad.111- A document a person reads. Understory can point at assertion ids.112- A second store per machine, a query language, a merge across machines.113 Those are named as later work in the design note and are not here.