Signposts' own signposts — a live listing

Signposts runs on Signposts. This is the live listing of this repo’s own bundles, signs and rules — generated at build time from its signposts.yml, so it can never drift from what actually ships.

Each entry’s one-line summary is its description: field. A sign steers (it never blocks); a rule blocks at the moment shown. The bundles below are the four the project ships: core (what a fresh install carries), local (dogfood guards for working on Signposts), and the installable git-hygiene and justfile bundles.

Signposts defaults

The orientation and guards you want on any repo that uses Signposts. This is what a fresh install carries.

typeidmomentwhat it does
signorientationsessionWhat Signposts is and how it steers — shown at the start of every session.
signrules-self-edittouchA nudge when you edit the guardrails themselves; it never blocks.
signauthoring-rulestouchHow to write a rule, shown when you're working in rules/.
signcommit-gate-hermetictouchWhy anything that shells out at commit must scrub git's env vars first.
signevent-log-contracttouchThe event log is one field-shape contract spread across three files — change one, update the others.
rulerules-have-tests · core/sibling-existswrite · commitEvery rule file ships a colocated <name>.test.yml the engine runs.
rulerules-tested-this-turn · core/ran-since-editturn-endHolds the turn open if you changed a rule this turn but didn't run its tests.
signast-grep-grammarstouchWhat ast-grep is (a structural code matcher) and how to add a language grammar.
signdepcruise-fencestouchWhat dependency-cruiser is (an import-graph checker) and how the fence dialect works.
ruleno-delete-guardrails · core/protected-pathdeleteStops a command from deleting the config or a rule file.
rulesignposts-well-formed · core/signposts-lintwrite · commitChecks signposts.yml parses and every signpost has an id, a use (rules), and a description.
ruleno-commit-engine-log · core/protected-pathcommitStops the Signposts event log (.signposts/) being checked in.

Tooling — the justfile is home

The justfile is the single command source; commands you run more than once become documented recipes.

typeidmomentwhat it does
signtooling-firstsessionWhere the repo's commands live, and when to add a recipe.
ruleno-package-scripts · core/json-invariantwrite · commitKeeps package.json scripts empty — the justfile is the one command source.
rulejustfile-docs · tooling/justfile-docswrite · commitEvery listed justfile recipe carries an explicit doc string for the just --list help screen.

Git hygiene

No AI attribution in commits, PRs or issues, and nothing silently discards uncommitted work.

typeidmomentwhat it does
signcommit-hygienesessionThe rules for how commits, PRs and issues are written here.
ruleno-ai-attribution-in-commits · core/command-guardcommandBlocks Claude/Anthropic attribution in a commit, PR or issue before it is made.
ruleno-git-discard · git-hygiene/no-git-discardcommandBlocks a git checkout/restore that would wipe uncommitted work — git stash is the reversible path.
rulecommit-grammar · git-hygiene/commit-grammarcommandChecks a git commit message speaks Conventional Commits before the commit runs.

Functional core, imperative shell

Keep decision logic pure and testable, push effects to the edges — and fence the import graph so it stays that way.

typeidmomentwhat it does
signfcistouchThe functional-core / imperative-shell model, shown when you touch the decision core.
ruleimport-fence · core/depcruisecommitA dependency-cruiser fence — the pure layer imports no node builtins or shell, and the core never imports the CLI.
rulepure-has-test · core/sibling-existswrite · commitEvery pure decision module ships a colocated .test.mjs — the functional core is TDD'd.
rulepure-covered · core/tool-gatecommitBlocks a commit if the functional core's line coverage drops below 95% (only runs when pure/ changed).

Testing discipline

Test behaviour, not implementation; spend effort where confidence-per-cost is highest.

typeidmomentwhat it does
signphilosophytouchWhat to test and how much, shown when you touch a test.

Node app hygiene

A new dependency is an audit surface; the lockfile moves with it, and the version stays SemVer.

typeidmomentwhat it does
signdependenciestouchWhat to weigh before adding a dependency, shown when you touch the manifest.
rulelockfile-in-step · core/change-togethercommitpackage.json and the lockfile must change in the same commit.
ruleversion-is-semver · core/json-invariantwrite · commitpackage.json version is valid SemVer 2.0.0.

TypeScript discipline

In the site's TypeScript, never silence the checker; the strict preset stays on.

typeidmomentwhat it does
signtypes-as-designtouchUse types as a design tool, shown when you touch the site's TypeScript.
ruletsconfig-stays-strict · core/json-invariantwrite · commitThe site's tsconfig keeps extending Astro's strict preset.
rulesite-typechecks · core/tool-gatecommitType-checks the website at commit (astro check) — only runs when a site/ file changed.

Web quality

The lintable slices of accessibility and performance for the docs site.

typeidmomentwhat it does
signaccessibilitytouchThe a11y checks a linter can't make, shown when you touch the site's UI.
signperformancetouchThe edit-time performance rules of thumb for the site.
signasset-budgettouchThe byte budgets to keep in mind when adding site assets.

Docs — agent vs user

docs/agent/ is written for agents (whatever format they consume best); docs/user/ is written for humans — HTML only, multimodal, minimum cognitive load.

typeidmomentwhat it does
signdocs-shapetouchThe two-audience docs convention, shown when working in docs/.
ruleuser-docs-are-html · core/protected-pathwrite · commitdocs/user/ is the human-facing surface — HTML and assets, never markdown.

Working-docs journal

.work/ is the gitignored working-docs journal (specs · plans · handovers · research) — never committed into the code repo.

typeidmomentwhat it does
signwork-journaltouch.work/ is the gitignored working-docs journal — don't commit it.

Developing Signposts

Orientation and guards for working ON the Signposts codebase itself.

typeidmomentwhat it does
signdev-orientationsessionHow the Signposts codebase is laid out and how we work in it.
rulecommit-runs-tests · core/tool-gatecommitRuns the deterministic test suite (rules + hooks, ~6s; not e2e/live) at commit and blocks if anything fails.
signsitetouchHow to build and style the website.
signengine-failsafetouchWhy the hooks and event log must never throw or block an edit.
signyaml-writes-keep-commentstouchWhy writes to signposts.yml must go through editYaml, to preserve the user's comments.

Dogfood. The local bundle’s signposts-well-formed rule (core/signposts-lint) is what keeps this file honest — it blocks a commit if any sign or rule is missing its description, so this table is never half-empty. See the config file for the schema.