Reference
The CLI, the environment, the record's vocabulary, the status projection and the files, in one place. The chapters explain; this page lists. spec/dna.md is…
The CLI, the environment, the record’s vocabulary, the status projection and the files, in one place. The chapters explain; this page lists. spec/dna.md is the contract behind all of it.
The CLI
Section titled “The CLI”hale dna --help prints every verb. Here the same lines are grouped by
the part each verb drives, word for word. Most verbs take the project
directory as an optional argument and default to the current one.
Starting: DNA and the genome
Section titled “Starting: DNA and the genome”Getting started and DNA, the building block.
hale dna init [app-dir] [--no-library] [--with <pack> [--set <param>=<value>]… [--as <who>]] attach the DNA to an existing application; the record starts with the language and system nodes and the toolchain's library proposed, one Review per family (--no-library leaves out the nodes and the library, not the practices); --with proposes a pack from the toolchain's nursery as one batch beside them, planned on the holes init opens so it may fill them (`--with founder --set founder=<you>` seats you in every one): one `review all approve` ratifies the starting organization, seats includedhale dna new <name> [--no-library] a greenfield application with its DNAhale dna new <name> [--profile local|remote-body --remote <url> [--body <user@host>]] the profile sets the pieces (a remote, a body host); the combination is always detectedhale dna upgrade [dir] re-materialize vendor/dna for this toolchain, and propose this version's practices and library (each changed practice, and the library as new families, supersede the active one once the Board approves)hale dna profile [project] the organism's combination, detected from its pieces: record, body, head, fleet, knowledge, trusthale dna --embedded-digest [--from-tree <dir>] the digest of the DNA source this binary embeds (nothing else on stdout); with a checkout, what that tree would embed — a mismatch means the binary predates the working tree and a mutation run against it proves nothingThe record
Section titled “The record”hale dna status [project] [--json] the organism's status projection, from the Journalhale dna history [<entity>] walk the Journal by causal links (works offline)hale dna sync [project] fetch, reconcile and push the record (refs/dna/*) with originhale dna candidates [<mutation> | drop <mutation> --why <w>] the candidates the record keeps, whatever the review decided; one as a diff; stop keeping onehale dna connect <record-url> --name <n> --as <position> --purpose <p> --classes <internal,customer,…> propose a connection to another record (a Board Review); `hale dna connect` lists them; `hale dna disconnect <n> --why <w>` closes onehale dna handoff <n> task <id> | receipt <digest> write one fact into the connected record, with origin, lineage and purpose; `handoff` lists, `handoff accept <id>` accepts one received, `handoff sync` reads acceptances backMemory
Section titled “Memory”hale dna memory migrate [dir] apply memory's schema with the owner's DSN (HALE_DNA_MEMORY_DSN_OWNER, or dna/compose.yaml) and print the record's spine and head DSNs (HALE_DNA_MEMORY_DSN_SPINE, …_HEAD)hale dna ledger [status | rows | adopt | abandon --why <w>] the operational memory: where the day's work lives, its rows as JSON lines, and the one-way move of it into memory — adopt and abandon are asked in the record; a node carries them out on its tick once the ledger is adopted, a head's write (a task done, a receipt filed …) goes straight into it under the head's role: done when it lands, or refused by memory with the reasonhale dna receipt [disclose <digest> --to <who> --purpose <p> | show <digest> --purpose <p>]hale dna receipt hold|release-hold <digest> --why <w> | redact <digest> --why <w> --policy <p>hale dna receipt file <path> [--class internal|customer|confidential] file a document as evidence a hold refuses redaction until released; a redaction removes the body and keeps the digest, as a row (a body kept in memory is erased by the body on its tick, and filing it again is refused) protected evidence (customer, confidential): kept in memory alone, sealed there; disclosure and every read are rows in the reader's name (--as <who>)hale dna show org|processes [--json] [project] the org chart and the process model, as queries over memoryThe nerves
Section titled “The nerves”hale dna nerves migrate [dir] create the organization's NATS JetStream stream with the owner's URL (HALE_DNA_NATS_URL_OWNER, or dna/compose.yaml) and print its token and each role's URL (HALE_DNA_NATS_ORG, …_URL_SPINE)hale dna nerves drop [dir] delete the organization's stream, and everything it held, with the owner's URLThe spine
Section titled “The spine”hale dna run [project] [--port N] [--no-iris] build and run the organization (dna/org), a node of it: relay the record's requests to it over the nerves (NATS); iris inspects its processhale dna definitions [project] [--json] the workflow catalog (dna/org/workflows.hl): each definition's revisions and every step's storehale dna effect resolve <key> an effect whose outcome is unknown after a restart: --outcome ok|failed, in your nameThe heart and the body
Section titled “The heart and the body”hale dna dev [project] [--port N] [--no-iris] [--observe <secs>] the organization AND the application under one host: rebuild and restart the application on an apply, watch the window, report backhale dna application remove [project] [--as <who>] the attached application removed (`application.detached` in the record) and its broker account revoked: its user, its password and its vault entry (GH #989)hale dna body who runs this record (the body lease); `body claim --force` takes it from a body that is gone; `body release [--force]` gives it up — both are rows in your name (--as <who>)hale dna body provision <user@host> [--dsn <postgres://…>] [--dir <path>] [--dry-run] over ssh: the toolchain hale.lock pins, the record's remote cloned, Postgres from dna/compose.yaml or the DSN, a systemd user unit supervising the host; writes nothing when ssh or the toolchain is unavailable. Then `body start|stop|logs [--body <user@host>]`hale dna fleet [project] what the fleet expresses: every instance, its node, revision, model hash, statehale dna deploy <revision> express a genome revision through the fleet's nodes (fleet.deploy)hale dna rollback <mutation> express the base a Mutation was applied on, again (`[dna] fleet = "<name>"` in hale.toml names the plan; `hale node <name>` runs a node)A node is its own command. hale node --help:
usage: hale node <name> [--repo <clone>] [--fleet <name>] [--tick <ms>]
The agent that expresses a fleet plan's instances on one machine,from the record: it reconciles what the plan says this node runsagainst what is running here (GH #566 F5). With HALE_DNA_NATS_URL_APPand HALE_DNA_NATS_ORG set (`hale dna nerves migrate` prints them), ithands both to every instance, which says what it says onto thenerves itself (GH #986).Senses and reflexes
Section titled “Senses and reflexes”hale dna senses up [dir] bring up the senses' store (compose's `senses` service) and print its read URLhale dna pressure [raise <source> <what…>] pressure raised and answered; `raise` writes one signal into the record, which a node relayshale dna concern raise <source> <what…> [--severity N] a concern from a locus path about the part above it; persistent ones become knowledge proposalsThe skin
Section titled “The skin”hale dna secret set <NAME> [--body <user@host>] a credential from stdin (never argv, never the record) into its slot of the vault (a model key's, FORGE_TOKEN, or OIDC_CLIENT_SECRET) on the body or here; `secret rotate <NAME>`; the record gets `secret.rotated <NAME>` onlyhale dna secrets [dir] every secret the organism requires, and whether the vault holds it (never a value)Legs and voice
Section titled “Legs and voice”hale dna work <verb> … a leg's verbs against the head's API (--api, --as position:<name>): next, brief, login, renew, allowance, submit (--from-worktree), settle, release, friction, hand, run — the project's performers (dna/org/work.hl); loop --parallel N is a worker: N children, each its own holder; loop --drain ends onehale dna models [project] the catalog (dna/org/models.hl): every backend, and one small request to eachhale dna models map | rule <selector> <size> [--permit <sizes>] | category <mode>.<size> <model> [--tools] [--price-in N] [--price-out N] which model a Work gets, as rows in your name (--as <who>): a rule says the size a kind of work needs (default, position:<name>, contract:<Name>, task:<id>; quick standard deep), a category which model fills itSchedules
Section titled “Schedules”hale dna schedule [pause <id> | resume <id>] the schedules the record declares (a definition on an interval or a cron, and who convenes it) and their occurrences; pause and resume are rows in your name (--as <who>)hale dna schedule declare <id> (--every <n>ms|s|m|h|d | --cron <expr>) --definition <id> --convener <position> [--args <json>] a schedule asked of the organization, which declares it or refuses it; an occurrence is an execution of the definition (GH #1143)The head and the face
Section titled “The head and the face”hale dna head [project] [--port P] [--api-port P] [--oidc-port P] [--commands-port P] [--source-drafts] the head: the project service serving the browser face (8792), its API child, the stub OpenID provider and, with a project, the reflexes — built once into the toolchain cache, no checkout needed (from a checkout, dna/face/start.sh); with a project, the head's memory DSN derived as `memory migrate` derives it (`hale dna head --help`)hale dna ui [project] [--port N] under `git config dna.principal oidc` a hosted head: sign-in through dna.oidc.issuer, subjects mapped by dna.oidc.member, the secret the vault's oidc-client-<client>; with no principal source it refuses to start (trusted-local is a test fixture's mode) the DNA surface in a browser, from the record alone: the Board's queue, the Reviews with their three views, the fleet, the history; verdicts, intent and pressure from formshale dna board [project] the Board's queue: what needs its verdict, escalations, proposals, reportshale dna review the pending Reviewshale dna review <id> [--iris] render a Review: source diff, semantic diff, evidence (works offline)hale dna review <family> approve|reject decide every pending Review of a group in turn: purpose, design, operating, using, library, holes, practices, holds, positions, changes, ingest (a library family is one Review for all its ideas)hale dna review all approve|reject every group with a pending Review, in the order a new organization is ratified, each waited for before the nexthale dna review <id> approve|revise|reject|abstain [--as <reviewer>] [--authority <a>] [--comment <c>] [--digest <sha>] [--no-wait] write a verdict into the record, which a node relays; the Review decideshale dna route [--json] (<path>… | --diff <range>) who must sign a change set, and the gates it is judged againsthale dna github sync mirror pending Reviews to pull requests and read their reviews back as verdicts (git config dna.github owner/repo; dna.github.board logins,…; needs `gh`)hale dna report [project] file a report from the record since the last one (report.filed)Tasks and people
Section titled “Tasks and people”hale dna task create [--to <locus>|position:<name>] [--as <who>] [--judgment] [--size quick|standard|deep] [--no-wait] <outcome…> ask for an outcome (--judgment: an assessment, a leg's to perform; --to position:<name>: a change the leg holding that position makes): a row in the record, which a node relays to the organism; prints the Task born or the refusal (on an adopted ledger it prints the request's digest: see `hale dna ledger`)hale dna task done <id> a person reports a handed Task done (--as <who>, --note …); `task reassign <id> --to <who>` under an acceptance practice requiring evidence: --evidence <digest>, or --exception <why> --authorized-by <who>hale dna task authorize <id> --exception <why> authorize an exception, in your name (not the assignee's)hale dna task decide <id> report a decision someone else made (--decided-by <party> --via <channel> --evidence <digest>, --as <reporter>)hale dna retire <who> a person retires: the handed Tasks they hold move to --to <successor>, as rowsShaping
Section titled “Shaping”hale dna fill <position> <holder> [project] [--as <who>] ask the organization to propose who holds a position, for the Boardhale dna ingest [project] [--at <rev>] read the repository's graph again at a commit (HEAD): what differs from the record, tools for every served operation included, proposed as one Board Review (`review ingest approve`)hale dna position open <name> --mandate "<text>" [--text <what it is>] [--under <part>] [--as <who>] open a position at run time: its node and its mandate, one Board Review (`review positions approve`)hale dna apply <file> [--dry-run] [--as <who>] [--on-holes] several changes to the structure (`open`, `fill`, `fill *`, `vacate`, `practice`, `assign`, `unassign`, `close`, `merge`, `split`, `expose`, `depend`, `externalize`, `internalize`, `retire-practice`) as one Board Review, applied all or nothing (`review changes approve`); --dry-run prints the org chart before and after and proposes nothing; --on-holes plans it on the holes init proposed that the Board has not decided, and ratifies it after themhale dna vacate <position> <holder> [--dry-run] [--as <who>] a holder leaves a position: a one-step batch, one Board Review (`review changes approve`)hale dna pack list [--from <dir|git-url[#rev]>]hale dna pack show <name> [--set <param>=<value>]… [--from …]hale dna pack apply <name> [--set <param>=<value>]… [--from …] [--dry-run] [--as <who>] [--on-holes] [project]hale dna pack retire <name> [--dry-run] [--as <who>] [project]hale dna nursery add <dir|git-url> [--dry-run] [--as <who>] [project]hale dna nursery list [project] a nursery the Board trusts, proposed as one batch step; the ones it trusts (a git nursery's packs are adopted only once it is trusted) packs from a nursery (the toolchain's, a directory, or a git repository at a revision): a batch with blanks, adopted as one Board Review named for the pack (`review changes approve`)hale dna practice propose <name> --text <text> [--because <why>] [--supersedes <digest>] propose a practice for the Board to ratify (a knowledge Review); `hale dna practice` lists themThe environment
Section titled “The environment”The variables you set yourself. Everything else the CLI and the body set for the processes they start.
| variable | what it does |
|---|---|
HALE_DNA_MEMORY_DSN_OWNER |
a Postgres of your own instead of dna/compose.yaml’s: the owner role that migrates memory (memory migrate, dev, show) |
HALE_DNA_NATS_URL_OWNER |
a NATS server of your own instead of compose’s: the owner user that creates the stream (nerves migrate, dev) |
HALE_DNA_MEMORY_DSN_SPINE |
the spine role’s DSN, which hale dna run needs; memory migrate prints it |
HALE_DNA_NATS_URL_SPINE, HALE_DNA_NATS_ORG |
the spine’s nerves URL and the organization’s token, which hale dna run needs; nerves migrate prints them |
HALE_DNA_MEMORY_DSN_HEAD |
the head role’s DSN, for a head and nothing else; memory migrate prints it |
HALE_DNA_RECEIPT_KEY |
sixteen characters or more: the key protected evidence is sealed under, given to memory migrate once |
HALE_DNA_OWNER_KEYS |
<owner>=<key> …: the owners of a shared record, for memory migrate |
HALE_DNA_API, HALE_DNA_ID_TOKEN |
the head a leg’s hale dna work verbs talk to without --api, and the bearer token it presents |
HALE_DNA_GENOME_POLL |
seconds between polls of the record’s remote for a changed genome (300) |
HALE_DNA_NO_BUILD_CACHE |
build every seed, instead of reusing a build of the same sources |
HALE_VAULT_DIR, HALE_VAULT_ADDR, HALE_VAULT_TOKEN |
where the vault is: a local directory, or a vault’s HTTP API and its token |
Every HALE_DNA_* variable, with its default and effect, is in the
spec’s Environment
table; a test fails when the tree names one the table does not. The
vault’s three are in the runtime’s
environment table.
The record’s settings live in the clone’s git config:
| key | what it does |
|---|---|
dna.remote |
the remote the record syncs with (origin when unset) |
dna.trust |
local (every writer to the record is trusted) or signed (a relayed row needs a verified signature) |
dna.owner |
on a shared record, the organization this body is |
dna.body |
<user@host>, set by body provision (or new --body): where body start, stop, logs and secret set go without --body |
dna.unix.member |
uid:<n>=<name>: who a local uid is, for the head’s socket |
dna.principal |
oidc for a hosted head |
dna.oidc.issuer, dna.oidc.client, dna.oidc.redirect |
the issuer, the head’s client id, its redirect URI |
dna.oidc.member |
<subject>=<name>, one per person: who a subject is |
dna.oidc.board |
the member names that act with Board authority |
dna.oidc.key |
the pinned signing key of an issuer on the loopback |
dna.github, dna.github.board |
the owner/repo Reviews are mirrored to, and the logins whose reviews count as the Board’s |
The record’s vocabulary
Section titled “The record’s vocabulary”Every row has a kind, an entity, a body and an author. The memory
column is where the row lives once the ledger is adopted: record is
git (refs/dna/journal), ledger is memory (Postgres). Before
adoption every row is the record’s, and the two are read as one
sequence either way (Memory and the record). The table
in dna/core/routing.hl (memory_of) decides. A reader that meets a
kind it does not know keeps walking.
The record and memory
Section titled “The record and memory”| kind | memory | what it is |
|---|---|---|
structure.observed |
record | the compiler’s model of one of the application’s parts, at init |
graph.node / graph.edge / graph.retired |
record | a node of the repository’s graph; a hyperedge of it; one leaving it (also inside a ratified graph proposal’s receipt) |
graph.ingested |
record | hale dna ingest read the repository at a commit (added, changed, retired, the review_id of its proposal) |
graph.requested / graph.proposed / graph.refused |
record | hale dna ingest asks the running organization to open its Review; opened, or not. graph.refused <row id> with by: memory is a graph row memory would not project; the projection goes on past it |
model.rule |
record | the size a selector’s Work needs, and the sizes a more specific selector may move it to (hale dna models rule, task create --size) |
model.category |
record | which model fills <mode>.<size>, whether it returns tool calls, and its price (hale dna models category) |
responsibility.proposed |
record | a one-line responsibility inferred for a part, not yet ratified |
candidate.dropped |
record | a kept candidate is no longer kept, here and at every clone’s sync |
ledger.adopting / ledger.adopted |
record | the move of the day’s work into the ledger asked for, and done at a checkpoint |
ledger.abandoning / ledger.abandoned |
record | its undoing asked for, and done |
receipt.filed |
ledger | an internal document filed as evidence |
receipt.classified / receipt.withheld |
ledger | a protected body memory keeps sealed, or one withheld because no memory could keep it |
receipt.disclosed |
ledger | a reader authorized, for a purpose |
receipt.read / receipt.read_refused |
ledger | a read in the reader’s name, or its refusal |
receipt.held / receipt.hold_released |
ledger | a hold that refuses redaction, and its release |
receipt.redacted |
ledger | the body removed, the digest kept |
connection.proposed / connection.closed |
record | a connection to another record, for the Board; and its closing |
handoff.published / handoff.refused |
ledger | a fact written into a connected record, or why not |
handoff.received |
ledger | an envelope in the receiving record’s mailbox |
handoff.accepted / handoff.accepted_by_peer |
ledger | an acceptance in the receiving record, and its admission back in the origin |
task.transfer_requested / task.transfer_accepted |
ledger | a Task offered across a connection or to another owner, and accepted |
The spine
Section titled “The spine”| kind | memory | what it is |
|---|---|---|
intent.requested |
ledger | an ask from a clone with no organization running |
intent.offered / intent.refused |
ledger | the outcome an ask was admitted for, or the refusal |
intent.unrecovered |
ledger | an intent offered before a restart that no admission names; never re-offered |
task.born |
ledger | the work an intent or a settled Review made |
workflow.admitted / workflow.refused |
ledger | an execution admitted (definition, revision, inputs, the bound recipe), or refused |
workflow.ask_refused |
ledger | an ask refused before any Task was minted |
workflow.settled |
ledger | an execution settled done, failed or cancelled |
step.registered / step.activated / step.completed / step.failed |
ledger | a step’s required set, then its life |
attempt.admitted / attempt.outcome |
ledger | one attempt and the request it was admitted with; its disposition, result and evidence |
work.settled |
ledger | a unit of work settled, naming the attempt it settled on |
effect.requested / effect.result |
ledger | the exclusive claim on an effect key, and its outcome |
effect.relayed |
ledger | an attempt a leg relay answered pending: a leg’s to claim at the head |
effect.redelivered |
ledger | a claimed attempt dispatched again after a restart |
claim.taken / claim.released |
ledger | a node’s claim by id before it acts, and its release |
lease.taken / lease.renewed / lease.released |
ledger | the runtime’s lease on its record, with its fencing token |
budget.exhausted |
ledger | the window’s model allowance is spent |
model.called |
ledger | a model call and its evidence |
grant.contracted / grant.revoked / grant.refused |
record | authority narrowed, taken back, or born wider than its ceiling |
grant.reservation_refused / grant.fenced |
ledger | a spend the window would not admit; an admission refused because the grant’s epoch moved |
spend.reserved / spend.settled / spend.compensated |
ledger | a spend admitted; one attempt’s actual consumption; money that came back, authorized by name |
optimize.refused |
ledger | the organization’s pass over itself did not run |
org.reviewed |
record | that pass’s own answer |
| kind | memory | what it is |
|---|---|---|
attempt.claimed |
ledger | a leg’s lease on an admitted attempt, taken at the head |
attempt.outcome_requested / attempt.outcome_refused |
ledger | the outcome a leg handed back under its lease, or why the owner would not settle it |
attempt.allowance_requested |
ledger | a leg’s ask for its attempt’s spend |
attempt.allowance_granted / attempt.allowance_refused |
ledger | the budget’s one gate answering it (also the editor’s, and review:<id> for the Leader’s) |
attempt.released |
ledger | a leg gave its lease back without an outcome |
attempt.unresolved |
ledger | an uncertain performer’s attempt with no known outcome, until a person resolves it |
friction.filed |
record | what got in a position’s way |
Changes and Reviews
Section titled “Changes and Reviews”| kind | memory | what it is |
|---|---|---|
mutation.requested |
record | which Work and attempt asked for the Mutation |
mutation.proposed |
record | a change proposed for a Task: class, objective, target, base |
mutation.worktree / mutation.located / mutation.candidate |
record | the sandbox; the files found and the grant; the candidate commit |
mutation.review / .stage / .escalate / .release / .deny |
record | what the autonomy boundary decided |
mutation.topology |
record | the diff names a plan or the manifest: re-classed for the Board |
mutation.applied / mutation.apply_retried |
record | the candidate applied to the genome; the apply run again |
mutation.retained / mutation.rolled_back |
record | kept after its observation window, or the genome back at the base |
mutation.rejected / mutation.revise |
record | refused after review, or sent back |
mutation.refused / mutation.failed |
record | not applied, or did not survive its own verification |
evidence.<step> |
record | a verification step’s output by digest: base, fmt, check, verify, test, fleet, replay, rollback, diff |
evidence.magnitude |
record | the measured magnitude of the change |
review.requested |
record | the Review: question, authority, candidate, disposition, evidence, diffs |
review.routed / review.signed |
record | what a routed Review requires; an approval it admitted that settled nothing |
review.verdict |
record | a verdict in the reviewer’s name, from a clone or a forge |
review.command_decided |
record | a Review decided by a command |
review.settled / review.refused |
record | the verdict that decided it, or why one was not admitted |
review.reasoned |
record | the deciding verdict’s comment |
gate.observed |
record | a gate’s check run at the candidate, as the forge reported it |
github.pr / github.commented |
record | the pull request a Review opened, and the settlement commented back |
The heart and the body
Section titled “The heart and the body”| kind | memory | what it is |
|---|---|---|
application.attached / application.detached |
record | the application the organism oversees, and its removal |
expression.restart_requested |
record | the organization asks for a change to be expressed |
expression.restarted / expression.deployed |
record | what the new expression reports, or what a deployment gateway expressed |
expression.observed / expression.crashed |
record | the observation window’s outcome |
observation.requested / observation.refused |
record | the host’s observation report as a row |
fleet.deploy |
record | a genome revision expressed through the fleet’s nodes |
instance.up / instance.exited |
ledger | a node’s report on one instance of the plan |
node.started / node.build_failed |
record | a node runs a genome; or a genome did not build, and it stayed on the last |
body.claimed / body.released |
ledger | who is running this record, by the lease’s token |
body.provisioned |
record | a machine made able to run it |
body.credential_missing / body.credential_present |
ledger | whether the model’s key is in the vault where the body runs |
Senses and reflexes
Section titled “Senses and reflexes”| kind | memory | what it is |
|---|---|---|
reading.recorded |
ledger | an application’s event, landed as a reading before anything acts on it |
reflex.acted |
ledger | what a node did about a reflex’s firing |
pressure.requested / pressure.raised |
ledger | a signal from a source, and its answer |
pressure.remeasured |
ledger | the declared fitness signals, measured again after a change |
concern.requested / concern.raised / concern.refused |
ledger | a concern from a part about the part above it, and its answer |
concern.proposed |
record | three raises became a proposal |
appendage.proposed / appendage.candidate |
record | an organ the organization proposes for itself, and the Mutation that proposes it |
The skin
Section titled “The skin”| kind | memory | what it is |
|---|---|---|
secret.rotated |
record | a credential set or rotated: its name and where, never the value |
violation.recorded |
record | a closure a part absorbed and went on from: adapter_undeliverable, lease_unsettled, pulse_stopped |
Schedules
Section titled “Schedules”| kind | memory | what it is |
|---|---|---|
schedule.requested / schedule.answered |
ledger | a schedule asked of the organization, and its answer |
schedule.declared / schedule.refused |
ledger | a schedule declared, or refused with the reason (also an occurrence refused) |
schedule.skipped / schedule.missed |
ledger | an occurrence skipped while the last is open; occurrences that passed with no tick |
schedule.paused / schedule.resumed |
ledger | paused and resumed by hand |
People, knowledge and practices
Section titled “People, knowledge and practices”| kind | memory | what it is |
|---|---|---|
task.handed / task.reassigned |
ledger | a Task handed to a person; the assignment moved |
case.admitted |
ledger | a person’s leaf as its own handed Task |
task.done |
ledger | a person reports a handed Task done |
completion.linked / completion.excepted |
ledger | the evidence a completion links, or the exception it carries |
exception.authorized |
ledger | an exception to a Task’s acceptance, in the authorizer’s name |
decision.reported |
ledger | a decision someone else made, reported by the assignee |
person.retired |
record | someone left, and who took their work |
hold.requested / hold.proposed / hold.refused |
record | a holder asked for a position (hale dna fill), proposed to the Board, or refused |
batch.proposed |
record | a batch hale dna apply proposed as one Review in changes, with its steps (and planned_on, the pending Reviews it was planned on); graph.requested under the same id asks the organization to open it |
position.requested / position.proposed / position.refused |
record | a position asked at run time (hale dna position open), proposed with its mandate as one Board Review, or refused |
practice.requested / practice.proposed / practice.refused |
record | a person’s practice proposal: asked, proposed for review, or refused |
knowledge.proposed / .ratified / .declined / .refused |
record | a practice through its Review |
knowledge.retired |
record | a practice superseded by a later version |
knowledge.consulted |
ledger | what a piece of work looked up |
practice.read |
record | what the hat read once a proposal was ratified |
report.filed |
ledger | a report from the record since the last one |
hale dna status --json
Section titled “hale dna status --json”The projection status prints, as one JSON document on one line;
hale dna ui serves the same at /api/status. Here it is for a fresh project with nothing
running, indented, with twenty-two of its twenty-three pending Reviews cut:
$ hale dna status --json{ "organism": "not running — reading the Journal", "journal": { "ref": "refs/dna/journal", "revision": 38, "chain": "verified", "chain_head": "77bc90bc6b4a31e4fb45b98d4da500309d6e6100" }, "expression": { "attached": { "artifact": ".hale/dna/baseline.topology", "artifact_digest": "aaa7945205031d36", "main": "Refproj", "name": "refproj", "provenance": "observed", "schema": "1.19", "shape_hash": "6aacbffe834a9fcd", "toolchain": "0.21.0", "verdict": "clean" }, "current": null, "build_digest": null, "toolchain": "0.21.0", "restarts": 0, "last_restart_request": null, "last_observed": null }, "intents": { "offered": 0, "refused": [] }, "tasks": [], "reviews": [ { "id": "k:05cecb18af4e", "state": "pending", "question": "ratify the design practice `design/software-delivery`: For an appendage or a product: process boundaries first (what runs, fail…", "required_authority": "board", "subject_digest": "sha256:05cecb18af4e5fc83bd62025ee3477b831ff2a9299c497116dc4ffaf90ccd7a1", "refusals": [] }, … ], "mutations": [], "law_deferred": [], "model_calls": { "total": 0, "recent": [] }, "pressure": "not journaled in Phase 1", "projected_at": 1790702205}organism is running (this clone's body holds the lease) when a body
here holds the lease. chain is verified or BROKEN. As the
organism works, the arrays fill:
- a task:
id,outcome,state,since, anddetailwhen there is one; - a settled Review adds
settled(andreasoned); a Mutation’s Review addsmutation_id,change_class,seed,disposition,base_commit,candidate_commit,candidate_shape,evidence,magnitude,diff_text,diff_jsonandauthor; - a Mutation:
id,candidate,disposition,class,task,objective,detailandworktreewhen set, and itsevents; last_restart_requestandlast_observed:mutation,what,seq.
Where things live
Section titled “Where things live”A generated project
Section titled “A generated project”hale dna new <name> writes these; hale dna init writes the same
around an application you already have.
| path | what |
|---|---|
main.hl, tests/main_test.hl |
the application and its first test (new only) |
hale.toml |
the manifest: an environment for the application (.) and one for the organization (dna/org) |
hale.lock |
the toolchain the DNA was materialized for ([dna] toolchain) |
.gitignore |
ignores the build artifact, /vendor/, /.hale/ and the two password files |
vendor/dna/ |
the DNA core, copied from the toolchain; git-ignored, hale dna upgrade copies it again |
dna/org/main.hl |
the organization: its positions, the Leader’s grant, the budget’s owner |
dna/org/law.hl |
its law |
dna/org/purpose.hl |
the declared purpose |
dna/org/charter.hl |
the Leader’s brief |
dna/org/models.hl |
the model catalog and the budget |
dna/org/work.hl |
the performers a leg runs |
dna/org/workflows.hl |
the workflow catalog; rewritten by upgrade, not yours to edit |
dna/org/own_workflows.hl |
your own workflow definitions, beside the baseline |
dna/compose.yaml |
memory (Postgres), the nerves (NATS) and the senses’ store, for hale dna dev |
dna/nats.conf |
the nerves’ users, one per family of subjects |
dna/senses.yml |
what the senses’ store scrapes |
dna/nats.secrets.conf, dna/postgres.secrets |
the compose services’ passwords, written from the vault; git-ignored |
The organism’s state
Section titled “The organism’s state”| where | what |
|---|---|
refs/dna/journal |
the record: one commit per row |
refs/dna/receipts/<sha256> |
receipts, by the digest of their content |
refs/dna/identity |
the record’s identity; a sync publishes it to the remote |
refs/dna/lease/<key> |
leases with fencing tokens; refs/dna/lease/body is the body lease |
refs/dna/candidates/<mutation> |
a Mutation’s candidate, kept whatever its Review decided |
refs/dna/revisions/<rev> |
a revision a deploy asked the nodes to express |
refs/dna/exchange/<identity> |
a connected record’s mailbox in this one |
refs/dna/remote/… |
what the last fetch brought from the remote (journal, lease/body, genome) |
.git/config |
the record’s settings (dna.trust, dna.unix.member, … above) |
.hale/dna/ |
this clone’s scratch: status.json, the organization’s log org.log, the topology artifacts, embedded.digest, the seed build cache build/, sandboxes worktrees/, scratch/, the built leg legs/, a person’s kept worktrees work/<attempt>, an ingest’s checkout ingest/<sha>/ (removed after) |
.hale/node/<name>/ |
on a node: its instances’ pid files and artifacts |
| memory | Postgres, schema dna_<record identity>: the ledger, the graph and protected evidence, under the spine’s and the head’s roles |
| the nerves | one JetStream stream per organization, named after its token in capitals |
| the vault | HALE_VAULT_DIR, else $XDG_CACHE_HOME/hale/vault, else ~/.cache/hale/vault; one file per secret, mode 600. HALE_VAULT_ADDR names a vault’s HTTP API instead |
HALE_DNA_HEAD_STATE |
the project head’s state (${XDG_STATE_HOME:-$HOME/.local/state}/hale/dna/head when unset) |
Once the ledger is adopted, the day’s work is in memory, not in
refs/dna/journal; hale dna ledger status says where things stand.
hale dna secrets lists every vault entry the organism needs.