Orion/6. Templates/_contracts.md
Avi a66996ac10 Orion vault — clean initial history
Knowledge vault (Orion/PARA) migrated from the pre-Orion 484vault on
2026-10-01. Deliberately orphaned: prior history contained a plaintext
password and stays local-only on branch archive/pre-boilerplate-history.
Secrets and live Hermes state are gitignored.
2026-10-02 08:34:48 -05:00

6.2 KiB

type title tags
reference Page contracts
reference

Page contracts

Read this when creating or editing a page. The .md files beside this one are copy-ready skeletons; this file is the rule they implement. When a contract changes, change its skeleton in the same edit — a skeleton that drifts from its contract produces pages the skills can't read.


Area hub — 2. Areas/<Area>/<Area>_hub.md

type: area
status: standing            # standing | archived
id_prefix: WEB              # short, uppercase, set once, never changed
workstream_counter: 0       # highest ID issued. Source of truth for IDs
parent:                     # nested Areas only. Never points at itself
updated: YYYY-MM-DD
tags: [hub, <area-tag>]

Body: ## What this is (one sentence) · ## Workstreams (each Project by ID, with status) · ## Open items · ## Key files · ## People.

Areas take no next:, no deadline:, and no freshness computation. A container doesn't compete for attention.

Every Area has 2. Areas/<Area>/knowledge/_index.md — seeded at creation, stating what belongs there.


Project hub — 1. Projects/<Area>/<Name>/<ID>_hub.md

type: project               # never `hub`
id: WEB-1                   # from the Area's workstream_counter
area: <Area folder name>    # or the literal `none` — absent ≠ none
done_when: "one sentence, testable"
status: open                # open | paused | closed | archived
next: "verb → target — detail [since YYYY-MM-DD]"   # optional; may be a YAML list
paused_because: "one line"  # required when paused
deadline: YYYY-MM-DD        # optional — the single next delivery gate
threads: [slug]
updated: YYYY-MM-DD
tags: [hub, <area-tag>]

Body: ## What this is · ## Tasks (checkboxes, (owned by: name) when not the owner's) · ## Open items · ## Key files · ## People.

  • done_when: is required. If you can't write it, it isn't a Project. If it needs the words "ongoing", "maintain" or "as needed", it's an Area.
  • next: — one move per entry. Two moves go in a YAML list, never packed into one string. Grammar and verbs → AGENTS.md, The next: field.
  • area: none is legal but must be written. Such a project has no knowledge base to receive its deliverable; orion-close archives it whole.

A workstream is a Project. It opens when an Area needs finite work done, and closes via orion-close, which returns its deliverable to the Area:

Area ──spawns──▶ Project (id, done_when)
  ▲                  │ on close
  └── knowledge/ ◀───┤ deliverable
                     └── process record ──▶ 5. Archive/<Area>/<ID>/

A workstream belongs to exactly one Area. A concern spanning several is a thread.


Person — 3. Resources/People/<Full Name>.md

type: person
tier: contact               # relationship | contact
name: Full Name
pronouns:                   # ask; never infer from a name. Blank until known
role:
orgs: []
contact:
status: active              # active | dormant
cadence:                    # relationship tier ONLY: weekly | biweekly | monthly | organic
last_contact: YYYY-MM-DD
follow_up_by:               # relationship tier ONLY — a real date
updated: YYYY-MM-DD
tags: [person]

Body: ## Role & Relationship · ## Background · ## Context · ## Open Items · ## Contact History (dated lines, newest first).

Two tiers, and only one can flag:

Tier Carries Can flag?
relationship cadence + follow_up_by, both required Yes — the only pages follow-up checks read
contact Neither — their presence is a lint finding Never

A contact is not a neglected relationship. It's someone the vault knows facts about. If someone doesn't warrant a real follow-up date, they're a contact.

  • organic cadence means "no fixed interval — the next contact is pegged to a specific event." It still requires a real follow_up_by, set against that event.
  • A relationship page with no follow_up_by cannot flag and is invisible. Lint reports it as a defect.
  • Spent follow-ups. A follow_up_by on or before last_contact has been overtaken by contact. Compute the live due date instead: weekly/biweekly/monthly → last_contact + 7/14/30 days, rendered (from last contact); organic → no date since contact (never overdue). Never write the computed date back — the stored field stays what a person set.
  • status: dormant — the engagement ended; the page and every fact stay.

Decision — 4. Decisions/YYYY-MM-DD-<slug>.md

type: decision
date: YYYY-MM-DD
topic: Short title
areas: [Area or Project]
status: open                # open | closed | reversed
updated: YYYY-MM-DD
tags: [decision]

Body: ## Context · ## Decision · ## Rationale · ## Expected outcome · ## Follow-up (dated lines).

Never edit a past decision's substance. A reversal is a new decision file that links the old one; the old one's status becomes reversed.


Thread — 3. Resources/Threads/<slug>.md

type: thread
title: Short title
status: open                # open | watching | resolved | dropped
domains: [Area or Project]
people: [Full Name]
opened: YYYY-MM-DD
updated: YYYY-MM-DD
tags: [thread]

Body: ## What it is · ## Why cross-cutting · ## Current state (replace, don't stack) · ## What's needed · ## Update log (append-only, newest first).

A thread opens when one signal shows up in two or more separate Areas or Projects. It closes when a decision resolves it, or it collapses to a single domain. Resolved and dropped threads move to 5. Archive/Threads/.


Reference note — 3. Resources/Research/ or 2. Areas/<Area>/knowledge/

type: reference
title:
source:                     # file, URL, sender, conversation — or "source unrecorded"
updated: YYYY-MM-DD
tags: [reference, <topic or area tag>]

source: is never blank. Placement → AGENTS.md, The classification test.


Inbox notes

Daily notes and weekly sweeps carry date: and tags: [inbox, daily-note] / [inbox, weekly-sweep] — no type:. Captures carry date: and tags: [inbox].