context-vigilance — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited context-vigilance (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A framework for Human + AI collaboration: manage the context available to AI and collaborators with the same rigor you manage code. Every Lossless project has a context-v/ directory with (commonly) eight subdirectories, organized into three cognitive modes: Prep, Reflective, and Journey — plus two universal utility folders and a small experimental tier still finding its shape.
Norms, not rules. Patterns here are loosely enforced. The team is generative-first; consistency emerges when attention focuses on a project, file, or pattern. Be generous reading existing files (they may pre-date current norms or be experiments) and careful writing new ones. See references/philosophy.md for the deeper rationale.
Drift policy: When you encounter inconsistencies (mismatched frontmatter, deviating filenames, partial-convention adoption), observe, note, surface, but do not auto-fix as a side effect of unrelated work. Cleanup happens only with explicit user permission. The user runs parallel agent sessions; silent normalization creates conflicts. (This rule lives globally in ~/.pi/agent/AGENTS.md; restated here for redundancy.)
Reference: <https://www.lossless.group/projects/gallery/context-vigilance>
context-v/ directorycontext-v/The work of deciding what to build is the work — "prep" here is not "minor pre-work", it's the deliberate forward construction phase. Specs, plans, and prompts are the artifacts, in descending altitude.
A prompt without a spec is a vibe. A prompt within a spec is engineering.
<name>/SKILL.md + optional references/, templates/, scripts/). This is the incubator: skills are born here next to the code they serve, and graduate to the shared public lossless-agent-skills repo (mounted at the anchor monorepo's context-v/skills/) once they prove out or apply beyond one repo. Reflective mode's executable tier — a blueprint an agent can load and follow, not just read.Two folders that aren't doc-types so much as infrastructure, applicable to every project:
context-v/extra/ to the repo's .gitignore when scaffolding. Corpus rollups and ingesters already exclude it by convention; the gitignore makes the privacy boundary structural rather than tooling-dependent.Folders the team is actively trialing. Their shape is not settled — expect variation between repos, and don't enforce consistency across them yet:
/loop — the doc is the durable definition; the runner is the execution.Maintain <the thing> [across <the scope>]. A habit answers "what do we keep doing, and what fires it" — the trigger, the procedure, and how far it applies (applies_to is the load-bearing frontmatter field). Two trigger shapes are in use: event-driven (update the README when a change makes it untrue) and periodic sweep (walk every context-v/ promoting stale status: values). Distinct from `reminders/`: a reminder is a correction — when you do X, do it this way — and fires only when you happen to be doing X. A habit is an obligation — do X, on this trigger, across this scope — and fires whether or not anything reminded you. Most habits are addressed to the agent rather than the developer, and should say so explicitly.When creating either, follow the standard frontmatter baseline and note in the doc that the folder is experimental. When you see one shaped differently from this description, that's expected — surface the divergence, don't normalize it.
The set above is convention, not closed. Experimentation is normal — you'll encounter folders that don't match (observed in the wild: narratives/, profiles/, inquiry/, models/, strategy/, notes/, research/). Some are domain-specific and correct where they are: narratives/ and slides-content/ in deck workspaces, profiles/ and inquiry/ across the studies shelf. When you find one:
plans/ and agent-skills/ took), folded (contents moved into an existing folder), or kept as project-specific.Frontmatter in context-v/ is scattered in practice — some files have lots of properties, some have very few. When creating new files, lead with this baseline:
---
title: "Human-readable title"
lede: "Subtitle-length hook — 140 chars max, two rendered lines."
publish: true
date_created: YYYY-MM-DD
date_modified: YYYY-MM-DD
date_authored_initial_draft: YYYY-MM-DD
date_authored_current_draft: YYYY-MM-DD
authors:
- Author Name
augmented_with:
- Claude Code on Claude Opus 5
at_semantic_version: 0.0.0.1
status: Draft
tags:
- Relevant-Tag
- Another-Tag
---When editing existing files, respect what's there. Don't add fields the file didn't have unless they're genuinely useful. Don't remove fields you don't recognize.
context-v/ needs all of themThis is the part agents get wrong, and it matters more here than anywhere else in the tree: `context-v/` documents constantly evolve. A spec is revised across months; a plan accumulates phases and post-ship notes; a blueprint gets superseded. Telling a doc that moved last week from one stable since spring is the whole job. That is why the vocabulary is broad.
| Family | Keys | Source of truth | Answers |
|---|---|---|---|
| Filesystem | date_created, date_modified | stat | "When did these bytes appear and last change?" |
| Editorial | date_authored_initial_draft, date_authored_current_draft, date_authored_final_draft | A human's judgment about the content | "When was this really written, last meaningfully revised, and finished?" |
| Lifecycle | date_first_published, date_last_updated | The work, not the file | "When did it ship? When was it last touched at all?" |
Filesystem dates lie in both directions, which is exactly why the editorial pair exists:
date_modified overstates recency. Obsidian bumps mtime just for opening a file. A doc untouched in substance for months shows yesterday.date_created can overstate age-of-origin. A machine recovery in this tree reset birthtime on a batch of files to the recovery date. Where frontmatter records an earlier `date_created` than the filesystem, the frontmatter is the more accurate record — never overwrite it with `stat`.Corollary when deriving a missing date_created: if the file has a date_authored_initial_draft, prefer it over filesystem birthtime. A document cannot be created after its own first draft.
date_authored_final_draft is often present but deliberately empty — that means "not final yet." Do not delete the empty key.
Legacy spellings being renamed as files are touched. Preserve the value verbatim; change only the key:
| Legacy | Current | Note |
|---|---|---|
created: | date_created: | |
date: | date_authored_initial_draft: | Mostly on changelog entries |
at_semantic_version — standard spelling, with a permanent aliasWrite `at_semantic_version`. It is the standard and what every new doc and template uses (~4,140 files).
`semantic_version` is an accepted alias for the same property and the same value (~330 files). It is not a legacy spelling awaiting migration — there is no sweep planned and none is wanted. Anything that reads the field reads both names and treats them identically; that costs a renderer one extra key lookup and saves rewriting hundreds of files for zero gain.
So: write at_, read either, and never rewrite an existing file just to change the spelling. If you're touching a file for other reasons and it says semantic_version, leave it.
Key conventions (full details in references/frontmatter-spec.md):
false means a stub, a title with nothing under it, something deliberately held back, or anything a stranger shouldn't see. If the key already exists, never flip it — especially never false → true because a doc "looks long enough." Judging it on an existing file means reading the file: a stale "Stub" banner over a developed body is true; a polished title and lede over placeholder sections is false.context-v/ work should be published; that's how the practice spreads. But write generically about specifics that aren't yours to share: name a client only when it adds something (it usually doesn't), keep PII and a client's proprietary frameworks and confidential deal terms out, and never paste a live credential value. Variable and env-var names, architecture, schemas, and our own candid post-mortems are all fine — over-screening makes the corpus useless. The document's job comes first: if it is materially better with the specific names in it, keep them and set publish: false — it stays in the repo for us, which is what context-v/ is for. Never water a document down for a publication that was never going to happen. See Avoid disclosing what could be considered sensitive in references/frontmatter-spec.md.date_modified whenever you edit the file — but bump date_authored_current_draft only on a substantive revision, and move at_semantic_version with itat_semantic_version is four-part `epoch.major.minor.patch` — see references/versioning.md. semantic_version is a permanently-accepted alias for the same property and value: write `at_`, read either, never rewrite a file to change which one it uses.authors is humans only, always a list. AI agents are tracked separately under augmented_with (format: Pi on Claude Sonnet 4.5). See references/frontmatter-spec.md.tags use Train-Case values (e.g., Markdown-Rendering, Issue-Resolution) — Obsidian conventionstatus uses Train-Case values too — it's a display string, not a machine enumlede (or description) is optional on any doc-type — a newsroom hook for preview cards / OG snippets / list views. Keep it subtitle-length (see Lede length discipline below).date_work_started / date_work_completed are optional and record when the work happened, not when the document was written. For a spec or plan these come apart hard — a plan is written before the work, revised during it, and the work finishes long after the last edit, so none of the four dates is derivable from another. date_work_completed normally gets set in the same edit that moves status to Shipped. Omit rather than guess, and do not backfill. See Work dates vs. document dates in references/frontmatter-spec.md.site_uuid and hex_code are write-once identity fields — mint them on every new file. site_uuid is a lowercase v4 UUID; hex_code is 6 chars of [a-z0-9] and serves as the doc's own citation ID ([^a4f2c1] inline → [^a4f2c1]: [[Filename-to-Reference]] in ## References). They exist because [[Filename]] is already ambiguous — one blueprint in this tree resolves to eight files across originals and roll-ups — and because Chroma/Graphiti/SurrealDB need a key that survives re-ingest and renames. Always generate with a command, never type one: uuidgen | tr 'A-Z' 'a-z' and LC_ALL=C tr -dc 'a-z0-9' </dev/urandom | head -c6. Seven model-typed UUIDs in this tree contain non-hex characters. Full rationale, the collision math, and the never-sweep-roll-ups rule: references/frontmatter-spec.md.summary is optional and agent-facing — the counterpart to lede, not a longer version of it. lede earns a human's click and flows into OpenGraph automatically; summary tells an agent what the doc is for, where it sits in the workflow, and what downstream logic consumes it. Worth writing on anything an agent has to triage — specs, blueprints, handoffs, issues. See `lede` vs. `summary` in references/frontmatter-spec.md, which also covers the legacy-alias trap (some repos used summary to mean lede).lede property — what it's for`lede` exists because `title` and `description` each fail at a different half of the job.
This is why the field is called lede and not description — the word is a newsroom instruction. Write something that grabs attention.
It's a rendering field, first and foremost. Content cards, list views, index pages, search results, and OpenGraph/social previews all need one line of prose under the title, and they need it to be good. A doc with a great body and no lede renders as a bare title in every one of those surfaces. A doc whose lede is a truncated description renders as noise. Both are worse than they need to be, and the fix costs one sentence.
Practical consequence: if a doc will ever appear in a list, it wants a lede — which in this tree is most of them, since context-v/ renders publicly through Astro Knots sites and the corpus splash.
The lede is a subtitle, not an abstract. It's the single line a reader sees in a list view, a preview card, or an OpenGraph snippet before deciding to click. Its whole job is to make them want to keep reading — and a hook that runs long has stopped being a hook.
The rule: 140 characters maximum, target 90–130 — two rendered lines, never three. A hard budget, not a guideline. Write ONE clause that lands, not a sentence with a subordinate clause trailing off it. If you can't say it in a subtitle, the lede isn't the place — the material belongs in the body.
Why a number and not "a few sentences." Prose guidance does not constrain a writer, human or agent. A 2026-08-17 sweep briefed against the old "~3 rendered lines" wording produced 55 ledes averaging 370 characters — every one of them good prose, every one of them clipping mid-sentence in an OpenGraph unfurl, and all of them rewritten. Give the budget as a count.
The one thing worse than a long lede is a vague short one. Never trade specificity for brevity. "A profile of Qdrant, a vector database" is under budget and worthless. If a document genuinely resists a 140-character hook, surface that rather than papering over it.
When you feel the lede wanting to grow — to carry the full context, the journey, the stakes, the file inventory — that's the signal to start a `## Why Care?` section directly under the title (or an equivalent context/intro section) and put the long version there. The body is unbounded; the lede is not.
✅ lede: "The single org slot becomes an open-ended stack of affiliation
cards — pick an org once instead of retyping it on every person."
❌ lede: "Yesterday the surface held one org per person, which was a lie about
how careers work because people sit on boards and advise and change
jobs and keep past titles, so tonight we … [200 more words]"
← this is a Why Care? section wearing a lede's clothesThis mirrors the audience cascade the changelog-conventions skill codifies: lede = the two-second hook; `Why Care?` = the paragraph that earns the scroll. Same discipline, every doc-type — specs, explorations, blueprints, issues.
No script can generate a lede. It is the one frontmatter field that requires having read the document and judged what is interesting about it. Every other field can be derived from the filesystem, the filename, git, or another key. This one cannot.
A generated-then-abandoned lede is worse than no lede, because it renders as garbage on exactly the surfaces the field exists for — list views, preview cards, OG unfurls. Real failure signatures found in this tree, all from one extraction pass:
| Symptom | What went wrong |
|---|---|
lede: "---" | Captured a horizontal rule instead of prose |
lede: "…allows each firm (e.g." | Sentence-splitter broke on the period inside e.g. |
lede: "…12Ps-scorecard." | Split on a period inside a filename |
lede: "Added a set of CLI tools to tighten the workflow:" | Lifted a sentence that introduces a bullet list, trailing colon and all |
title: "Summary" / title: "Overview" | Took the first ## rather than the document's subject — four docs ended up sharing one title |
Repairing one is a content edit, not a normalization — it changes an existing value, so it falls outside an additive-only sweep and needs its own directed pass. To do it: read the document, find the most interesting or surprising thing in it, and write one to three sentences that make someone want the rest. The raw material is nearly always already in the body — a ## Summary opener, a problem statement, a concrete number. Prefer the specific over the categorical.
If the document is a genuine stub, leave the lede empty. An empty lede on an empty document is accurate; inventing a hook for content that doesn't exist is fabrication, and it reads as a promise the page can't keep.
The status: field is the load-bearing signal of where a document sits in its lifecycle. A directory full of status: Draft plans, half of which actually shipped, is a directory you can't trust. Status reflects reality — promote it as work lands.
Canonical values (Train-Case display strings, not machine enums):
Draft → In-Review → Signed-Off → Implementing → Shipped · Partially-Shipped · Deferred · Stale · Superseded · Archived
Companion fields that must move with status:
date_first_published: YYYY-MM-DD; optionally post_ship_note: for things learned after ship.date_first_published: for the first shipped slice; append a ## Remaining work (as of YYYY-MM-DD) section enumerating what's done and what's left.deferral_note: explaining the named reason.superseded_by: [[Successor-Doc]].In every case, bump date_last_updated (or date_modified) on the same edit. Status changes are meaningful edits.
When to update: when you ship a substantial portion, defer explicitly, supersede, or notice the field doesn't match reality during a sweep.
When NOT to update: mid-session as a side effect of unrelated work (drift policy — surface, don't silently normalize); for docs authored by someone else whose ship state you're not sure about (ask first); as a way to "tidy up" without a real ship event to point at.
Full reference: references/status-discipline.md. The periodic sweep procedure: lossless-monorepo/context-v/habits/Maintain-Status-Discipline-Across-Context-V-Files.md.
Cross-referencing is how humans and agents focus on a limited scope at any moment — humans have context windows too. Three styles, all valid:
[[path/to/Filename.md]] or [[Filename]][link text](../specs/Some-Spec.md) context-v/specs/Some-Spec.md ` for references the reader isn't expected to clickUse whichever serves the reader. Backlinks are preferred because most context-v/ directories are symlinked into Obsidian vaults, where [[wikilinks]] unlock graph view, autocomplete, and backlink panes.
Common linking patterns:
Almost everything in context-v/ is destined for public web publishing through one of the Lossless Astro Knots sites. So every document balances three audiences:
Practical implications:
references/philosophy.md for the longer rationale.Use Train-Case for filenames: Train-Case.md. Same convention as tags. Matches existing examples like When-Claud-Code-and-When-Pi.md, Migrating-Study-to-its-own-Pseudomonrepo.md.
When in doubt, see references/doc-type-guide.md.
When creating a new file, start from the matching template in templates/:
templates/spec.mdtemplates/prompt.mdtemplates/blueprint.mdtemplates/reminder.mdtemplates/exploration.mdtemplates/issue.mdcontext-v/ taskNot a checklist — a default rhythm. Adjust to the situation.
templates/ if helpful, or write from scratch matching nearby files.date_created and date_modified. Start at 0.0.0.1. Add the user as author. If you (an AI) contributed materially, add yourself under augmented_with (e.g., Pi on Claude Sonnet 4.5) — not under authors.[[wikilinks]].My-New-Doc.md, tags like - New-Pattern).semantic_version per references/versioning.md and update date_modified. Respect existing frontmatter shape.Specs have more rhythm than the other doc-types: stub-first, discuss-then-write, handle stale prior art without hijacking the primary dialog, sign-off gate before implementation, narrative pass after sign-off, and pair with prompts for chunked execution. The full rhythm lives in references/developing-a-spec.md — load it whenever you're initiating or developing a spec with the user.
For the deeper version, see references/philosophy.md.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.