Shaping and governing it
The genome is what the organism is made of: the application's source, the organization under dna/org (its org chart, its law, its purpose, its catalogs)…
The genome is what the organism is made of: the application’s
source, the organization under dna/org (its org chart, its law, its
purpose, its catalogs), and the vendored core in vendor/dna. Its one
job is to be the only place the organism’s shape is written. The
project owns it, and every change to it is a candidate someone
reviews: the Leader inside the grant the Board wrote, the Board for
everything else. It fails before anyone reviews: a candidate that does
not check, or that breaks the law, is denied with the reason. It never
holds a secret or the day’s work; those are the vault’s and memory’s.
This page is how you shape it, and how the organism is governed while you do.
What you shape
Section titled “What you shape”| file | what it says | changed by |
|---|---|---|
the application (main.hl and its seed) |
the heart: what the organism is for | a reviewed change of class application, feature, refactor or docs |
dna/org/main.hl |
the org chart as a program: the substrate, the Leader, the grant, the review policy, the nerves | an organization change, the Board’s |
dna/org/law.hl |
what no position may ever do, checked by the compiler | an organization change, the Board’s |
dna/org/purpose.hl |
the declared purpose, one sentence | the first Review ratifies it |
dna/org/charter.hl |
the Leader’s brief | an organization change |
dna/org/models.hl, dna/org/work.hl |
which model each position calls, and a leg’s performers (Legs, hands and voice) | an organization change |
dna/org/own_workflows.hl |
your own workflow definitions (The spine) | an organization change |
vendor/dna |
the core, the toolchain’s (DNA, the building block) | hale dna upgrade, never by hand |
They are ordinary Hale source. Edit one by hand, and hale check --matrix . checks the application and the organization, each against
its own law (Constitutions). Or ask the organism
for the change (hale dna task create), and it arrives as a candidate
with its diffs and evidence for review (One task, end to
end). Beside the genome, the record holds
what the Board decided about it: the purpose ratified, the practices in
force, who holds which position.
The purpose
Section titled “The purpose”dna/org/purpose.hl is one sentence, and the first thing a reviewer
sees about what the codebase is meant to be:
// dna/org/purpose.hl — the declared purpose (project-owned).//// The first governed workflow is the baseline review: the Review// named `purpose` ratifies THIS text (its subject digest is the// sha256 of PURPOSE). Change the text and the Review's digest// together, or the verdict is refused as stale.
const PURPOSE: String = "refproj: keep the application correct, reviewable and explainable; every change is staged, reviewed, and never applied by the organism itself.";
fn purpose() -> String { return PURPOSE;}init writes it and proposes it for the Board in the same step; hale dna review lists it first, and hale dna review purpose approve --as <you> ratifies it (Getting started). Make it
true of your project before you do: the Leader reads it every time it
thinks.
The charter
Section titled “The charter”dna/org/charter.hl is the Leader’s brief, a function returning text
like purpose:
// dna/org/charter.hl — the leader's brief (project-owned; generated by// `hale dna init`). The leader reads this, the purpose, the law and// the ratified design before it plans an ask and before it decides a// Review. Change it as you would any part of the organism: through a// reviewed change.// …fn charter() -> String { return CHARTER;}The generated text makes the Leader the organism’s architect: it
proposes and the Board decides. It tells it to say, first, what an ask
is — whether it concerns the organism, an appendage, a product or a
person’s job, which class of change, one change or several — and that a
plan only splits and classifies, never widens what was asked. Before it
plans an ask and before it decides a Review, the Leader composes its
brief in this order: CHARTER, PURPOSE, the LAW as the genome
holds it, and PRACTICES, the package of ratified practices for org
when memory has any.
Practices
Section titled “Practices”A practice is a named paragraph the Board ratifies: how work is done here. The Leader reads the ratified ones in its brief, a reviewer cites them, and nothing is in force until the Board says so.
init seeds three families as proposals, one Board Review each:
| family | practices | what it says |
|---|---|---|
design (8, and three mandates) |
principles, evolution, structure-follows-intent, standard-equipment, signals, signaling, optimize, software-delivery; mandate-leader, mandate-editor, mandate-agent |
how an organization is shaped: minimal structure, clean cuts, growth by proposal |
operating (7) |
one-store-per-step, row-first, readings-never-act, legs-hold-nothing, deploy-settles-on-pulse, the-forge-decides, optimize-cadence |
how the organism runs: what the Leader plans within and a reviewer cites |
using (7) |
propose-review-ratify, change-classes, ask-the-leader, cut-structure, read-the-record, evidence-first, bind-knowledge |
how to work with the organism: what a proposal states, who a class signs for, what the record is for, where knowledge is bound |
A mandate is a practice with a position to be bound to: what that
position decides, what it may not, what it cites, how it writes and what
it escalates, with the authority defaults derived from the law’s change
classes (the charter refines them). The three in design are the
Leader’s, the editor’s and the agent’s; init on a repository proposes
one more with every position it proposes, in a repository or an
application (mandate/<position>, listed
under holes right after its position). Ratified, a mandate is bound to
the position’s node, so whoever holds the position reads it in their
hat. It is knowledge about a position, not a grant.
The first two operating practices are the two rules of
the organism. hale dna review groups them:
$ hale dna review32 pending review(s) of 32 purpose — the declared purpose, the Board's to ratify first: k:3870910f5de4 — ratify the declared purpose? decide one with `hale dna review <id> …`, or all pending with `hale dna review purpose approve|reject` design — 11 seeded practice(s), each its own Review: k:05cecb18af4e — ratify the design practice `design/software-delivery`: For an appendage or a product: process boundaries first (what runs, fail… … decide one with `hale dna review <id> …`, or all pending with `hale dna review design approve|reject` operating — 7 seeded practice(s), each its own Review: k:33be310ddba8 — ratify the operating practice `operating/one-store-per-step`: a workflow step writes to exactly one store, by that store's one writer,… … decide one with `hale dna review <id> …`, or all pending with `hale dna review operating approve|reject` using — 7 seeded practice(s), each its own Review: k:8c1f6a4e2d70 — ratify the using practice `using/propose-review-ratify`: nothing is in force until the Board says so. A change to the organi… … decide one with `hale dna review <id> …`, or all pending with `hale dna review using approve|reject` holes — 6 hole(s) the repository leaves, each its own Review: k:d51a712f169e — ratify the position `board` under the purpose: it ratifies what this organization becomes … decide one with `hale dna review <id> …`, or all pending with `hale dna review holes approve|reject`render one with `hale dna review <id>`; decide with `hale dna review <id> approve|revise|reject|abstain`hale dna review design approve --as <you> decides each pending one
in turn; the record still holds one verdict per practice. One of them
does more than advise: operating/optimize-cadence, once ratified,
declares the schedule of the optimize pass, once a day, convened by
the Leader (Schedules). A different cadence is an
amendment to that practice.
The using family is kept when init is run with --no-library: the
library is the book and the spec, which the Board ratifies a family at a
time (What a Work is told),
and these are practices, one Review each. hale dna upgrade proposes
each practice of the three families whose text changed, as it does the
design, and the new toolchain’s library as new families.
Proposing one
Section titled “Proposing one”A practice can come from anyone. When the same thing keeps going wrong, write down how it should go and say what prompted it:
hale dna practice propose acceptance/expense-receipt \ --text "An expense closes with its receipt.evidence: required" --because "three bills arrived without receipts"The command writes a practice.requested row in your name (--as <who> names another); a running node relays it, and the organization
proposes it with a Board Review of its own. With the organization
running here, the command waits for that answer:
practice acceptance/expense-receipt proposed by alice as sha256:…; the Board ratifies it: `hale dna review k:… approve --authority board`Roles are authorities, not identities: the person who proposed a
practice may ratify it with the Board’s authority, and the record keeps
who proposed and who decided. --supersedes <digest> names the
version it replaces: ratifying the new one retires the old, declining
it leaves the old in force. What an acceptance practice such as this
one does to a person’s job is on One task, end to end.
hale dna practice lists every practice with its state (awaiting the Board, in force, declined, retired):
$ hale dna practicepractices: 16 purpose sha256:38709 [awaiting the Board (k:3870910f5de4)] refproj: keep the application correct, reviewable and explainable; every change is staged, reviewed, and never applied by the organism itself. design/principles sha256:7b594 [awaiting the Board (k:7b5940a6bf3c)] Minimal structure: add a position only when it serves the whole; … …Grant and autonomy
Section titled “Grant and autonomy”Autonomy is a grant: written by the Board, held by a position, never
widened by the position. In the generated organization the position is
the Leader, and the grant is in dna/org/main.hl:
boundary: dna::AutonomyBoundary { child: "refproj", grant: dna::Grant { child: "refproj", classes: "refactor docs", max_magnitude: 4, review: "pre" } }, review_policy: dna::OrgPolicy { },classes— the change classes the Leader may decide.max_magnitude— a ceiling on the sum of the change’s magnitude vector (below). Past it, the change escalates whatever its class.review—"pre","post","sampled"or"audit"."pre"asks for a verdict before anything is applied; the others let a change with enough evidence be released, if the review policy does not block its class.
The grant is a constructor argument, not a runtime setting: no verb
and no position widens it. Changing it is a change to the
organization’s own seed, dna/org, which an organization change
edits and the Board decides.
Change classes
Section titled “Change classes”The Leader names a change’s class when it plans the ask. When its
answer names none, the change is an application change of an
appendage, and a change to the organism itself is class organization
whatever the plan called it.
| class | what it is | decided by, under OrgPolicy |
|---|---|---|
docs, refactor, feature, application |
a change to the application | the Leader when the class is in the grant and the change is under its magnitude; else the Board |
organization |
a change to dna/org: a position, a route, the grant |
the Board |
constitutional, process-policy |
classes the Leader’s plan may name | the Board |
topology |
a change to the fleet’s shape; a candidate that names a plan or the manifest is re-classed topology (mutation.topology) |
the Board |
With the generated grant, an application change escalates to the
Board. Widen it to "refactor docs application" in a reviewed commit
and the Leader decides those under the magnitude too, with the record
showing that it did.
The magnitude vector
Section titled “The magnitude vector”Every candidate is measured from its semantic diff on a vector, never
reduced to a confidence score, because a score would let evidence
cancel a boundary it must never cancel (dna/core/types.hl):
| dimension | read from the semantic diff | adds to the sum |
|---|---|---|
loci |
locus declarations the diff names | 1 each |
contract_change |
a parent-facing contract moved | 4 |
effects_widened |
an effect class newly reached | 4 |
law_touched |
a claim added, removed, or whose result moved | 6 |
placement_change |
the placement facet | 2 |
ownership_crossed |
the ownership facet | 3 |
state_migration |
a locus’s params changed | 3 |
irreversible |
params changed, or something removed | 5 |
external_blast |
a newly reached effect class that is not intrinsic | 2 |
novelty |
3 until the lineage has applied anything, then 1 | its value |
Four are hard boundaries no grant covers: touching law, widening effects, crossing ownership, and an irreversible change with an external blast.
The evidence and the disposition
Section titled “The evidence and the disposition”Evidence is counted, not rated: check_clean 1, verify_clean 1,
tests_pass 2, replay_ok 2, rollback_rehearsed 2, and 2 per
independent review. Before any of it counts, a candidate that does not
check, or breaks a claim the fleet makes, is denied (mutation.deny);
a seed with no Hale source to check is reviewed by a person whatever
the grant.
Then dispose(grant, class, magnitude, evidence), a pure function,
decides:
- a hard boundary → review;
- the class is not in the grant → escalate;
- the sum exceeds
max_magnitude→ escalate; - the evidence is below the sum plus twice the novelty → stage;
review: "pre"→ review; otherwise → release.
The disposition is a row (mutation.review, mutation.stage,
mutation.escalate, mutation.release), so a reviewer sees why they
were asked. Every disposition opens a Review, and only a release under
a policy that does not block its class is applied before its verdict.
The mechanical evidence adds up to 8, and a first change in a fresh
lineage needs at least 9: without an independent review, nothing is
released before its lineage has applied a change.
Who is asked
Section titled “Who is asked”The review policy turns a disposition into a required authority.
OrgPolicy requires the Board for a change that touches law, widens
effects or crosses ownership, for the four Board classes, and for
anything escalated; everything else inside the grant is the Leader’s,
which answers with a model call and its reasoning in the record.
Authorities are ranked board, leader, supervisor, reviewer, and
a higher one satisfies a lower requirement. That authority is the
fallback: when the positions of the graph that must sign a change are
held, they sign it, and the Leader never decides it (The head and the
face).
Post-review, for what you trust
Section titled “Post-review, for what you trust”For small reversible refactors on a codebase with a history, swap the policy and loosen the grant for that class:
import "vendor/dna" as dna;
// Post-review for refactors: applied first, reviewed after.fn trusted_policy() -> dna::PostReviewRefactors { return dna::PostReviewRefactors { };}
fn trusted_boundary() -> dna::AutonomyBoundary { return dna::AutonomyBoundary { child: "refproj", grant: dna::Grant { child: "refproj", classes: "refactor", max_magnitude: 12, review: "post" } };}Use them as review_policy: trusted_policy() and boundary: trusted_boundary() on dna::Dna. PostReviewRefactors blocks every
class but refactor. A refactor inside the grant, past no hard
boundary and with enough evidence, is released: applied, expressed and
observed first, and its Review follows with the question post-review: applied m4 (refactor): …?. A reviewer suffices to answer it. Reject
it and the applied candidate is rolled back.
Grants above grants, and money
Section titled “Grants above grants, and money”dna::Dna takes a second boundary, ceiling, which the generated
organization leaves unset. With one, the Leader’s grant is read
through it at every assessment: the classes both allow, the smaller
magnitude, the stricter review. A grant written wider than its ceiling
is refused in the record at birth (grant.refused) and bound by the
ceiling.
A grant can also delegate money, and names nothing by default, so a grant that names no currency lets nothing be spent:
import "vendor/dna" as dna;
fn books_grant() -> dna::Grant { return dna::Grant { child: "books", classes: "docs", max_magnitude: 4, review: "pre", amounts: "USD 500.00", window_amounts: "USD 2000", window: "week", counterparties: "suppliers", routes: "operating-account", expires: 1798761600 };}amounts is per operation, window_amounts per window, expires
in unix seconds (0 never). The substrate reserves a spend against the
grant before it is made (grant.reserved), and the law forbids any
position from reaching a money effect except through it.
The law
Section titled “The law”dna/org/law.hl is what no position may ever do, as the compiler sees
it. The organization adopts it in its main (claims { adopt Org; });
the application keeps its own constitution:
group board = { dna::Board };group leader = { dna::Leader };group substrate = { dna::Dna };group positions = { dna::Leader, dna::SourceEditor, dna::WorktreeTools, dna::LegRelay, dna::RelayReplay, dna::HumanWorkGateway, dna::ServicePerformer, dna::ScriptedPerformer };group editors = { dna::SourceEditor, dna::WorktreeTools };group knowledge = { dna::Knowledge, dna::MemoryKnowledge };group credentials = { dna::CredentialSource, dna::HostedCredential };
constitution Org { // … apply_only_through_the_substrate: forbid reaches(positions, effects(genome_apply)) avoiding substrate; // … editors_never_commit: forbid reaches(editors, effects(repo_write)); editors_never_touch_worktrees: forbid reaches(editors, effects(worktree_io)); editors_never_apply: forbid reaches(editors, effects(genome_apply)); editors_never_learn: forbid reaches(editors, knowledge); // … leader_never_commits: forbid reaches(leader, effects(repo_write)) avoiding substrate; leader_never_touches_worktrees: forbid reaches(leader, effects(worktree_io)) avoiding substrate; // Credentials are read from their source into sealed loci and never returned. credentials_sealed: require sealed(all credentials); // … money_only_through_the_substrate: forbid reaches(positions, effects(money)) avoiding substrate;}Nothing is applied except through the substrate’s gate after a settled Review; the editor reaches no git, no worktree gateway, no apply and no memory; the Leader decides and never commits; credentials stay sealed; money moves only through the substrate. These hold because the compiler checks them against the organization you actually wrote, following bus edges as well as calls.
The avoiding substrate clauses are what make “the Leader decides, the
substrate acts” a checked fact. The Leader’s verdict does reach a
repository, through the bus and dna::Dna, and only that way. Drop the
clause from leader_never_commits and the check shows the path:
$ hale check dna/org…/dna/org/law.hl:31:5: type error: claim `leader_never_commits` violated: `leader` reaches `effects(repo_write)` — witness: `dna::Leader::on_requested` -(publishes "dna::ReviewVerdict")-> `dna::Review::on_verdict` -(publishes "dna::ReviewSettled")-> `dna::Dna::on_review_settled` -> `dna::Dna::rollback_to_base` -> `dna::MutationGateway::rollback` -(dispatches dna::Repository.rollback)-> `dna::LocalGit::rollback`…Hand the editor a repository in main.hl and the build fails the same
way, with the path as its witness, before anyone reviews anything. Add
clauses of your own in the same block; the file asks you not to weaken
these. A change that moves a claim is law_touched, a hard boundary,
and the Board’s whatever its class. The vocabulary is Claims & the
law; how an application states its own law, and how the
two entrypoints are checked together, is
Constitutions.
Positions and fill
Section titled “Positions and fill”The Board and the Leader are loci in dna/org/main.hl. The positions
people hold — a board, a reviewer of a part, a dev, an operator — are
nodes of the organism’s graph, and who holds each is a holds edge,
proposed and ratified like a practice (Memory and the
record has the graph; hale dna show org reads it from
memory). init proposes the positions its structure implies, for a
repository (DNA, the building block)
and for an application alike: the board, the application’s dev and
reviewer, each as a proposal until the Board ratifies it with
hale dna review holes approve. Before it does, there is nothing to fill:
$ hale dna fill board alicehale dna: fill: `position:board` is no position or organization the record states or proposesTo seat people in the holes as init opens them, give init a pack
that fills them (A pack at init): one verdict then
ratifies the holes and their holders.
For a position the record states or proposes, ask the organization for a holder:
hale dna fill <position> <holder> [project] [--as <who>]A position’s node can carry equipment, the API roles its holder is
fitted with (equipment.roles): init derives them from the
description the toolchain exports for a contract (spec/<Stem>.description.json,
or hale check --api for the surfaces and streams an application serves;
requires: [editor] lands on <app>/dev, requires: [reviewer] on
<app>/reviewer) and fill prints them (equipment: editor), and hale dna show org lists them
with the position’s mandate ({mandate: ratified; roles: editor}). Granting a
token that carries them is not done by fill.
The CLI checks first: the holder must be a person the record knows (a
row in their name, or an organization’s member) who has not retired,
and never a name the organism writes as. The request is a
hold.requested row in your name; the organization answers with a
Board Review, listed by hale dna review under holds. Whoever holds
the Board decides it, you included if that is you: a governance proposal
is the one exception to the rule that a candidate’s author may not
review it, since seating someone is not reviewing your own work (a change
to the code still needs someone other than its author, even one the
Board must approve):
proposed alice to hold position:board: the Board ratifies it as k:… (`hale dna review` lists it under `holds`)A part’s reviewer and its dev are never the same holder. While you
work alone (dna.trust = local) that is a warning; on a shared record
it is refused, by the CLI and again where memory takes the ratified
hold (hold.refused).
On a record several firms share, fill also says which firm owns a
position and who belongs to a firm, both holds edges:
hale dna fill org/collections organization:north # north owns org/collectionshale dna fill organization:north bob # bob is north's memberA position has one owning organization, and a person belongs to one at most.
Opening a position
Section titled “Opening a position”A position the graph does not state yet is opened through the organization, as a fill is:
hale dna position open api/steward --mandate "decides how the list's api reads; may not change the browser; cites the README's axioms; escalates a new surface to the Board" --under api --text "keeps the list's api"The mandate is required: what the position decides, what it may not
do, what it cites and what it escalates. --under names the part it
unfolds from; a bare name is the seed, work part, position or process
the graph states by that name, and a name the graph does not state is
refused. The organization proposes the position’s node and its mandate
as one Board Review, listed under positions:
proposed opening position:api/steward with its mandate: the Board ratifies it as k:… (`hale dna review` lists it under `positions`)Ratifying it ratifies both. A name the graph already states, or one
asked twice, is refused. Once it is ratified, hale dna fill gives it a
holder.
Changing several things at once
Section titled “Changing several things at once”A team is several positions and the people who hold them. Opening and filling each one is a Review apiece; a batch proposes them all as one, and the Board decides it once. Write the steps in a file:
# the api teamopen api/dev | Decides: how the api is built. May not: sign its own changes. Cites: the contract. Escalates: to the Board.open api/reviewer under position:api/dev | Decides: whether a change is ready. May not: write it. Cites: the change. Escalates: to the Board.fill api/dev adafill api/reviewer boand read what it would do before proposing it:
hale dna apply team.batch --dry-run+ position position:api/dev+ mandate position:api/dev+ position position:api/reviewer+ mandate position:api/reviewer+ holds position:api/dev ada+ holds position:api/reviewer bo6 line(s) added to the organization, 0 unchangednothing proposed (--dry-run)A step may also take a holder out: vacate api/dev ada. On its own,
hale dna vacate api/dev ada proposes that one step the same way; the
position stays, and the hold goes once the Board ratifies it.
fill * ada fills every seat the batch leaves vacant: each position the
organization would then state with a mandate and no holder (the batch’s
own included). It is taken after every other step, so fill api/dev bo
beside it keeps that seat for bo, and the Review lists the fills it
stands for, one a seat.
Without --dry-run, apply proposes it as one Review, listed under
changes; hale dna review changes approve ratifies every step of it
together. A batch is checked whole before anything is written: a fill
of a position nobody opens, a position opened twice, an under naming
nothing, and the batch is refused with the step that is wrong. The
order of the steps does not matter. If the organization changed before
the Board decides, so that the batch no longer applies (one of its
positions was opened meanwhile), approving it refuses it whole, and
nothing of it lands: propose it again against the organization as it
is.
Reshaping the organization
Section titled “Reshaping the organization”The same file takes the operations that change a structure that exists:
assign api/reviewer reviews contract:spec/todo.mdmerge api/reviewer into api/dev # holders and reviews carry over, then api/reviewer closessplit api/dev into api/frontend api/backendclose ops/oncallexpose seed:billing as contract:spec/billing.mddepend seed:web on contract:spec/billing.mdexternalize seed:billing # the part leaves; the organism depends on its contractinternalize contract:spec/billing.md as seed:billingEach is a step like open or fill, so several of them are one Review,
and the dry run shows what they add and take out: reviews lines for
what a position signs, part lines for the parts, serves, consumes
and outside lines for who meets at a contract. A split starts both new
positions from the old one’s mandate, for the Board to amend. Closing a
position takes its holders and reviews with it; the Board’s position is
never closed.
A pack is a batch someone wrote once to be adopted many times, with
blanks to fill: a dev team for a part, a small startup, a team that ships
no code, a founder who holds every seat. Packs come from a nursery, a directory or a git repository
with a nursery.toml index at its root; the toolchain carries one.
hale dna pack listhale dna pack show dev-team --set part=apihale dna pack apply dev-team --set part=api --set dev=ada --dry-runhale dna pack apply dev-team --set part=api --set dev=adashow prints the steps with the blanks filled; apply proposes them as
one Review, named for the pack, like any batch. A pack may open
positions, fill them and propose the practices its people work by
(practice <name> | <text> is a batch step too). A line marked ? is
left out when a blank it uses is not given, so --set dev=ada fills the
dev’s seat and leaving out reviewer leaves that seat open. Another
nursery is named with --from: a directory, or a git URL with #<rev>
for the revision to read. A git nursery’s packs are adopted only once
the Board trusts it: hale dna nursery add <url> proposes that, and
hale dna nursery list shows the ones it trusts. The Review records which pack it was, its
digest and where it came from.
hale dna pack retire dev-team undoes the latest adoption the Board
ratified, as one more Review: the positions the pack opened close, the
seats it filled and the reviews it assigned elsewhere are taken back,
and its practices retire. Anything that has already gone is left out.
A pack at init
Section titled “A pack at init”hale dna init --with <pack> proposes a pack in the same breath as the
holes init opens, and the pack may fill those holes:
hale dna init . --with founder --set founder=riley --as rileyhale dna review all approve --as rileyThe holes are proposals until the Board ratifies them, so a batch planned
against the record alone finds no board to fill. init --with plans
the pack on them instead: as though they were ratified. The batch
names the pending Reviews it stands on, and the dry run says so:
+ holds position:board riley+ holds position:api/dev riley…5 line(s) added to the organization, 0 taken out, 19 unchangedplanned on 10 pending Review(s) (k:c5a61bce0f4b, …): ratified after them, refused whole if any is notreview all approve decides holes before changes, so one verdict
ratifies the holes and then the pack. A pack approved before its holes
waits for them; if the Board declines one of them, the pack is refused
whole as stale, and nothing of it lands. A pack that opens a position
init already proposes is refused as soon as it is proposed.
hale dna apply <file> --on-holes and hale dna pack apply … --on-holes
plan the same way while init’s holes are still pending.
From the head’s API
Section titled “From the head’s API”The same changes are commands of the head, for a UI or any program: every
mutation is a head command, and the UI is a client of the generated
surface. Commands::open_position, Commands::fill and
Commands::apply_batch write the rows position open, fill and apply
write, in the caller’s name; Commands::preview_batch is the dry run, as
data. They need a seat (any position), and the organization answers them
as it answers the CLI. The head
has the shapes.
How the organization grows
Section titled “How the organization grows”The org chart grows the way the code does: by a proposal the Board reviews. The signal is pressure, something seen more than once (Senses and reflexes has where it comes from):
hale dna pressure raise ingest "the ingest worker lags behind the queue every evening"hale dna pressureWhen one source has raised pressure three times (the concerns family’s
appendage_threshold), the organization writes appendage.proposed —
“an organ for <what> is proposed, not created” — and tells the Board.
With initiative on, which is dna::Dna’s default, it goes one step
further: it asks for an organization change to its own seed, whose
objective is a dna::Leader beside the existing one in main.hl,
named for what it oversees, with models: leader_models(). That
candidate is verified like any other, recorded as
appendage.candidate, and is the Board’s to decide. Applying it asks
the host to rebuild and restart the organization with the position in
it, and the window then judges the new organization. Set initiative: false and the proposal stays a note for the Board.
When the window judges an applied change, the record also gets
pressure.remeasured: the fitness signals the proposal declared, and
what the window saw.
Growth is also walked on a cadence: the optimize-walk workflow, whose
schedule the practice operating/optimize-cadence declares, proposes
one small change to the organization or records that the state is
clean (Schedules).
Keeping the toolchain’s part current
Section titled “Keeping the toolchain’s part current”After you upgrade hale, run:
hale dna upgradeIt rewrites vendor/dna from the binary and re-pins hale.lock:
vendor/dna: <n> file(s) rewritten, <m> unchanged; hale.lock pins toolchain <version>, embedded dna <digest>. dna/ untouched.Your own files under dna/ stay yours. What upgrade does touch there
is generated, or missing:
- It rewrites
dna/org/workflows.hlto the current shape. Any definitions an older one held are named, for you to move intodna/org/own_workflows.hl. - It rewrites
dna/compose.yamlanddna/nats.conf, and draws the nerves’ passwords anew into the vault anddna/nats.secrets.conf. - It creates what an older organization lacks:
models.hl,work.hl,charter.hl,own_workflows.hl,dna/senses.yml. - In
dna/org/main.hlit rewrites only lines an older generator wrote exactly (the loop’s tick, the Board’s field, the retired owners field). Everything else it names as anote, with the line to write, and leaves to you. - It proposes again each seeded practice whose text changed, each superseding the version in force, one Board Review each. A practice whose earlier replacement is still before the Board waits.
- With
HALE_DNA_MEMORY_DSN_OWNERset, it applies memory’s schema for this toolchain (Memory and the record).