Almirah tracks work the GenAI-native way: instead of a separate issue tracker, every architectural decision, bug fix, or enhancement proposal is a Markdown file versioned right next to the specifications it affects. The decision records live in the decisions/ folder of the project and are parsed, linked, and rendered like every other document.
my_project/
├── decisions/
│ ├── adr-001-full-text-search.md
│ └── img/index-update-flow.svg
└── specifications/…A decision record is structured by conventional sections. The core ones:
Proposed, Accepted, In-Progress, Implemented), with the current status marked by a * in the first column.img/ folder and are copied into the build).> notation.The “Affected Documents” table is what ties a decision into the traceability graph. A row referencing an existing requirement resolves into a hyperlink, and the requirement gains a DR (decision record) mark in the opposite direction. A row proposing a new requirement stays visibly unresolved until that requirement is actually written — so a half-implemented decision is impossible to mistake for a finished one. See it live in the decision record demo.
All records are collected into a rendered overview at build/decisions/overview.html — status, title, and links, a project backlog generated from plain files.
Because records are files, change management rides on your source control: a new decision is a branch and a pull request, review happens in your normal code-review tool, and history is git log.
$ git checkout -b adr-002-record-export
$ vim decisions/adr-002-record-export.md
$ git add decisions/ && git commit -m "Adr: Record Export (#2)"
$ git push -u origin adr-002-record-export
# open a pull request — the review IS the change control boardNothing about the flow is Almirah-specific — which is precisely the point. The framework’s own development is managed this way, dogfooding decision records for every feature you read about on this site.