10 KiB
Topic Codes — registry for globally-unique issue/TODO/decision IDs
Scope note — workspace meta-tooling: This registry is workspace-configuration, not framework code. It lists topics across any layer (framework, shared libraries, consumer products) because LLM agents operate across the full workspace and need one unified topic list. This is an intentional exception to the Framework-First Design Principle — see
AyCode.Core/.github/copilot-instructions.md→ Framework-First Design Principle → Exception for workspace meta-tooling. If AyCode.Core is extracted as a standalone framework, this registry is replaced with the new workspace's topic set (typically only LOG, BIN, TOON, XCUT, LLMP — the framework-layer topics).
Canonical registry of topic codes used in issue, TODO, bug, critical, and decision entry IDs across the workspace. ID format: {TOPIC}-{TYPE}-{N}.
Why this registry exists
To make IDs like LOG-I-5, SIG-B-2, XCUT-I-1 globally unique strings — unambiguous when referenced from code comments, cross-file, commit messages, or a future DB migration.
Topic codes
| Code | Topic | Scope | Docs location (primary) |
|---|---|---|---|
LOG |
LOGGING | Logger system: levels, writers, config-reading vs DI factory | AyCode.Core/AyCode.Core/docs/LOGGING/ (+ variants in AyCode.Core.Server, AyCode.Services, Mango.Nop.Services) |
AUTH |
AUTH | User authentication: bearer tokens, JWT, login flow, hub authorization | AyCode.Core/docs/AUTH/ |
SIG |
SIGNALR | SignalR transport: tags, client base, dispatch, session | AyCode.Core/AyCode.Services/docs/SIGNALR/ (+ variant in AyCode.Services.Server) |
SBP |
SIGNALR_BINARY_PROTOCOL | Binary wire protocol over SignalR: framing, chunking, argument read | AyCode.Core/AyCode.Services/docs/SIGNALR_BINARY_PROTOCOL/ |
BIN |
BINARY | AcBinary serializer: features, format, writers, source generator | AyCode.Core/AyCode.Core/docs/BINARY/ |
TOON |
TOON | Toon serializer: LLM-optimized format with @meta/@types/@data sections | AyCode.Core/AyCode.Core/docs/TOON/ |
GRID |
MGGRID (grid component) | MGGRID component family: layout, CRUD, columns, toolbar, rendering | AyCode.Blazor/AyCode.Blazor.Components/docs/MGGRID/ |
XCUT |
cross-cutting | Issues / TODOs that span ≥2 topics — one canonical home, referenced from others | AyCode.Core/AyCode.Core/docs/XCUT/ (canonical; entry can be cross-ref'd from each affected topic file) |
LLMP |
LLM-protocol meta | LLM protocol decisions (Decision Log entries only — uses LLMP-DEC-N form) |
AyCode.Core/.github/LLM_PROTOCOL_DECISIONS.md |
Type codes
| Code | Type | Used in file | Notes |
|---|---|---|---|
I |
Issue | {TOPIC}_ISSUES.md |
Concrete concern: spec inconsistency, broken contract, observable edge case |
T |
TODO | {TOPIC}_TODO.md |
Forward-looking planned work: refactor, missing feature, optimization |
B |
Bug | {TOPIC}_ISSUES.md (alongside I entries) |
Confirmed broken behaviour, reproducible, needs a code fix |
C |
Critical | {TOPIC}_ISSUES.md or {TOPIC}_TODO.md |
Severity override — emergency priority, supersedes I/B/T category; body explains type |
DEC |
Decision | LLM_PROTOCOL_DECISIONS.md |
LLMP-only. Append-only protocol decision entries. |
Distinctions
- I vs B: Both tracked together in
_ISSUES.md. UseBonly when the behaviour is confirmed broken with a reproducer.Icovers concerns, inconsistencies, doc drift, edge cases without an active bug. - C (Critical): A severity flag, not a category.
LOG-C-1means "logger critical item 1" — body must state whether it's an underlying bug / issue / todo. PreferCoverI/B/Twhen severity is emergency. Do NOT double-classify (noLOG-IB-1or similar). - DEC: LLMP exception — long form because "LLMP-D-1" is unreadable. Decision Log entries only.
ID format rules
- Format:
{TOPIC}-{TYPE}-{N}— all uppercase, hyphen-separated. - Sequential number: starts at 1, no zero-padding (
LOG-I-1,LOG-I-10,LOG-I-123). - Counter scope: per (topic, type) pair.
LOG-I-*andLOG-T-*have independent counters.LOG-B-*has its own counter (separate fromLOG-I-*). - Append-only: once assigned, IDs never change. If an entry is reversed or superseded, add a NEW entry that references the prior one — do not renumber.
- Hash anchor (markdown cross-file refs): lowercase with hyphens preserved (
LOGGING_ISSUES.md#log-i-5— GitHub auto-converts). - No sub-category in ID: legacy prefixes like
PROTO-,DISPATCH-,CONN-,DS-are NOT allowed at ID level. Capture sub-category in the entry body header:## SIG-I-4 [PROTO]: ....
Registry maintenance
To add a new topic code:
- Propose the code (2-5 uppercase chars), short and mnemonic.
- Check it doesn't collide with C# class-name prefixes (
Ac*= AyCode.Core,Mg*= Mango-specific) — the code should be visually distinct from those prefixes. - Add a row to this registry.
- Create the topic folder:
docs/{TOPIC_FOLDER_NAME}/withREADME.md, optional{TOPIC_FOLDER_NAME}_ISSUES.md,{TOPIC_FOLDER_NAME}_TODO.md. - Add a Decision Log entry (
LLMP-DEC-N) recording the new topic.
Collision avoidance with class-name prefixes
C# code conventions in this workspace:
Ac*— AyCode.Core framework types (e.g.,AcLoggerBase,AcBinarySerializer)Mg*— Mango company types (e.g.,MgGrid,MgDbTableBase,MgEntityBase)
Topic codes intentionally avoid these 2-char prefixes to prevent visual confusion in mixed content (e.g., MgGrid.cs → GRID-I-1, not MG-I-1).
Examples
LOG-I-5 # logger issue 5
LOG-T-3 # logger TODO 3
LOG-B-1 # logger bug 1 (confirmed broken)
LOG-C-1 # logger CRITICAL — body: underlying bug / issue / todo
SIG-I-4 # SignalR issue 4 (body may note: [PROTO] sub-category)
SBP-T-2 # SignalR Binary Protocol TODO 2
BIN-B-1 # Binary serializer bug 1
TOON-I-3 # Toon issue 3
GRID-T-7 # MgGrid TODO 7
XCUT-I-1 # cross-cutting issue 1 (affects ≥2 topics)
LLMP-DEC-4 # LLM-protocol decision 4 (Decision Log entry)
Cross-references to other files
- Reference format (cross-file in markdown):
LOGGING_ISSUES.md#log-i-5(filename + hash anchor). Bare ID (LOG-I-5) may be used when context is unambiguous (within the same topic). - Code comments:
// See LOG-I-5— bare ID acceptable since it's globally unique. - DB natural key (future migration):
(topic, type, seq)tuple; or the full stringLOG-I-5as a single column.
Status field conventions
Every entry in _ISSUES.md, _TODO.md, and LLM_PROTOCOL_DECISIONS.md SHOULD carry an explicit Status field. 3 allowed values:
| Status | Meaning | Archive eligible? |
|---|---|---|
Open |
Active / unresolved (default for new entries); also used for documented-current-behaviour entries that must remain visible | No |
InProgress |
Partial work in flight; some scope addressed but more remains | No |
Closed |
Done — bug fixed, decision made (won't fix / superseded by another entry / accepted), TODO completed. The body of the entry explains what happened (date, ref, rationale). | Yes |
Defaults
- New entries default to
Status: Open. - For documented current-behaviour entries (accepted limitations / "by design" / "this is how it works"), use
Status: Openwith an optional body callout:> **Note:** This entry documents accepted current behaviour — not scheduled for change.These never archive (Open status).
Update workflow
When status changes, update the Status line in-place. This is the ONE exception to append-only — the Status field is mutable; entry body / ID / Description remain immutable.
When marking Closed:
- Format the Status line as
Status: Closed (YYYY-MM-DD)— the inline date is whatdocs-archiveuses to determine the destination year-bucket. - Add a
### Resolutionsub-section documenting the closure. Strongly recommended — without it, future readers (and thedocs-archiveskill on lookup) have no context for "what changed, why, where". Suggested fields:- What: one-line summary of the change.
- Where: code reference (file/class/commit hash) or doc reference (ADR / PR).
- Why: the rationale (fix / "won't fix because X" / "superseded by LOG-I-Y" / "accepted as-is").
- Optional: scope, date if different from Status line, related entries.
The body carries the nuance; the Status field only signals archive-eligibility.
Lifecycle: archive
Closed entries are eligible for rotation into year-bucketed archive files (<file>_<year>.md) via the docs-archive skill. Year derived from a date in the entry body. Archive operation is user-invoked — closed entries don't disappear automatically. See AyCode.Core/.github/skills/docs-archive/SKILL.md.
Change history
See the Decision Log (../../../LLM_PROTOCOL_DECISIONS.md) for the introduction of this registry and future topic-code additions.