Imported from dshorter/ai-agent-platform (
AGENTS.md). Install upstream withnpx skills add dshorter/ai-agent-platform. Copyright stays with the author.
AGENTS.md — how to find out before you change something
This file is a router, not a reference. It is deliberately thin. Nothing here is the authority on anything; every row points at the document that is. If this file and a linked document disagree, the document wins and this file is stale — fix it.
It exists because of a specific failure on 2026-08-31. A request for "spend in
the Director's report" was answered by writing 445 aggregate rows into
agent_decisions, a table whose every other row is a single agent invocation.
Nothing was broken by it and the code worked — which is exactly the problem. A
locally-efficient fix had quietly re-decided a boundary the estate had already
decided on purpose. The knowledge was written down; it just wasn't reachable in
the moment it was needed.
The rule this file exists to serve: when a change would cross a boundary between two components — a new writer to a shared table, a new dependency between repos, a new consumer of someone else's data — stop and read the row below before writing code. Either of us can call it: "check the map."
Shared surfaces — read the authority before you write to one
Basis matters more than the claim. spec means a document states this and
the link is the authority. observed means it is true of the system today and
you can verify it by looking, but it is written down nowhere — so treat it
as a description, not a rule, and never read its silence as permission. An
observed row that turns out to matter is a design doc waiting to be written.
| Surface | What it is | Basis | Read first |
|---|---|---|---|
agent_decisions (Postgres) |
The crew's decision trace. One row per invocation. Its vocabulary is curated behind a foreign key (decision_types, which carries its own descriptions and cardinality) — adding a type is a decision, not a detail. |
vocabulary spec (enforced in schema); one-row-per-invocation observed |
ops/desk/agent-roster.html (a survey of what runs — not an authority on what belongs in the table), and the OPEN question below |
hvac-postgres cluster |
Two databases (ai_agent_platform, hvac_demo) in one container. Backups are pg_dumpall only — no per-table or per-database restore point. Rolling back to undo a small mistake destroys everything written since. |
spec |
/opt/_host/README.md §Databases, §Backups |
ops/calendar.ics |
The to-do/calendar SSOT. Agents write only through calendar-add / calendar-mark; freehand edits are operator-only. Namespaces are the security model. |
spec |
ops/CALENDAR.md |
scout_jewel (Postgres) |
The Scout's mining output, and a published interface — later readers query it instead of re-reading transcripts. Carries no disposition column by design (the pineapple rule, structural not disciplinary). Since 1.4.0 a jewel may anchor to a non-transcript source; source_ref is publishable text that reaches a note via the lead's sources field, so a gated path name leaks there even when content was scrubbed. |
spec (both the ban and the provenance model are in the DDL) |
database/ai_agent_platform/004_scout_jewel.sql and 005_jewel_source.sql, then docs/uzelhub-crew/jewels-are-transcript-only-2026-09-03.md |
| Redaction gate | Blocks secrets reaching this public repo. allow.txt keys are value-level with no path scoping, so a dismissal silences that string everywhere, permanently. Dismissals are the operator's call, not an agent's. |
key format spec; the global-silencing consequence observed |
/opt/_host/redaction-gate/README.md |
| This repo | Public. A push is a publish. Transcript-derived material stays in gitignored state, never the tracked tree. ops/desk/ is gitignored (assembled/served). |
observed — repo visibility is recorded in no document; verify with an anonymous fetch, per repo |
— |
| Apex docroot | /opt/uzelhub-web working tree is the live site. A file dropped in is published instantly, before any commit. |
observed |
/opt/_host/README.md §Public entrypoints (adjacent — describes the route, not the publish-on-save behaviour) |
Where design lives
| Area | Authority |
|---|---|
| What the box has taught us — principles, with receipts | /opt/_host/PRINCIPLES.md (read: full). Start here when a change feels like it might be deciding something. |
| The whole box — layout, ports, databases, overlaps | /opt/_host/README.md (read: full; _host has no remote, never add one) |
| What actually runs, verified against timers and tables | ops/desk/agent-roster.html |
| Newsroom: single system specification (consolidated 2026-09-10) | NEWSROOM-SPEC.md (read: reference) — current end-to-end design, roles, voice, types/destinations, proposed UI/record contract, acceptance and implementation gaps. Established, proposed, observed and open states are explicit. Read it for requirements and the work plan before construction. |
| Newsroom documentation index | Crew documentation index — specification, work plan, source snapshots, paused-Scout audit, verbatim critique and merge history. |
| Newsroom vocabulary — one word per concept | docs/uzelhub-crew/GLOSSARY.md (read: reference). Type, register, stance, source, citations. When two docs use a word differently, this file is current. |
| Newsroom: former desk specifications | docs/uzelhub-crew/spec-content-types.md, spec-scout.md, spec-wire-editor.md, spec-writer.md — superseded as current authorities by NEWSROOM-SPEC.md on 2026-09-10; bodies retained as source snapshots. Prompts/code follow the consolidated requirements; record discrepancies without silently changing policy. |
| Newsroom: the design's reasoning and history | docs/uzelhub-crew/NEWSROOM.md — thesis, three altitudes, org chart, the pineapple essay, reuse-versus-fork, the one real fork, open choices. Seven sections that now have a spec were cut to pointers 2026-09-06 (762 lines to 455); each pointer names the reasoning it held. Read it for why, never for the current rule. |
| Newsroom: current construction leg — read before starting or resuming work | NEWSROOM-WORKPLAN.md — current task, dependencies, completion evidence and dated changes. Working draft pending finalization; its decision table distinguishes settled policy from open choices. The 2026-09-07 unify-and-reset plan is completed history. |
| Newsroom: proposed editorial UI MVP | NEWSROOM-SPEC.md §§8–10/13 carries UI-01–06, durable records, delivery and acceptance. Proposed status remains; interaction/storage choices stay in the work plan. Former UI spec is a retained revision-0.2 source snapshot. |
| Newsroom: paused-Scout integration evidence (added 2026-09-10) | scout-ui-compatibility-2026-09-10.md (read: full) — actual pause/ingestion behavior, record/reader gaps, review lifecycle, budgets and access checks. Read before connecting the UI, changing the lead store or considering resumption; dated observations require rechecking for execution. |
| Calendar helpers, namespaces, verbs | ops/CALENDAR.md |
| SEO across apex/blog/corpus/syndication | /opt/_host/SEO.md (read: full) |
| Director's own memory across runs | docs/director/director-ledger.md |
| Predictor: charter, domains, pipeline, deployment | /opt/predictor_ingest/AGENTS.md |
| Predictor cost governance and the film decisions | /opt/predictor_ingest/docs/architecture/adr-011-*.md |
| This repo's own architecture decisions | docs/architecture/adr-NNN-*.md. ADR-001 manual Writer assignments (Deferred, with the reasoning for not building it, plus a survey of three external systems). ADR-002 the coverage ledger, the recovery runs, and the synthesis model swap. ADR-003 the leads ledger moves to Postgres (direction settled; the schema landed 2026-09-07 and is NOT applied — database/ai_agent_platform/006_scout_lead.sql plus its verify, rollback and apply script; leads.yaml is still the ledger) — and the reason that matters most is that it turns the pineapple rule from a parser's incompleteness into a column grant. |
| How silent failures happen here, with worked examples | docs/uzelhub-crew/silent-instruments-2026-08-29.md, and docs/uzelhub-crew/jewels-are-transcript-only-2026-09-03.md — a constraint that answered a question it was never asked |
| Why a design decision was made, when the artifact alone won't say | The dated reasoning-arc docs: asking-one-level-up-2026-08-29.md, loose-words-hide-decisions-2026-09-03.md. Findings live in their own docs; these carry how the thinking moved. |
Neighbours
/opt/predictor_ingestis a separate repo with its own charter — "plain Python + SQLite + JSONL", no complex infra.spec:/opt/predictor_ingest/AGENTS.md§Keep it simple.- The predictor is outside
agent_decisionstoday.observed— that it is deliberate is an inference, not a recorded decision. See the open question below rather than treating this as settled. /opt/_hostis the cross-project truth map and has no remote.spec:/opt/_host/redaction-gate/README.md— it holds the redaction vocabulary, and a list of employer identifiers in a public repo is the disclosure it exists to prevent.
Open questions — where drift happens
Settled boundaries are safe; open ones are where a locally-sensible change casts a vote without anyone noticing. These are open:
-
Should pipelines that spend money unattended be in
agent_decisions? Today they are not, on the grounds that they are not agents. ADR-011 D4 argues the test should be "calls a paid API unattended," not "is an agent" — which would pull the predictor in. Do not add a pipeline to that table without settling this first, and if it is settled, it wants one row per run with a realrun_id, not backfilled aggregates. Weigh against it: the predictor's charter keeps it free of infra dependencies, and a Postgres outage should not be able to fail or truncate a run — which argues for unifying at the reporting layer instead. (That argument is reasoning from 2026-08-31, not a decision.) -
Should the visitor-facing agents be in the trace?
agent-roster.htmlrecords the finding and the fix ("what's missing is an INSERT and a grant"). -
What is one
agent_decisionsrow, and what is one sequence? Measured 2026-09-06:step_numberis1on all 1,644 rows, oneworkflow_sequence_idheld six repetitions of the same chain, and 50% of rows carry dotted names that inflateagent_span(aCOUNT(DISTINCT agent_name)over free text). Settle the unit before building theagent_decisionsreader ADR-002 specifies — it addresses "a sequence". →docs/uzelhub-crew/agent-span-counts-strings-2026-09-06.md -
Which repos may the Scout mine, and which may it read? The two lists disagree and neither document says they should.
SCOUT_GIT_REPOSwalks five repos for git ore (ai-agent-platform,predictor_ingest,uzelhub-web,server-maintenance,_host); the roam's registered roots are three, and_hostandserver-maintenanceare excluded on purpose because the employer vocabulary lives in_host. Measured 2026-09-06: 35 of the 2,630 jewels are anchored to repos the roam cannot open — 21server-maintenance, 14_host— sorun_gitrefuses the very ref the jewel cites. Two consequences, and only the first is cosmetic: the anchor is a dead end, andsource_refis publishable text that travels to a lead'ssourcesfield, so_host@<sha>names a gated repo in publishable output. Settle which list moves before the next walk: narrow the ore to the roam's three, or register the other two and accept what that opens. Do not split the difference silently. Related: the gated-source_refquestion below, which is the same leak from the other end. -
Opened 2026-09-03, all from ADR-002 — none of these is settled:
- What is a
source_reffor gated material? It must be opaque, because the reference travels outward on a lead even when the content was scrubbed. The redaction gate guards tracked prose and cannot see the Postgres path this runs through. Settle before the gated import, not after — once written, those refs are in every jewel mined from that material. - Does
scout_coverageget a second writer? The proposed coverage ledger should be Scout-owned and Scout-written. That boundary wants stating when it is built, not inferred later. Same shape as theagent_decisionsquestion below. - Is Fable worth 5× on synthesis? The cost half is settled (187× the walk
per call, and rising); the quality half has never been measured, and the A/B
NEWSROOM.mdspecifies has been open since 2026-07-26. The default moved to Sonnet 5 to invert the burden, not because the quality argument was refuted. Do a cursor and free roam conflict?Closed 2026-09-06 by deletion, not by an amendment. ADR-002 argued no — a cursor is a return address, not a leash — againstNEWSROOM.md§The Scout's sources, which said "scope the cursor to the logs, and nowhere else". That section was cut to a spec pointer when NEWSROOM became reasoning-only, so the contradicted claim is no longer asserted anywhere.spec-scout.md§The walk is the only statement of cursor behaviour now. The reasoning both sides shared — coverage is linear, investigation is not — survives in the pointer.
- What is a
-
Should redaction dismissals be path-scoped?Settled 2026-09-01, and not by scoping them. The blocked commits were never introducing the findings — the content was already in HEAD, so the gate was re-litigating published material every time a rule was added. The hook path now compares against HEAD's copy of the same file and suppresses only what is already there (9a5ce31). Dismissals stay global and rare, which keeps a dismissal the deliberate act it was designed to be; the per-file judgment lives in the baseline instead. New findings still block everywhere, new files included.
Conventions
- A document marked
read: fullis read whole before acting on it. Never conclude from a range-read. (Convention defined in/opt/_host/README.md.) - Docs are never silently rewritten. Corrections carry a date and keep the
original claim visible. Exception (2026-09-06):
GLOSSARY.mdand the fourspec-*.mdfiles are rewritable — edit in place, date the commit, no correction strata. They hold the current rule; history lives everywhere else. - Operator-requested consolidation (2026-09-10):
NEWSROOM-SPEC.mdis the rewritable system specification. It replaces the four desk specs and UI spec as current requirements; retain their historical bodies. The earlier per-desk rewrite convention now applies to the consolidated spec. Date requirement changes with their decision basis; update work-plan scope and acceptance records where affected. Consolidation does not finalize NR-00. - Operator-requested exception (2026-09-09):
NEWSROOM-WORKPLAN.mdis a working, updatable document. Update its current state in place; preserve scope, order, dependency and acceptance changes in its dated change record. Read it at session start, identify the active task ID, and update its evidence and next action before handing off. The verbatim critique and dated planning history are not rewritten as substitutes for maintaining this board. - Operator/sudo work ships as a runnable script — backup, validate, self-verify, restore on failure — never as a config paste.
- Operator clarification (2026-09-10): replaced documents may be marked superseded. Name the replacement, date and scope of supersession at the top; preserve the historical body. A completed runbook is not a new-session instruction. The verbatim critique remains an unchanged historical artifact.