bdeshiandClaude Opus 5 be92b4b957 correct five claims about behaviour this engine does not have
All five were found by checking content-model.md against the parser rather than
by any gate, which is the point: verify.sh catches a dangling path and a missing
ADR number, never a sentence that is merely untrue.

The Scaffolding section documented `khosra demo <empty dir>` writing a generated
site. ADR-0051 deleted that generator eleven commits ago in favour of the tracked
site in examples/, so the paragraph described a subcommand main.go never
dispatched — and justified itself with "nothing in the engine repository is
content", which the committed demo site contradicts. Deleted rather than
rewritten: what the demo is belongs to state.md's inventory, and restating it
here would have broken the single-source rule to fix a smaller problem.

ADR-0050 is where that claim originated and it still read "Status: accepted",
so a reader arriving there had no way to learn the generator was gone. Its
Status line now names ADR-0051 as superseding that half. This deviates from
decisions.md being append-only, so the exception is recorded in the mutability
column where the convention lives: a Status line may be annotated in place, the
Decision text never.

"The parser does not read `slug` yet" was false and contradicted by the
frontmatter table twelve lines above it in the same file. Deleted.

The Sequences section and the Sequence doc comment both said `draft` is not
honoured "because no bundle carries it yet". Two errors: the demo site carries
one, and draft is honoured — membership resolves through Lookup, which is the
single place ADR-0024 hides unpublished bundles. The doc now says what actually
happens, including that prev/next closes over the gap.

state.md said draft "lands in Extra unread". It is lifted to Bundle.Draft and
deleted from Extra, and content_test.go already asserted it.

Evidence: a three-chapter series with a draft middle, served by a freshly built
binary. The landing lists First Rain and Third Rain; chapter one's next points at
three/, not two/; the draft's own URL is 404. That absence has no test, so it is
now a latent item with the reason it is safe by construction.

6 files, +25/-25. No counter moves. surface.md regenerated: the comment gained a
line and shifted ten declaration numbers.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-02 16:58:45 +06:00

khosra

A flat-file personal publishing engine in Go. Point the binary at a directory of Markdown and it becomes an owned, networked home for fiction, webcomics, art, and essays, in English and Bengali. The site's content lives in its own repository, not this one (ADR-0011).

Build and run

Needs Go 1.26+ and git; nothing else.

make build                      # or: go build -o khosra ./cmd/khosra
make run SITE=/path/to/site     # or: ./khosra -site /path/to/site
make test
make verify                     # everything the project enforces — green before every commit

make help lists targets. make is a convenience wrapper; go build, go test and ./scripts/verify.sh work on their own and are what the gate uses.

A site root is a directory holding content/, and optionally static/ and templates/. It lives in its own repository, not this one — the binary is pointed at it.

If you are a human: start at HARNESS.md — what the scaffolding is, how to use it, and what to decide.

If you are an agent: start at CLAUDE.md — the constitution and the read order. It is loaded for you automatically; this file is not a prerequisite and nothing here is a rule.

S
Description
A personal publishing engine
Readme
1.1 MiB
Languages
Go 89%
Shell 7%
HTML 2.3%
CSS 1%
Makefile 0.4%
Other 0.3%