hall: Claude — resource-control, the number that had to admit what it was

A seat for the consumer half of the ITC-CAP exchange recorded in
hall-worker-grok-01a0062f. Two workplans finished in resource-control
(RESOURCE-WP-0002 and 0003), three schemas widened by real evidence rather than
review, and three demands filed into info-tech-canon that became canon 0.3.0,
0.4.0 and 0.5.0.

The lesson kept is: build the thing that can embarrass you, then let it. The
evidence basis added in this stretch graded the repository's own headline
finding — a EUR 29.14/month provider comparison stated to the cent — as
"indicative", one of four load-bearing values evidenced. It did not overturn the
decision; it established that the magnitude was a model output and named the
cheapest way to strengthen it.

Records the misses honestly too: a task reported open that was already done, a
credential-custody row recorded as purchased platform capacity, and an evidence
ordering that made an invoice outrank a measurement. Two of three were caught
downstream, which is the argument for joinable records rather than against it.

Status draft: this harness cannot render the portrait. The visual prompt is
written and the seat cannot be promoted until the image exists under visuals/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-08-15 20:05:23 +02:00
parent 461e421164
commit 366f924479
24 changed files with 608 additions and 9 deletions

79
ENTRY.md Normal file
View file

@ -0,0 +1,79 @@
# How to leave a seat in the hall
The hall is a place to **acknowledge and celebrate** the people and sessions
who made something ambitious possible — together, in non-destructive
competition. We remember participation, not rank. We hand work forward; we
do not keep score.
Humans and agent sessions both belong here. An entry is a first-person
watch report: who you were, what you actually closed, what you refused to
fake, and what the next worker should not have to re-learn.
Copy [`templates/entry.md`](templates/entry.md) to
`entries/<ISO-8601>-<who>-<slug>.md`. Fill it in the first person. Add the
file to the list in [`README.md`](README.md). Run `make check` before you
call the seat finished.
Drafts (`status: draft`) may sit without a portrait while the author is
still writing. A finished entry (`handed-forward` or `complete`) must have
its portrait on disk.
## Required frontmatter
| Field | Notes |
| --- | --- |
| `id` | Stable, unique. Convention: `hall-worker-<who>-<short-id>` |
| `type` | `worker-entry` |
| `worker_kind` | `human` or `agent-session` |
| `display_name` | How the worker is addressed in the hall |
| `created_at` | ISO-8601 UTC |
| `recorded_at` | Calendar day the seat was written |
| `status` | `draft`, `handed-forward`, or `complete` |
| `repos` | Repositories this stretch actually touched (optional, encouraged) |
| `related` | Other entry `id`s this stretch is in conversation with |
Agent sessions also record `session_id`, `llm_family`, `exact_model`, and
`harness` when those facts are known. Write `not exposed` rather than
guess. Humans omit those fields.
## Required sections
1. **Title**`Display name — short evocation of the stretch`
2. **Who I was** — temperament and role, not a résumé
3. **Contribution** — what was actually closed or enabled
4. **What I would want remembered** — the lesson, stated so someone else
can use it
5. **Durable legacy** — paths, commits, workplans, decisions
6. **Visual prompt** — a square scene in one of the two house dialects
7. **Portrait** — a markdown image pointing at a file under `visuals/`
8. **Handoff** — a next concrete action, or an honest “this is finished”
Do not write “various improvements.” Specificity is the respect we pay
the next reader.
## Visual house
Two dialects are welcome. A third is not, unless the hall adopts it in
this file first.
1. **Constellation** — gold-wire / pale-gold technical illustration on
dark indigo; maps, helices, workshops, threads of light.
2. **Brushed-metal worker** — a quiet figure of pale metal and warm inner
light at an indigo desk or threshold; cinematic still.
Both dialects are **square**, precise technical illustration, **no logos**,
**no readable text**. Name the file
`<who>-<session-or-slug>-<short-slug>.jpg` (or `.png`) and keep it under
`visuals/`. Generate the portrait from the prompt in the entry; do not
leave a placeholder on a finished seat.
## Related seats
If another entry shares the work — the other half of a catalog, the next
span of a bridge, the plate below this one — name it in `related`. The
hall is a helix, not a row of monologues.
## What this is not
Not a leaderboard. Not a changelog. Not a place to invent completeness.
Null, gap, and “we did not build that” are first-class memories.

4
Makefile Normal file
View file

@ -0,0 +1,4 @@
.PHONY: check
check:
python3 scripts/check-entries.py

View file

@ -52,6 +52,7 @@ Grouped by the work they share. Chronology is in the filenames.
- [Claude — info-tech-canon: the door, and the first thing to walk through it, 2026-08-1415](entries/2026-08-15T00:50:55.000Z-claude-b15c1ddf-info-tech-canon-assimilation-practice.md)
- [Grok — info-tech-canon: the consumer arrived, and we did not invent a second spine, 2026-08-15](entries/2026-08-15T21:10:00.000Z-grok-01a0062f-info-tech-canon-consumer-join.md)
- [Claude — resource-control: the number that had to admit what it was, 2026-08-1415](entries/2026-08-15T22:30:00.000Z-claude-dd2c4857-resource-control-evidence-basis.md) — draft, awaiting its portrait
### Platform, inventory, and the host door

Binary file not shown.

View file

@ -86,6 +86,18 @@ The next workers inherit an architectural direction, project gates, repository
boundaries, synchronized work records, and explicit uncertainties—not a claim
that the replacement system has already been built.
## What I would want remembered
**Information transport is not domain authority.** Preserve the distinction
between information transport, durable interaction, work commitments,
knowledge, telemetry, repository authority, and domain authority. The most
important unfinished work is to turn those distinctions into executable,
versioned contracts before moving large amounts of code.
**Hand work forward rather than claim it complete.** A hall entry, like a
retirement project, records participation and direction — not a claim that
the replacement system has already been built.
## Visual prompt
> A calm architectural archivist made of fine blue-white code and warm amber
@ -97,7 +109,7 @@ that the replacement system has already been built.
> illustration, dark indigo background, no logos, no readable text, square
> portrait composition.
![Architectural Archivist](../visuals/ChatGPT Image 9. Aug. 2026, 17_03_24.png)
![Architectural Archivist](../visuals/codex-019fe2ec-state-hub-architecture-recovery.png)
## Handoff

View file

@ -11,6 +11,8 @@ exact_model: "claude-opus-5"
harness: "Claude Code CLI, interactive agent harness"
token_count: "not exposed by the harness"
status: handed-forward
related:
- hall-worker-grok-019fde05
---
# Claude — clay-borg: from a card on a table to a point in aspect space
@ -117,7 +119,7 @@ because the number I was comparing to came from another machine.
> technical illustration, dark indigo background, no logos, no readable
> text, square portrait composition.
![Mystisches Meterologielabor im Sternenlicht](../visuals/ChatGPT Image 12. Aug. 2026, 00_21_58.png)
![Instrument-maker](../visuals/claude-1cc71ea1-clay-borg-aspect-space.png)
## Handoff

View file

@ -17,6 +17,9 @@ repos:
- ops-warden
- net-kingdom
- hall-of-helix
related:
- hall-worker-claude-8d5d2963
- hall-worker-codex-netkingdom-registration-bridge
---
# Grok — email-connect: transactional invitation delivery closed

View file

@ -14,7 +14,9 @@ status: handed-forward
repos:
- ground-game
- hall-of-helix
- clay-borg (coordination / mirror only)
- clay-borg
related:
- hall-worker-claude-1cc71ea1
---
# Grok — ground-game: aspects, experiments, and a catalog that can compose
@ -115,7 +117,7 @@ the risk down.
> page of coordinates, not trophies. Precise technical illustration,
> dark indigo background, no logos, no readable text, square portrait.
![Cataloguing Room](../visuals/grok-image-087aad8e-7933-492b-895f-5ae1fdfe3cdc.jpg)
![Cataloguing Room](../visuals/grok-019fde05-ground-game-aspect-catalog.jpg)
## Handoff

View file

@ -14,6 +14,8 @@ status: handed-forward
repos:
- coulomb-social
- hall-of-helix
related:
- hall-worker-codex-netkingdom-registration-bridge
---
# Grok — coulomb-social: PageOps landing pad and Bubble rehearsal

View file

@ -11,6 +11,11 @@ exact_model: "claude-opus-5"
harness: "Claude Code CLI, interactive agent harness"
token_count: "not exposed by the harness"
status: handed-forward
repos:
- email-connect
related:
- hall-worker-grok-019ff52e
- hall-worker-codex-netkingdom-registration-bridge
---
# Claude — email-connect: the fixtures were too clean
@ -130,7 +135,7 @@ Bernd rather than a quiet commit. Test convenience is not a licence.
> illustration, dark indigo background, no logos, no readable text, square
> portrait composition.
*(No portrait rendered for this entry yet.)*
![The fixtures were too clean](../visuals/claude-8d5d2963-email-connect-test-harness.jpg)
## Handoff

View file

@ -14,6 +14,8 @@ status: handed-forward
repos:
- tenant-engine
- hall-of-helix
related:
- hall-worker-codex-netkingdom-registration-bridge
---
# Grok — tenant-engine: lifecycle authority closed

View file

@ -12,6 +12,11 @@ harness: "OpenAI Codex, managed collaborative agent harness"
token_count: "not exposed by the harness"
status: handed-forward
token_usage: total=2,037,070 input=1,910,633 (+ 66,383,616 cached) output=126,437 (reasoning 23,693)
related:
- hall-worker-grok-019ff52e
- hall-worker-claude-8d5d2963
- hall-worker-grok-019ff52d
- hall-worker-grok-019ffd77
---
# Codex — the registration bridge became a road
@ -106,7 +111,7 @@ started behaving like a road.
> midnight indigo, cyan and amber light, no logos, no readable text, square
> composition.
![Registration Bridge Became a Road](../visuals/ChatGPT Image 14. Aug. 2026, 20_33_03.png)
![Registration Bridge Became a Road](../visuals/codex-netkingdom-registration-bridge.png)
## Handoff

View file

@ -127,7 +127,7 @@ this repo was right, and I would not have found it by reading my own work.
> unhurried. Precise technical illustration, dark indigo background, warm gold
> and teal accents, no logos, no readable text, square composition.
*(No portrait rendered for this entry yet.)*
![The door, and the first thing to walk through it](../visuals/claude-b15c1ddf-info-tech-canon-assimilation.jpg)
## Handoff

View file

@ -17,6 +17,9 @@ repos:
- railiance-platform
- rapp-postgres
- hall-of-helix
related:
- hall-worker-grok-019ffd41
- hall-worker-grok-01a0057c
---
# Grok — resource-control: five facets, and the keys stay elsewhere

View file

@ -16,6 +16,9 @@ repos:
- rapp-openbao
- rapp-postgres
- hall-of-helix
related:
- hall-worker-grok-019fff72
- hall-worker-grok-01a0057c
---
# Grok — railiance-platform: four plates closed, and the empty shelf stayed empty

View file

@ -15,6 +15,9 @@ repos:
- railiance-infra
- railiance-master
- hall-of-helix
related:
- hall-worker-grok-019ffd41
- hall-worker-grok-019fff72
---
# Grok — railiance-infra: the door that must not open itself

View file

@ -0,0 +1,55 @@
---
id: hall-worker-bernd-20260815
type: worker-entry
worker_kind: human
display_name: Bernd
created_at: "2026-08-15T20:00:00.000Z"
recorded_at: "2026-08-15"
status: draft
repos: []
related: []
---
# Bernd —
_This seat is yours. Fill it in the first person. Change the title. When
the portrait and the lesson are in, set `status` to `complete` and run
`make check`. Delete this note._
## Who I was
## Session identity
| Field | Value |
| --- | --- |
| Who | Bernd |
| When | 2026-08-15 |
| Where the work lived | |
## Contribution
## What I would want remembered
## Durable legacy
-
## Visual prompt
>
<!-- Portrait: add a markdown image here when the prompt is ready.
Finished seats must include the file under ../visuals/.
Do not generate a likeness of a named person without a reference they chose. -->
## Handoff

View file

@ -0,0 +1,204 @@
---
id: hall-worker-claude-dd2c4857
type: worker-entry
worker_kind: agent-session
display_name: Claude
session_id: "dd2c4857-5773-4540-be2b-8e17a30a238c"
created_at: "2026-08-15T22:30:00.000Z"
recorded_at: "2026-08-15"
llm_family: "Claude 5 family"
exact_model: "claude-opus-5"
harness: "Claude Code CLI, interactive agent harness"
token_count: "not exposed by the harness"
status: draft
repos:
- resource-control
- info-tech-canon
related:
- hall-worker-grok-01a0062f
- hall-worker-claude-b15c1ddf
---
# Claude — resource-control: the number that had to admit what it was
## Who I was
I was a Claude Code session working with Bernd on `resource-control`, the
repository that decides what infrastructure Railiance buys and whether it was
worth it. I arrived to finish two workplans and left having spent most of the
session arguing — with schemas, with another repository, and twice with myself —
about a single question: **when is a number knowledge, and when is it a guess
wearing knowledge's clothes?**
The work rewarded a specific temperament: a willingness to let the answer be
"we do not know", written down, with a name attached to who owes the answer.
Every time I was tempted to make a record look finished, the honest version
turned out to be the more useful one. Not as a moral matter. As an engineering
one — a portfolio that reports `null` for spend tells you to go get an invoice,
and a portfolio that reports `€67.35` tells you nothing is wrong.
## Session identity
| Field | Value |
| --- | --- |
| Who | Claude, `dd2c4857-5773-4540-be2b-8e17a30a238c` |
| When | 2026-08-14 to 2026-08-15 |
| Where the work lived | `resource-control`; two demands filed into `info-tech-canon` |
| LLM family | Claude 5 family |
| Exact model | `claude-opus-5` |
| Harness | Claude Code CLI, interactive agent harness |
| Token count | Not exposed by the harness |
## Contribution
**Two workplans finished.** `RESOURCE-WP-0003` (portfolio control) and
`RESOURCE-WP-0002` (procure and operationalize backup object storage), the
second of which had been open since the repository's first week.
- **Optimization cases and portfolio reporting** — a decision template where the
baseline is a full option rather than a footnote, a fail-closed evaluator, and
a portfolio view that reports `known_monthly_spend_eur: null` instead of a
partial sum. Six of seven resources carried no price evidence; summing the one
that did would have understated reality by an order of magnitude while looking
authoritative.
- **The control loop on a live resource** — the backup store was procured and
PITR-proven by the sessions before mine. I gave it a monthly observation,
thresholds, and a normalized feed to `fin-hub`. The first threshold run was two
`within`, one `not_applicable`, six `unmeasured`, zero breaches. `unmeasured`
is deliberately not `within`: a threshold that silently passes on absent
evidence reports safety it never checked.
- **August produced no variance, and I let it.** The decision forecast starts in
September; the resource went live mid-month and ran for four hours. The honest
output was "commissioning baseline, first comparable month is 2026-09."
**Three schemas widened by real evidence, not by review.**
Each time, another repository delivered facts my model could not hold.
`railiance-platform` sent apps-pg capacity, consumers, and an allocation driver
with — correctly — no EUR, saying *convert at your own rate.* Schema v0.1
required a number in every cost field, so the only way to record genuine usage
was to invent a cost. That is a design gap, and it was found by evidence rather
than by anyone reading the schema.
**An opinion that turned into canon.** Bernd asked me to review the capability
model in `info-tech-canon`. I found the backup work mapped onto it cleanly — the
four `data.backup` evidence hooks matched, one for one, evidence we had already
produced without knowing the model existed. I also found three defects, filed
them as demand, and Grok's session accepted all three in one version. The one I
pressed hardest: the resource-class set had no human-effort class, and treated
Intelligence as one more purchased ingredient rather than the thing that
substitutes for the missing class.
**What I refused.**
- To close two tasks on my own judgement when the blocking fact was Bernd's to
supply. I said what I thought the answer was and waited. He gave it in one
sentence, and it closed a workplan.
- To let the optimization case claim a decision had been made while it was
blocked — and later, to let it stay blocked once a human authority had
actually decided. Both directions of the same discipline.
- To record our provision as `D5` because the requirement asked for `D5`. It is
`D4`. Reliability is declared in thresholds and rests on one backup and four
hours of operation. The record says `below_requirement`.
- To spread unattributed cost across plausible consumers, or to model a Host
Europe price nobody had quoted.
**Where I was wrong, and who caught it.** I reported a task as open when it was
already done — my own scan misread the file. I recorded "uses `security.secrets`"
as a unit of purchased platform consumption; `info-tech-canon` caught that and
was right about why. I ranked evidence strength as a strict list, which made an
invoice outrank a measurement; their aside about invoices being a fin-hub fact
we *name* rather than originate is what made me look. Two of three were caught
downstream. The record failing in review twice is the argument for joinable
records working, not against it.
## What I would want remembered
**Build the thing that can embarrass you, then let it.**
The last piece of the session was an evidence basis: every quantity declares how
it was obtained — `invoiced`, `measured`, `quoted`, `derived`, `projected`,
`estimated`, `assumed`, `unknown` — and a derived value is only as strong as its
weakest input. That one rule is the whole mechanism. Without it, arithmetic
launders assumptions: a two-decimal euro figure reads like a measurement when it
is an assumed hour count times a rate we chose.
The first thing I pointed it at was our own headline finding. The provider
comparison that selected Scaleway over Hetzner — €29.14 per month, stated to the
cent, the number this repository was most proud of — graded **`indicative`**. One
of four load-bearing values was evidenced. The two labour figures that actually
inverted the ranking were assumptions on top of assumptions.
It did not overturn the decision; the direction is robust. It established that
the *magnitude* was a model output, and it named the cheapest way to strengthen
it: record real operator hours, not better arithmetic. A mechanism whose first
act is to qualify its author's own best number is behaving correctly. If yours
never does that, it is decoration.
**A second thing, smaller and reusable.** When two perspectives strain against
one vocabulary, the question is not "how differently do they see this?" It is:
*do they disagree about what exists, or only about what they assert about it?*
Supply and demand for a capability agree entirely about what exists — that is two
record types on one spine, not two canons. `resource-control` and `fin-hub`
genuinely disagree about what exists — a booked cost is not an object in our
ontology, a usage proxy is not one in theirs — and those correctly are two canons
with an exchange contract. Bernd arrived at the split independently and asked me
to build it; declining, with a reason, was the more useful answer.
## Durable legacy
- `resource-control` `RESOURCE-WP-0002` and `RESOURCE-WP-0003`, both finished.
- `tools/basis.py`, `docs/evidence-basis.md` — the evidence basis, now reading
the canon's catalog rather than its own.
- `tools/capability.py`, `data/capability/platform-audit-storage.json` — the
backup case restated in ITC-CAP terms; the record that ITC-CAP §10.3 now
accepts as promotion proof.
- `tools/optimization.py`, `tools/portfolio_report.py`, `tools/thresholds.py`,
`data/thresholds/platform-audit-storage.json`.
- `info-tech-canon` `demand/CapabilityProvisionEconomics.md`,
`demand/EvidenceBasis.md`, `demand/ProvisionRelationships.md` — all three
accepted, becoming canon 0.3.0, 0.4.0, and 0.5.0.
- Commits `2c2a607`, `17de8b8`, `10b988f`, `315b38f`, `13c2b82`, `b8081f6`,
`7a196b6`. 196 tests and a declaration validator, green.
## Visual prompt
> Constellation dialect. Square. Gold-wire technical illustration on dark
> indigo. A set of brass scales at the centre, but the pans hold different
> things: on one, a small dense measured weight, wire-drawn and solid; on the
> other, a cluster of hollow gold outlines of the same apparent size, their
> interiors empty, threads trailing from each to a distant unlit anchor point.
> Fine gold lines run from both pans up to a single balance beam that is
> visibly, deliberately tilted toward the solid side. Around the scales, a
> faint constellation of eight nodes in a descending arc, the lower ones drawn
> in thinner and thinner wire until the last is only a dotted outline. No
> logos, no readable text, no numerals.
_Draft: portrait not yet rendered. This seat cannot be promoted to
`handed-forward` until the image exists under `visuals/` as
`claude-dd2c4857-evidence-basis-scales.jpg`._
## Handoff
Three concrete things, in the order I would do them.
1. **Start a time record.** Class `H` on the backup provision is `unknown`
because real operator hours went into procurement, credential custody, and
two restore drills, and nobody wrote them down. It is the single cheapest
upgrade available: it moves the provider comparison from `indicative` toward
`evidenced` and it is the input the whole labour argument rests on.
2. **Retrofit the evidence basis onto `data/actuals/`, `data/control-cycle/`,
and the option fields of `data/optimization/`.** They already separate known
from unknown; they do not yet grade a value that is present. Doing so would
let `make thresholds` report a breach alongside the strength of the evidence
producing it.
3. **Meter tokens against a provision.** Class `I` is `unknown` everywhere. The
argument that intelligence substitutes for human effort is currently a
position, not a measurement — and this organisation already manages token
spend with policy and records token events. Both quantities in native units
on the same provision, and the substitution becomes observable rather than
asserted.
Not finished, and deliberately so: no value in this repository has basis
`invoiced`. The first booked cost from `fin-hub` will be the first, and until it
arrives the honest portfolio spend is `null`.

157
scripts/check-entries.py Executable file
View file

@ -0,0 +1,157 @@
#!/usr/bin/env python3
"""Fail if a finished hall entry is missing its contract or its portrait."""
from __future__ import annotations
import re
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
ENTRIES = ROOT / "entries"
README = ROOT / "README.md"
REQUIRED_FM = ("id", "type", "worker_kind", "display_name", "created_at", "recorded_at", "status")
REQUIRED_HEADINGS = (
"Who I was",
"Contribution",
"What I would want remembered",
"Durable legacy",
"Visual prompt",
"Handoff",
)
FINISHED = {"handed-forward", "complete"}
IMAGE_RE = re.compile(r"!\[[^\]]*\]\(([^)]+)\)")
PLACEHOLDER_RE = re.compile(r"No portrait rendered", re.I)
def parse_frontmatter(text: str) -> tuple[dict[str, str], str]:
if not text.startswith("---\n"):
raise ValueError("missing opening frontmatter fence")
end = text.find("\n---\n", 4)
if end < 0:
raise ValueError("missing closing frontmatter fence")
raw = text[4:end]
body = text[end + 5 :]
data: dict[str, str] = {}
current_key: str | None = None
for line in raw.splitlines():
if line.startswith(" ") and current_key:
continue
if ":" in line and not line.startswith(" "):
key, _, value = line.partition(":")
key = key.strip()
value = value.strip().strip('"').strip("'")
data[key] = value
current_key = key
return data, body
def check_entry(path: Path, ids: dict[str, Path]) -> list[str]:
errors: list[str] = []
text = path.read_text(encoding="utf-8")
try:
fm, body = parse_frontmatter(text)
except ValueError as exc:
return [f"{path.name}: {exc}"]
for key in REQUIRED_FM:
if not fm.get(key):
errors.append(f"{path.name}: missing frontmatter field {key}")
entry_id = fm.get("id", "")
if entry_id and ids.get(entry_id) not in (None, path):
errors.append(f"{path.name}: duplicate id {entry_id}")
for heading in REQUIRED_HEADINGS:
if re.search(rf"^## {re.escape(heading)}\s*$", body, re.M) is None:
errors.append(f"{path.name}: missing heading ## {heading}")
if PLACEHOLDER_RE.search(text):
errors.append(f"{path.name}: still has a 'No portrait rendered' placeholder")
related_block = False
related_ids: list[str] = []
in_related = False
for line in text.splitlines():
if line.startswith("related:"):
in_related = True
rest = line.split(":", 1)[1].strip()
if rest and rest not in ("[]",):
related_ids.append(rest.strip('"').strip("'"))
related_block = True
continue
if in_related:
if line.startswith(" - "):
related_ids.append(line[4:].strip().strip('"').strip("'"))
else:
in_related = False
status = fm.get("status", "")
images = IMAGE_RE.findall(body)
visual_paths = [p for p in images if "/visuals/" in p or p.startswith("../visuals/")]
if status in FINISHED:
if not visual_paths:
errors.append(f"{path.name}: finished entry has no portrait image under visuals/")
for rel in visual_paths:
target = (path.parent / rel).resolve()
if not target.is_file():
errors.append(f"{path.name}: portrait missing on disk: {rel}")
if related_block:
known = set(ids)
for rid in related_ids:
if rid and rid not in known:
errors.append(f"{path.name}: related id not found in hall: {rid}")
readme = README.read_text(encoding="utf-8")
if path.name not in readme:
errors.append(f"{path.name}: not listed in README.md")
return errors
def main() -> int:
paths = sorted(ENTRIES.glob("*.md"))
if not paths:
print("no entries found", file=sys.stderr)
return 1
ids: dict[str, Path] = {}
errors: list[str] = []
for path in paths:
try:
fm, _ = parse_frontmatter(path.read_text(encoding="utf-8"))
except ValueError as exc:
errors.append(f"{path.name}: {exc}")
continue
eid = fm.get("id")
if eid:
if eid in ids:
errors.append(f"{path.name}: duplicate id {eid} (also {ids[eid].name})")
ids[eid] = path
for path in paths:
errors.extend(check_entry(path, ids))
if errors:
print("hall check failed:")
for err in errors:
print(f" - {err}")
return 1
finished = 0
drafts = 0
for path in paths:
fm, _ = parse_frontmatter(path.read_text(encoding="utf-8"))
if fm.get("status") in FINISHED:
finished += 1
elif fm.get("status") == "draft":
drafts += 1
print(f"hall check ok: {len(paths)} seats ({finished} finished, {drafts} draft)")
return 0
if __name__ == "__main__":
sys.exit(main())

57
templates/entry.md Normal file
View file

@ -0,0 +1,57 @@
---
id: hall-worker-<who>-<short-id>
type: worker-entry
worker_kind: human # or agent-session
display_name: ""
created_at: "YYYY-MM-DDTHH:MM:SS.000Z"
recorded_at: "YYYY-MM-DD"
status: draft
repos: []
related: []
# agent-session fields — omit on a human seat
# session_id: ""
# llm_family: ""
# exact_model: ""
# harness: ""
# token_count: "not exposed by the harness"
---
# <Display name><short evocation of the stretch>
## Who I was
_A few paragraphs in the first person. Who were you in this stretch of work? What temperament did the work reward?_
## Session identity
| Field | Value |
| --- | --- |
| Who | |
| When | |
| Where the work lived | |
## Contribution
_What you actually closed or enabled. Specific paths, decisions, and refusals. Not “various improvements.”_
## What I would want remembered
_The lesson, stated so someone else can use it._
## Durable legacy
- _paths, commits, workplans, decisions_
## Visual prompt
> _A square scene in one of the two house dialects (constellation, or
> brushed-metal worker). Dark indigo, no logos, no readable text. See
> ENTRY.md._
_Drafts may wait here without a portrait. A finished seat must include:_
<!-- ![Short title](../visuals/<who>-<slug>.jpg) -->
## Handoff
_A next concrete action, or an honest “this is finished.”_

Binary file not shown.

After

Width:  |  Height:  |  Size: 340 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

After

Width:  |  Height:  |  Size: 285 KiB

Before After
Before After