Status, steps, deliverables¶
Audience. Daily user.
At a glance¶
Every item is a directory under projects/YYYY-MM/YYYY-MM-DD-slug/ containing a README.md. There is no top-level incidents/ or documents/ folder — the kind field in the header discriminates. Three body sections are parsed: ## Steps, ## Deliverables, and anything whose heading is used by the step-add-by-section flow (## Timeline, etc., are left alone).
For the header format, see README format.
Folder layout¶
conception/
├── projects/
│ ├── 2026-04/
│ │ ├── 2026-04-10-auth-rewrite/
│ │ │ ├── README.md
│ │ │ └── notes/
│ │ │ └── investigation.md
│ │ └── 2026-04-14-login-500s/ ← incident, same layout
│ │ └── README.md
│ └── 2026-03/
│ └── 2026-03-22-ci-upgrade/
│ └── README.md
├── knowledge/ ← optional, explorer pane
│ └── …
├── .condash/ ← tree-level state (gitignored)
│ ├── settings.json ← per-host config
│ └── logs/YYYY/MM/DD/HHMMSS-<sid>.txt ← per-session terminal capture (plain text + JSON header/footer)
└── condash.json ← legacy config (still read)
The .condash/ directory is gitignored by default — the auto-migrator appends .condash/ to your conception's .gitignore the first time it lifts a legacy condash.json into .condash/settings.json. See Config files for the read precedence and the migration mechanics.
Rules, enforced or conventional:
| Rule | Enforced by | Notes |
|---|---|---|
Items live at projects/YYYY-MM/YYYY-MM-DD-slug/README.md |
parser glob | Anything not matching projects/*/*/README.md is invisible. |
Month folder is YYYY-MM |
convention | The parser does not validate the folder name, but the wikilink resolver expects it. |
Item folder starts with YYYY-MM-DD- |
convention | Dashes; no spaces. The part after the date prefix is the short slug wikilinks resolve against. |
Kind lives in the metadata block as kind: … |
convention | Defaults to project. No separate directory per kind — they coexist under one month folder. |
The flat-month layout was a deliberate simplification of an earlier projects/<slug>/ + projects/YYYY-MM/<slug>/ split. Items never move between active and archive; a Status: done flip is the only archive signal, and there's nothing for condash to rename. See why Markdown-first for the rationale.
Status model¶
Five ordered values, highest-urgency first:
| Value | Meaning |
|---|---|
now |
Actively being worked on this week |
review |
Work done, awaiting review or verification |
later |
Agreed to do, not scheduled |
backlog |
Possible; worth keeping, not committed |
done |
Closed. Stays in its YYYY-MM/ folder indefinitely. |
The parser normalises the value to lowercase and preserves it verbatim — there is no silent rewrite to backlog. Unknown values log a parser warning, sort after every known value (per statusOrder in src/shared/projects.ts), and make the card sprout a red !? <value> badge next to its status pill so typos (wip, active, …) stick out until corrected. A status: line that is absent altogether defaults to backlog (no badge). See README format — Status for the full rule. Inside the dashboard, status changes via drag-and-drop rewrite the status line in place — status: for YAML-frontmatter READMEs, **Status**: for legacy bold-prose READMEs. See mutations.
Steps¶
Markdown checklists inside any ##-level section. The dashboard's default "add step" target is a section literally named ## Steps, but any section (for instance ## Phase 1) can carry checkboxes and they all contribute to the item's progress count.
## Steps
- [ ] Audit current session-cookie usage
- [~] Implement the hybrid read path
- [!] Migration script for existing tokens (blocked on schema sign-off)
- [x] Decide on cookie attributes
- [-] Feature flag (abandoned — shipping directly)
Marker map¶
| Marker | Parsed status | Counted as done? |
|---|---|---|
[ ] |
open |
no |
[~] |
progress |
no |
[!] |
blocked |
no |
[x] or [X] |
done |
yes |
[-] |
abandoned |
yes |
The dashboard's checkbox-click cycle is open → progress → done → abandoned → open, implemented in src/main/mutate.ts (writer) and src/renderer/panes/projects.tsx (UI cycle order). The [!] (blocked) marker is not part of the cycle — set it by editing the README directly when work on a step is paused waiting for an external decision; the parser, counter, writer, and renderer all round-trip it without loss.
The canonical list of markers (and the parsing regex bracket class) lives in src/shared/types/project.ts as STEP_MARKERS.
Where to put steps¶
Keep the top-level ## Steps list short — three to eight high-level milestones. Per-file tasks, acceptance criteria, and detailed implementation checklists belong in notes/<name>.md, not in the README. The README is the bird's-eye view; the notes folder is the workshop.
Why no ordering semantics¶
The parser preserves source order. Drag-and-drop reorder rewrites the affected step lines in place (see src/main/mutate.ts) — there is no explicit index, priority, or ID on a step. Two steps with identical text are indistinguishable.
Deliverables¶
PDF outputs an item produces — technical reports, executive summaries, audits. Declared in a section literally named ## Deliverables:
## Deliverables
- [Technical report](rapport-technique.pdf) — full analysis with code references
- [Executive summary](summary.pdf) — one-page version for stakeholders
Strict syntax:
| Piece | Rule |
|---|---|
| Line start | - [ |
| Label | any text until the next ] |
| Path | Markdown link target ending in .pdf, relative to the item directory |
| Separator | optional em-dash (—), en-dash (–), or hyphen (-) |
| Description | optional free text after the separator |
The parser (src/main/parse.ts) stops at the next ## heading. Lines that do not match the pattern are silently skipped — a typo means your PDF disappears from the card, no error.
See Deliverables and PDFs for the viewer config, the download route, and how the built-in PDF.js previewer kicks in.
Timeline¶
An append-only human-facing log. The parser (src/main/parse.ts) reads the section to extract the Closed. date for done items and any structured YYYY-MM-DD — text entries; the dashboard surfaces the timeline in the project popover. Lines that don't match the date prefix are kept verbatim but ignored by the timeline view.
## Timeline
- 2026-04-10 — Project created
- 2026-04-12 — Auth audit complete; see notes/investigation.md
- 2026-04-15 — Hybrid read path merged to main
One line per event, dated, imperative, linkable. Useful when re-reading the item months later — much cheaper than scrolling through commit history.
Notes and subdirectories¶
Anything not in the README goes in notes/<name>.md (or any other subdirectory you create from the dashboard — logs/, drafts/, whatever). The card's Files section lists every non-README file in the item directory, grouped by subdirectory up to three levels deep. Hidden entries (leading .) and the top-level README.md are skipped.
See mutations for the create/rename/upload routes, and Linking items with wikilinks for the in-note link syntax.
What is not part of the convention¶
- No TOML frontmatter. YAML frontmatter is the canonical header shape from v2.16.0; TOML frontmatter is ignored. The legacy bold-prose header is also accepted indefinitely. See README format.
- No IDs. The directory name is the identity. No UUIDs, no auto-incrementing counters.
- No schema version. The parser is backwards-compatible within a major version; new fields are additive.
- No lock files. Everything the dashboard knows is derived from the tree on every request.
- No archive step. Items live at
projects/YYYY-MM/YYYY-MM-DD-slug/for life. Status flips, directories don't — so there's no "archive" or "tidy" workflow to trigger.