The status page listed gitea twice, and the reason was a wrong cut: the fact sink was a second adapter over the same backend. Storage has get and put; what a raw note looks like is not the storage's business.
INoteStore gains CreateAsync(path, text, message), throwing DocumentExistsException when the path is taken. IFactSink is gone.
DepositFactUseCase (Application) validates the fact, builds the raw note with provenance frontmatter, picks the dated slug path and numbers it on collision, and calls the store. Tests moved with it (DepositFactUseCaseTests, with a fake store and a fake clock).
GiteaRepository implements the store only: HEAD, tree, raw read, contents POST (422 → DocumentExistsException). One adapter, one health entry, named gitea.
The note-store contract now covers create: new path readable at the next head, existing path refused.
The status page listed `gitea` twice, and the reason was a wrong cut: the fact sink was a second adapter over the same backend. Storage has get and put; what a raw note looks like is not the storage's business.
- `INoteStore` gains `CreateAsync(path, text, message)`, throwing `DocumentExistsException` when the path is taken. `IFactSink` is gone.
- `DepositFactUseCase` (Application) validates the fact, builds the raw note with provenance frontmatter, picks the dated slug path and numbers it on collision, and calls the store. Tests moved with it (`DepositFactUseCaseTests`, with a fake store and a fake clock).
- `GiteaRepository` implements the store only: HEAD, tree, raw read, contents POST (422 → `DocumentExistsException`). One adapter, one health entry, named `gitea`.
- The note-store contract now covers create: new path readable at the next head, existing path refused.
82 tests green.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Both reported as "gitea" on the status page.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude-bot
changed title from gitea: distinct adapter names for the note store and the fact sink to gitea: one repository adapter for both ports2026-09-24 11:30:10 +00:00
Two classes over the same backend showed as two adapters on the status
page. One GiteaRepository, one HttpClient, one health entry; the host
lists an adapter once even when it serves several ports.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
claude-bot
changed title from gitea: one repository adapter for both ports to store port: get and create documents; depositing a fact is a use case2026-09-24 11:37:11 +00:00
The fact sink was a second adapter over the same backend. INoteStore
gains CreateAsync (DocumentExistsException on a taken path); the raw
note's shape, slug and collision numbering live in DepositFactUseCase;
GiteaRepository only moves text.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
The status page listed
giteatwice, and the reason was a wrong cut: the fact sink was a second adapter over the same backend. Storage has get and put; what a raw note looks like is not the storage's business.INoteStoregainsCreateAsync(path, text, message), throwingDocumentExistsExceptionwhen the path is taken.IFactSinkis gone.DepositFactUseCase(Application) validates the fact, builds the raw note with provenance frontmatter, picks the dated slug path and numbers it on collision, and calls the store. Tests moved with it (DepositFactUseCaseTests, with a fake store and a fake clock).GiteaRepositoryimplements the store only: HEAD, tree, raw read, contents POST (422 →DocumentExistsException). One adapter, one health entry, namedgitea.82 tests green.
🤖 Generated with Claude Code
gitea: distinct adapter names for the note store and the fact sinkto gitea: one repository adapter for both portsgitea: one repository adapter for both portsto store port: get and create documents; depositing a fact is a use case