# LLM Protocol Decisions

Append-only log of decisions about the AI AGENT CORE PROTOCOL and related LLM tooling (skills, instruction files, shared conventions) across the 8 known `.github/copilot-instructions.md` files.

---

## Current protocol state (quick reference)

Active as of **2026-04-26**. For the full evolution history, see the dated table near the bottom of this file. Read this summary first to orient yourself before diving into the dated entries.

**Session start flow**:
- **Primary files**: agent reads `copilot-instructions.md` + 3 SKILL.md files (`docs-discovery`, `docs-check`, `protocol-audit`). First response's `[LOADED_DOCS: ...]` shows 4 files.
- **Inherit files**: agent reads this inherit `copilot-instructions.md` + AyCode.Core's canonical `copilot-instructions.md` (for the numbered rules) + 3 SKILL.md files. First response's `[LOADED_DOCS: ...]` shows 5 files.
- **Why pre-load**: workspace skills are NOT in Claude Code's native skill-registry; pre-loading ensures implicit triggers fire reliably.

**AI AGENT CORE PROTOCOL** (present verbatim in each primary `.github/copilot-instructions.md`):
1. **MANDATORY OUTPUT PREFIX** — every response starts with `[LOADED_DOCS: N files (+K this turn: <short names>)]`. Short-name rule: basename by default; `TOPIC/README.md` for topic-folder READMEs (to disambiguate the many `README.md` files); extend upward for cross-project collisions. Never emit a bare `README.md` in the prefix.
2. **HARD-GATE: DOCS BEFORE CODE** — no `code_search` / source `get_file` until relevant `.md` docs are loaded. Includes **CROSS-REPO HARD-GATE** (applies to every repo entered via `own-dep-repos`) and **PER-QUESTION DOC-FIRST** (check for unloaded `.md` before grepping code).
3. **STRICT NO-RE-READ POLICY** — a doc is "in context" only if actually read via tool call in THIS conversation (session summaries / memory entries do NOT count — lossy compression).
4. **CONTEXT RECOVERY** — auto-detection triggers: session starts with a summary, mid-session compaction, or inability to quote exact content → reset `[LOADED_DOCS: NONE]` and re-read per Rule #2.
5. **EXPLICIT CONSENT FOR MODIFICATIONS** — no rewriting, creating, or deleting *any* file (code, docs, config, memory, or otherwise) without explicit user approval.

**Docs layout — Option C "folder + topic-prefixed companions"**:
- Paired topics live in `TOPIC/` folders: `TOPIC/README.md` (main, canonical) + `TOPIC/TOPIC_ISSUES.md` + `TOPIC/TOPIC_TODO.md` + optional `TOPIC/TOPIC_<subname>.md`.
- Single-file reference docs (`ARCHITECTURE.md`, `CONVENTIONS.md`, `GLOSSARY.md`, `DTOS.md`, etc.) remain flat at the `docs/` root.
- Each `docs/` root has a `README.md` index listing the topics.
- Project-specific variants of framework topics (e.g., the server-side logger in `AyCode.Core.Server`, the Nop bridge in `Mango.Nop.Services`) get their own `TOPIC/README.md` under the variant project's `docs/`.
- `.csproj` files use recursive glob: `<None Include="docs\**\*.md" />` so Pattern B nesting auto-shows in Visual Studio Solution Explorer without manual entries.

**Instruction files — 7 total** (was 8 before LLMP-DEC-51 / `Mango.FruitBank` deployment-host folder removal; deployment-context re-attributed to `FruitBank` per LLMP-DEC-52):
- **5 primary** files contain the full numbered AI AGENT CORE PROTOCOL: `AyCode.Core`, `AyCode.Blazor`, `Libraries`, `FruitBank` (Mango/Source), `FruitBankHybridApp`.
- **2 inherit** files reference AyCode.Core's protocol via blockquote (no duplicated numbered rules): `Mango.Nop.Core` (sub-project framework), `Nop.Plugin.Misc.AIPlugin` (plugin source).
- Each non-Core file has `## Shared Agent Skills` + `## Protocol History` sections.
- **Per-repo `prefix` field** (LLMP-DEC-58): every `@repo` block declares its own ID-prefix (`prefix = "ACCORE"`, `"ACBLAZOR"`, `"MGNOPLIB"`, `"MGNOPCORE"`, `"MGFBANKPLUG"`, `"FBANKNOP"`, `"FBANKAPP"` — 7 prefixes, 1 per repo).
- **`.github/` AND `docs/` files follow Framework-First** (LLMP-DEC-58 narrowed `.github/` exception; LLMP-DEC-62 extended the rule to `docs/`): each repo declares its own info (prefix, topics, etc.); only `LLM_PROTOCOL_DECISIONS.md` (workspace-meta history) and transient migration artifacts (`MIGRATION_ID_MAPPING.md`) may cross layers. Cross-layer awareness in tooling uses runtime discovery via `own-dep-repos` walking, not centralized listings. **Single bounded exception** per repo: `CONSUMERS.md` (one file per repo, optional) MAY list higher-layer repos that consume this one — bounded consumer-awareness for change-impact assessment, NOT framework-on-consumer coupling. AyCode.Core's lives at `AyCode.Core/CONSUMERS.md`.

**Issue / TODO / Decision ID format** (globally unique, 4-component as of LLMP-DEC-50..59):
- Format: `<PREFIX>-<TOPIC>-<TYPE>-<RAND>` (e.g., `ACCORE-LOG-I-K7M2`, `ACCORE-SIG-T-D7Q4`, `ACCORE-BIN-B-XXXX`, `ACCORE-XCUT-I-X8Q1`, `ACBLAZOR-GRID-T-V4P7`, `LLMP-DEC-50`).
- **`<PREFIX>`** (repo namespace): declared per-repo in `copilot-instructions.md` `@repo` block (`prefix = "..."` field, LLMP-DEC-58). Format spec + the framework's own `ACCORE` listing: `AyCode.Core/.github/REPO_PREFIXES.md`. Higher-layer prefixes are declared in their own repos (Framework-First — no central enumeration).
- **`<TOPIC>`** (framework / ACCORE topics): `LOG` (logger), `AUTH` (authentication), `SIG` (SignalR), `SBP` (SignalR binary protocol), `BIN` (binary serializer), `TOON` (Toon serializer), `XCUT` (cross-cutting within ACCORE), `META` (meta-tooling issues/TODOs about the protocol stack itself, LLMP-DEC-62), `LLMP` (LLM-protocol meta — bare format, no prefix). Higher-layer topics live in each repo's own `<repo>/.github/TOPIC_CODES.md` (e.g., AyCode.Blazor's `GRID`); see `AyCode.Core/.github/skills/docs-check/references/TOPIC_CODES.md` for the per-repo extension convention.
- **`<TYPE>`** (universal): `I` = issue, `T` = TODO, `B` = bug, `C` = critical (severity override), `DEC` = decision (LLMP-only).
- **`<RAND>`** (random suffix): 4-char `[A-Z0-9]`; ~1.7M combinations per `<PREFIX>-<TOPIC>-<TYPE>` triplet. Generated at entry creation; uniqueness verified via glob over active + archive files; collision triggers regeneration. **Avoids parallel-branch ID-collisions at merge time.**
- **LLMP exception**: `LLMP-DEC-N` entries (workspace-meta Decision Log) skip the prefix and use sequential `N` — single-file serialization avoids parallel-branch concern. Bare format `LLMP-DEC-1`, `LLMP-DEC-2`, ...
- **Cross-repo search**: prefix-wildcard glob (`*-LOG-I-*`, `*-XCUT-I-*`) finds all matches workspace-wide, no central index needed (LLMP-DEC-55 — `docs-discovery/SKILL.md` Cross-repo ID search section).
- **Append-only**: IDs never change once assigned. Hash anchors in markdown cross-refs use lowercase: `LOGGING_ISSUES.md#accore-log-i-k7m2`.

**Agent skills — five at `AyCode.Core/.github/skills/`** (2 reactive pre-loaded at session start per LLMP-DEC-43; 3 user-gated lazy-loaded on demand):
- **`docs-discovery`** (reactive) — extracts topic tokens from user requests, globs `**/docs/TOPIC/**/*.md` (+ companion patterns), loads the paired main+ISSUES+TODO set before source-code search. Cross-repo wildcard search for ID-pattern matches (`*-LOG-I-*` etc.) added in LLMP-DEC-55. Updates LOADED_DOCS via Rule #1 format.
- **`docs-check`** (reactive) — end-of-code-modifying-response skill: evaluates loaded `.md` for drift vs code, missing topic coverage, csproj-glob registration gaps, and new issue/TODO candidates. Emits the `[DOCUMENTATION CHECK]` section (or `[DOCUMENTATION CHECK] None.` single-line). Read-only on loaded docs; all patches as proposals per Rule #5.
- **`protocol-audit`** (user-gated) — audits `.github/copilot-instructions.md` files discovered via runtime walk of `own-dep-repos` from the invocation point (LLMP-DEC-58 redesign — was central-`REPOS.md` driven before). Common invariants C1-C4 for all (C1: 5 required `@repo` fields incl. `prefix`; C3: `prefix` format check, repurposed in LLMP-DEC-58); Primary-only (P1-P10) for files content-classified as primary; Inherit-only (I1-I3) for inherit files; Cross-cutting (X1, X2, X3). Reports PASS/FAIL per invariant-file cell with patch suggestions. Does NOT auto-apply patches.
- **`adr-author`** (user-gated) — Architecture Decision Record authoring; structured interview producing `docs/adr/NNNN-<slug>.md` (product decisions) or new `LLMP-DEC-N` row (meta-protocol decisions).
- **`docs-archive`** (user-gated) — rotates `Status: Closed` entries from active `_ISSUES.md` / `_TODO.md` / `LLM_PROTOCOL_DECISIONS.md` into year-month bucket archive files; archive-time collision-check on random suffix.

**Docs-sync enforcement (`[DOCUMENTATION CHECK]` at end of code-modifying responses)**:
- **Keep all .md in sync** — if code and loaded docs disagree, notify and ask (do NOT silently edit).
- **Identify missing documentation** — if a frequently-used pattern isn't documented in main topic docs, propose an entry.
- **Topic-based separation** — split logically distinct topics into separate `.md` files; keep concise and LLM-oriented.
- **File registration (scope: outside existing glob only)** — if a new `.md` falls outside the nearest `.csproj`'s recursive globs (`docs\**\*.md`, `**\README.md`), surface the needed glob patch. Common case (doc under `docs/`, folder-README) is zero-cost via csproj globs set up cluster-wide.
- **Issue / TODO surfacing** — surface concrete, non-duplicate, actionable `_ISSUES.md` / `_TODO.md` candidates as draft entries (priority P1-P3, rationale, code ref — **NO ID**, user assigns at apply-time). **Prerequisites (ALL must hold):** companion is in `LOADED_DOCS`; high-confidence (quotable evidence); concrete; not duplicate. **Max 3 items per response.** Also: surface `Status: FIXED` suggestions when a listed issue is fixed in the current response.
- **Empty-state output** — if `[DOCUMENTATION CHECK]` has nothing to report: `[DOCUMENTATION CHECK] None.` single line, no padding.

**Decision Log governance (this file)**:
- **Append-only.** Never rewrite or delete entries. Reversals and refinements get *new* entries that reference the superseded one by ID (e.g., "LLMP-DEC-26 superseded by LLMP-DEC-27").
- **Entries have `LLMP-DEC-N` IDs** (topic=LLMP, type=DEC — see TOPIC_CODES.md). Sequential, append-only, never renumber. Reference entries by ID for unambiguous citation from code comments, other `.md` files, or cross-repo.
- **Archive policy** (LLMP-DEC-67): active log keeps **last 15 entries** (rolling window); older entries rotate to **year-month bucket** archive files (`LLM_PROTOCOL_DECISIONS_<YYYY>_<MM>.md`, e.g., `_2026_04.md`). Sparse files OK — only month-buckets with archived entries get a file. Triggered manually via `docs-archive` skill on user request, or automatically when active count > 15. IDs stay unique across archives. **Supersedes** the original "annual at ~50" policy from LLMP-DEC-25.
- **`Affected` column** uses the scope codes defined below.
- **User consent required** for every new entry.
- **No skill / template version labels.** Skills and templates are continuously iterated; the Decision Log entry IS the version history. Reference changes by date or `LLMP-DEC-N` ID, not by synthetic version numbers (`v1.1`, `v2.0`, etc.) — neither in skill content, frontmatter metadata, nor in conversation when discussing changes. LLMP-DEC-45 removed legacy `metadata: version` fields from all SKILL.md files; LLMP-DEC-47 codifies the principle explicitly to prevent the linguistic regression of using `vN.M` as colloquial shorthand for "recent changes".

---

## Purpose

Quick lookup for **why** a rule is the way it is, to avoid:
- Re-debating decisions that were already discussed and resolved
- Silently "optimizing away" a rule whose edge-case purpose is no longer obvious
- Losing context between sessions / across team members

## Scope

**Tracked here:**
- `.github/copilot-instructions.md` rule additions / removals / rewordings
- `CLAUDE.md` changes
- New, modified, or removed agent skills (`docs-discovery`, `protocol-audit`, etc.)
- Protocol-level structural shifts (doc layout, file location conventions)

**NOT tracked here:**
- Code refactors or feature work — use commit messages / PR descriptions
- Code-architecture decisions — see `docs/ARCHITECTURE.md` at the relevant layer
- Trivial fixes (typos, path corrections without rule-semantic change)

## Writing rules

1. **Append-only.** If a decision is reversed or superseded, add a NEW entry that points to the old one. Do not rewrite history — the evolution itself is informative.
2. **One row per decision.** Keep the rationale concise; the purpose is scan-ability, not prose.
3. **`Affected` column** uses the scope codes defined below — always be explicit about which files were touched.
4. **Explicit consent required for additions** (per Rule #5 of the active `copilot-instructions.md`). The LLM proposes the entry; the user reviews and approves before the write.
5. **Reference this log** before proposing a protocol change — if the change was already discussed, the existing entry may save a debate.

## Scope codes (for the `Affected` column)

| Code                   | Meaning                                                                                                   |
|------------------------|-----------------------------------------------------------------------------------------------------------|
| `5× primary`           | All 5 primary `copilot-instructions.md` (AyCode.Core, AyCode.Blazor, Libraries, FruitBank, FruitBankHybridApp) |
| `4× non-Core primary`  | The 4 primary files except AyCode.Core                                                                    |
| `2× inherit`           | The 2 inherit files (Mango.Nop.Core, Nop.Plugin.Misc.AIPlugin) — was 3× before LLMP-DEC-51                |
| `all 7`                | All 7 files: 5 primary + 2 inherit (was `all 8` before LLMP-DEC-51)                                       |
| `<repo>/...`           | A single specific file path                                                                               |
| `<skill-name>/...`     | Skill directory under `.github/skills/`                                                                   |

The "primary" vs "inherit" distinction is defined in `protocol-audit/references/REPOS.md`.

## 2026

> **Earlier entries archived**: LLMP-DEC-1..54 (2026-04-20 through 2026-04-26) → see [`LLM_PROTOCOL_DECISIONS_2026_04.md`](./LLM_PROTOCOL_DECISIONS_2026_04.md) per the **last-15-active retention policy** (LLMP-DEC-67). The active table below contains only the most recent 15 entries (rolling window). Cross-link integrity preserved: when a recent entry references `LLMP-DEC-X` (X ≤ 54), open the archive file to read the full text — IDs are stable, never reassigned.
>
> **Year-month buckets** (LLMP-DEC-67 policy): future archive files use `LLM_PROTOCOL_DECISIONS_<YYYY>_<MM>.md` (e.g., `_2026_05.md` for May 2026 entries). Cross-month archives are sparse files keyed on the entry's date column. The retention rule scans on `docs-archive` invocation: archive when active count > 15, target by entry date.

| ID            | Date       | Decision                                              | Rationale                                                                                         | Affected                                                                    |
|---------------|------------|-------------------------------------------------------|---------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------|
| LLMP-DEC-55   | 2026-04-26 | Phase 3 of ID-format migration: skill `SKILL.md` files updated for 4-component ID format and per-repo registry awareness | Phase 3 of the LLMP-DEC-50 migration. Updated 4 skill `SKILL.md` files + 1 reference template to align with the format foundation established in Phases 1-2 (LLMP-DEC-53 `REPO_PREFIXES.md`, LLMP-DEC-54 `TOPIC_CODES.md`). **`docs-check/SKILL.md`** (5 edits): (a) Step 5 Proposed ID spec — `{TOPIC}-{TYPE}-{N}` → `<PREFIX>-<TOPIC>-<TYPE>-<RAND>`, with both registries cross-linked, random-suffix generation procedure (glob + collision-check + regenerate), `<PREFIX>` source clarification (active repo's). (b) Sub-category example — `## SIG-I-4 [PROTO]: ...` → `## ACCORE-SIG-I-K7M2 [PROTO]: ...`. (c) Topic code selection — per-repo TOPIC_CODES.md awareness, prefix-disambiguation note, cross-repo XCUT case flagged as not-formalized, new-topic proposal references Registry maintenance workflow. (d) Step 6 renamed "Status update on fix" → "Status update on close" — aligned with LLMP-DEC-44 vocabulary (Open/InProgress/Closed); example anchor updated to full prefixed form; Resolution sub-section requirement added per Status field conventions. (e) Output template — `[tentative: TOPIC-TYPE-N]` → `[tentative: <PREFIX>-<TOPIC>-<TYPE>-<RAND>]`. **`docs-discovery/SKILL.md`** (2 edits): (f) Archive file ID example — `LOG-I-X` → `ACCORE-LOG-I-K7M2`. (g) NEW section "Cross-repo ID search" — describes prefix-wildcard glob patterns (`**/*-LOG-I-*`, `**/*-MEAS-T-*`) for finding entries of a topic across all repos, complementing Step 2's topic-folder discovery; explicit "globs do the work, no central index" principle. **`docs-archive/SKILL.md`** (1 edit): (h) Year-derivation example updated — `Fixed 2026-04-25`, `Won't fix 2026-04-25`, `LOG-I-X` → `Status: Closed (2026-04-25)`, `### Resolution` sub-section, `ACCORE-LOG-I-K7M2`; explicit Status vocabulary alignment with TOPIC_CODES.md (only Closed archives). **`adr-author/SKILL.md`** (1 edit): (i) Step 8 #4 follow-up TODO format — `{TOPIC}-T-N` → `<PREFIX>-<TOPIC>-T-<RAND>` with cross-link to TOPIC_CODES.md and REPO_PREFIXES.md. **`adr-author/references/ADR_TEMPLATE.md`** (1 edit): (j) Related TODOs/Issues placeholder — `<LOG-T-N, BIN-I-M, ...>` → realistic 4-component placeholders with registry cross-link. **No existing entry IDs renamed** — Phase 3 is purely skill-text update; existing entries (e.g., `LOG-I-1` through `LOG-I-10` in LOGGING_ISSUES.md) remain in legacy 3-component format until Phase 5 migrates them. **Phases 1-3 complete = format foundation done**; Phase 4 (mapping table OLD_ID → NEW_ID for existing entries), Phase 5 (per-topic existing-entry rename), Phase 6 (cross-file ref cleanup including ADR / Decision Log / code comments), Phase 7 (final verification + completion entry) follow per LLMP-DEC-50. | `docs-check/SKILL.md` (Steps 5/6, output template); `docs-discovery/SKILL.md` (Archive section example + new "Cross-repo ID search" section); `docs-archive/SKILL.md` (year-derivation example + Status vocabulary alignment); `adr-author/SKILL.md` (Step 8 #4 follow-up TODO format); `adr-author/references/ADR_TEMPLATE.md` (Related TODOs/Issues placeholder) |
| LLMP-DEC-56   | 2026-04-26 | Phase 4 of ID-format migration: created `MIGRATION_ID_MAPPING.md` mapping table (79 entries surveyed and given new random `<RAND>` suffix) | Phase 4 of LLMP-DEC-50 migration — survey + planning, no existing-entry rename. Workspace-wide grep `\b[A-Z]+-[A-Z]+-[0-9]+\b` over `.md` files: 79 unique entries identified — 77 in ACCORE (BIN: 19, LOG: 21, SIG: 15, SBP: 10, TOON: 11, XCUT: 1) + 2 in ACBLAZOR (GRID: 2). Other 5 repos: 0 entries. Each ID assigned a 4-char `[A-Z0-9]` random suffix; verified within-triplet uniqueness for all 12 `<PREFIX>-<TOPIC>-<TYPE>` triplets. **Pending forward-refs documented separately**: `LOG-T-12` (referenced in `docs/AUTH/README.md` + ADR-0001 but not defined in `LOGGING_TODO.md`) and `SBP-T-9` (referenced in decorator-feature-stack ADR but not defined in `SIGNALR_BINARY_PROTOCOL_TODO.md`) — Phase 4 captures them in 'Pending forward-references' section, decision deferred to Phase 6. **Template/placeholder IDs noted**: `GRID-I-1` (MGGRID_ISSUES.md example line), `AUTH-I-N` (generic placeholder) — not migrated, reformatted alongside topic rename in Phase 5. **Original Phase 7 deletion plan** for this mapping file later revised by user — see LLMP-DEC-58. | new file: `AyCode.Core/.github/MIGRATION_ID_MAPPING.md` |
| LLMP-DEC-57   | 2026-04-26 | Phase 5 of ID-format migration: per-topic rename of all 79 existing entries from 3-component `<TOPIC>-<TYPE>-<N>` to 4-component `<PREFIX>-<TOPIC>-<TYPE>-<RAND>` format (132 edits) | Phase 5 of LLMP-DEC-50 migration — actual entry rename. Topic-by-topic execution driven by Phase 4 mapping (LLMP-DEC-56). **Strict scope**: topic-pair files (`<TOPIC>_ISSUES.md` + `<TOPIC>_TODO.md`) + sister docs in same topic folder (e.g., `BINARY/README.md`, `BINARY_SGEN.md`, `BINARY_IMPLEMENTATION.md`, `TOON_INFERENCE.md`); inter-topic body anchors deferred to Phase 6. **Per-topic edit counts**: GRID 6 (2 IDs + placeholder template reformat), XCUT 7 (1 canonical + 2 cross-ref pointer headers in BINARY_ISSUES/SIGNALR_ISSUES + intra-XCUT body anchors), SBP 11 (10 IDs + 2 intra-file body refs), TOON 14 (11 IDs + 3 sister-doc anchors), BIN 33 (19 IDs + intra-pair anchors + 2 sister docs; **prefix-collision-driven descending order** required because BIN-I-1 is substring of BIN-I-10..15), SIG 21 (15 IDs + intra-pair anchors + sister doc + malformed `#issue-02` anchor fixed), LOG 40 (21 IDs + intra-pair anchors + sister LOGGING/README; LOG-I and LOG-T both required descending order — LOG-I-1 is prefix of LOG-I-10, LOG-T-1 is prefix of LOG-T-10/11). **Replace_all=true used per (file, old-id)** with descending-suffix order for prefix-collision-prone topics. **Final intra-scope verification**: 0 bare 3-component IDs remaining in any topic-pair file or sister doc; all 79 IDs renamed to canonical 4-component format. **Inter-topic refs known-deferred to Phase 6**: cross-file body anchors targeting renamed IDs (e.g., `XCUT_ISSUES.md#xcut-i-1` from `BINARY_TODO.md`), inter-topic body uppercase IDs (e.g., 'XCUT-I-1 / BIN-T-1 have landed' in SIG-T-6 body), AUTH/ADR cross-refs. | 7 topics, ~25 files: BINARY/{ISSUES,TODO,SGEN,IMPLEMENTATION}.md; LOGGING/{ISSUES,TODO,README}.md; SIGNALR/{ISSUES,TODO,README}.md; SIGNALR_BINARY_PROTOCOL/{ISSUES,TODO}.md; TOON/{ISSUES,TODO,README,IMPLEMENTATION,INFERENCE}.md; XCUT/{ISSUES,README}.md + cross-ref pointer entries in BINARY_ISSUES.md and SIGNALR_ISSUES.md; MGGRID/{TODO,ISSUES}.md; **132 edits total** |
| LLMP-DEC-58   | 2026-04-26 | Phase 5.1 (Framework-First retightening): `.github/` registries restructured to per-repo declarations + runtime discovery; `prefix` field added to all 7 `@repo` blocks; MIGRATION_ID_MAPPING.md retention policy revised | **User-identified Framework-First violation**: `REPO_PREFIXES.md` (in AyCode.Core/Layer 0/.github/) listed all 7 prefixes including consumer-side ones — Layer 0 must not enumerate higher-layer consumers. The previous workspace-meta-tooling exception (LLMP-DEC-53 era) was over-permissive. **Principle clarified by user**: *"minden repo csak magával egyszintű vagy alacsonyabb layer-el lehet cross"* (every repo cross-references only same-level or lower layers); Framework-First applies to `.github/` tooling too, except narrow workspace-meta history (LLMP-DEC log + transient migration artifacts). Cross-layer awareness uses **runtime discovery via `own-dep-repos` walking**, not centralized listings. **Concrete changes**: (a) `REPO_PREFIXES.md` rewritten — only ACCORE listed; per-repo declaration convention documented; cross-repo wildcard search documented (`*-LOG-I-*`); LLMP exception preserved. (b) `protocol-audit/references/REPOS.md` rewritten — only AyCode.Core's own primary file listed; runtime discovery via `own-dep-repos` walk documented; file-type classification (primary/inherit) by content inspection (no central registry of files). (c) `protocol-audit/SKILL.md` updated — frontmatter description changed; Step 1 rewritten for runtime discovery; **C1 invariant 4 → 5 required fields** (added `prefix`); **C3 invariant repurposed** to `prefix` format check (was 'matches REPOS.md expectations' — circular under new design, removed). (d) `docs-check/references/TOPIC_CODES.md` rewritten — only ACCORE topics; per-repo extension convention documented (consumer-side topics live in `<repo>/.github/TOPIC_CODES.md`). (e) `AyCode.Blazor/.github/TOPIC_CODES.md` NEW — ACBLAZOR's own topic registry (just `GRID`). (f) `AyCode.Core/.github/copilot-instructions.md` Layer #126 'Exception for workspace meta-tooling' narrowed: only LLMP-DEC log + transient migration artifacts (e.g., `MIGRATION_ID_MAPPING.md`) may cross layers; all other `.github/` files follow Framework-First. (g) `prefix = "<PREFIX>"` field added to all 7 `@repo` blocks: ACCORE / ACBLAZOR / MGNOPLIB / MGNOPCORE / MGFBANKPLUG / FBANKNOP / FBANKAPP. (h) Skill text cleanup: `docs-discovery/SKILL.md` cross-repo ID search examples (replaced specific consumer-prefix references with generic placeholders + ACCORE-internal example); `docs-check/SKILL.md` topic-code selection (removed hypothetical `MGFBANKPLUG-LOG`, generic phrasing). **MIGRATION_ID_MAPPING.md retention revised**: original Phase 7 plan was 'delete this file at migration end'; user revised to **'keep with LLM-targeted 2-week deletion-review reminder'** — any LLM reading the file from 2026-05-10 onward must surface a deletion-confirmation prompt to the user. Header note added with explicit date. | 12+ files: `REPO_PREFIXES.md` rewrite; `protocol-audit/references/REPOS.md` rewrite; `protocol-audit/SKILL.md` (frontmatter + Step 1 + C1 + C3); `docs-check/references/TOPIC_CODES.md` rewrite; `AyCode.Blazor/.github/TOPIC_CODES.md` NEW; `AyCode.Core/.github/copilot-instructions.md` Layer #126; **7 × @repo blocks** in 7 copilot-instructions.md files (`prefix` field); `docs-discovery/SKILL.md` + `docs-check/SKILL.md` (consumer-prefix example cleanup); `MIGRATION_ID_MAPPING.md` (retention header) |
| LLMP-DEC-59   | 2026-04-26 | Phase 6 of ID-format migration: cross-file cross-ref cleanup completed (37 edits across 13 files); migration end state — 0 OLD-format IDs in non-exception files workspace-wide | Phase 6 of LLMP-DEC-50 migration — final cross-file cross-ref cleanup. Inter-topic body anchors and uppercase ID body refs updated per the Phase 4 mapping (LLMP-DEC-56). **Files updated** (13): topic-pair files for inter-topic anchors (`XCUT_ISSUES.md`, `LOGGING_ISSUES.md`, `LOGGING_TODO.md`, `BINARY_TODO.md`, `SIGNALR_ISSUES.md`, `SIGNALR_TODO.md`, `SIGNALR_BINARY_PROTOCOL_TODO.md`); top-level cross-ref doc `CONVENTIONS.md` (4 anchor refs); AUTH topic body refs (`docs/AUTH/README.md` + `AUTH_ISSUES.md` — LOG-I-9 / LOG-I-10 renamed); ADR cross-refs (`docs/adr/0001-user-bearer-token-flow.md` — body + anchor refs renamed; `AyCode.Services/docs/adr/0001-acbinary-decorator-feature-stack-design.md` — SBP-T-5..8 renamed); `XCUT/README.md` outdated 'How XCUT-*-N IDs are numbered' section rewritten to reflect random-suffix format. **Pending forward-refs decision** (deferred from Phase 4): `LOG-T-12` and `SBP-T-9` chose **option (b)** per the LLMP-DEC-50 migration plan — rewrite references to 'forthcoming TODO' / 'no ID assigned yet' instead of reserving placeholder IDs; ID gets assigned when the entry is actually filed in `..._TODO.md`. **Pre-existing typo fixed**: `LOGGING_TODO.md` L88 had stale anchor `SIGNALR_TODO.md#log-t-5` (path → SIGNALR_TODO.md but anchor was `log-t-5`; intent was clearly `sig-t-5`) — corrected to `SIGNALR_TODO.md#accore-sig-t-m5l6`. **Code-comment refs (`.cs` files across all 7 repos)**: 0 OLD-format IDs found via cross-repo grep — no code edits required. **Migration end state**: 0 OLD-format IDs in any non-exception file workspace-wide; 3 allowed-exception files contain remaining OLD-format references — `MIGRATION_ID_MAPPING.md` (transient lookup table, see LLMP-DEC-58 retention policy), this `LLM_PROTOCOL_DECISIONS.md` (workspace-meta history), and `REPO_PREFIXES.md` (single pedagogical 'LOG-I-5' example illustrating the OLD format collision problem — kept intentionally to motivate the prefix design). **Migration scope summary** (Phases 1-6, LLMP-DEC-53/54/55/56/57/58/59): ~270 edits across ~25-30 files; 79 IDs renamed to 4-component random-suffix format; 5 of 7 repos clean of OLD format (the 2 with the legacy mapping/history files are the documented exceptions); all sister docs and ADRs updated; `.cs` code comments clean. | 13 files: 7 topic-pair / sister docs (inter-topic body anchors); 1 top-level (`CONVENTIONS.md`); 2 AUTH docs; 2 ADRs; 1 XCUT/README format-spec rewrite; **37 edits in Phase 6**; **~270 edits across all migration phases (1-6)** |
| LLMP-DEC-60   | 2026-04-26 | `## Current protocol state (quick reference)` summary section refreshed to reflect LLMP-DEC-50..59 outcomes (ID-format migration + Framework-First retightening + 7-instruction-file workspace) | After Phases 1-6 of the ID-format migration, the top-of-file summary section (introduced by LLMP-DEC-25 as a "what's currently active" snapshot, separate from the append-only dated entry table) had become stale on multiple counts: (a) "Active as of 2026-04-24" pre-dated all the migration entries; (b) ID format section described the OLD 3-component `<TOPIC>-<TYPE>-<N>` format pre-LLMP-DEC-50; (c) instruction file count "8 total: 5 primary + 3 inherit" pre-dated LLMP-DEC-51 (`Mango.FruitBank` deletion → 7 total: 5 primary + 2 inherit); (d) skill list mentioned only 3 skills (was outdated since LLMP-DEC-43 introduced the 5-skill 2-reactive/3-user-gated matrix), used `vN.M` version labels (banned by LLMP-DEC-47), and described `protocol-audit` as reading the central `references/REPOS.md` (Phase 5.1 / LLMP-DEC-58 redesigned it for runtime discovery via `own-dep-repos` walking + content-based file-type classification); (e) Scope codes table referenced `3× inherit` and `all 8`. **Updates applied**: date → 2026-04-26; ID format → 4-component `<PREFIX>-<TOPIC>-<TYPE>-<RAND>` with `<PREFIX>` per-repo declaration + `<RAND>` random-suffix spec + LLMP exception + cross-repo prefix-wildcard search note + cross-links to REPO_PREFIXES.md and per-repo TOPIC_CODES.md; instruction file count → 7 total (5 primary + 2 inherit) with brief notes on LLMP-DEC-51/52 (Mango.FruitBank deletion + FBANKNOP re-attribution) and LLMP-DEC-58 (per-repo `prefix` field added to all 7 `@repo` blocks); agent skills → 5 skills (2 reactive pre-loaded + 3 user-gated lazy-loaded) per LLMP-DEC-43, version labels removed; `protocol-audit` description updated for Phase 5.1 runtime-discovery design + new C1/C3 invariants; scope codes table → `2× inherit` + `all 7`; new note: `.github/` files follow Framework-First (LLMP-DEC-58 narrows the previous workspace-meta-tooling exception). **Append-only governance preserved**: dated entry table (LLMP-DEC-1..60) untouched; the summary section is by design a mutable snapshot per LLMP-DEC-25 (*"the dated entries remain the source of truth for *why* each decision was made; the summary is the *what* at a glance"*). | `AyCode.Core/.github/LLM_PROTOCOL_DECISIONS.md` (`## Current protocol state` section — date L9; "Instruction files" L30-33 + 2 new bullets on `prefix` field and Framework-First; ID format L35-40; agent skills L42-45; "Scope codes" table L99-100) |
| LLMP-DEC-61   | 2026-04-26 | Phase 7 (closure) of ID-format migration: migration formally complete | Phase 7 of LLMP-DEC-50 migration — **formal closure stamp**. All 7 phases of the original LLMP-DEC-50 plan executed: Phase 1 (LLMP-DEC-53) `REPO_PREFIXES.md` registry creation; Phase 2 (LLMP-DEC-54) `TOPIC_CODES.md` 4-component update; Phase 3 (LLMP-DEC-55) skill `SKILL.md` text updates with placeholders + cross-repo glob; Phase 4 (LLMP-DEC-56) `MIGRATION_ID_MAPPING.md` survey + 79-ID random-suffix generation; Phase 5 (LLMP-DEC-57) per-topic rename across 7 topics (132 edits); Phase 5.1 (LLMP-DEC-58) Framework-First retightening of `.github/` registries + per-repo `prefix` field added to all 7 `@repo` blocks + MIGRATION_ID_MAPPING retention policy revision; Phase 6 (LLMP-DEC-59) cross-file cross-ref cleanup (37 edits, 13 files); summary refresh (LLMP-DEC-60). **Final verification confirmed in LLMP-DEC-59 + cross-checked here**: 0 OLD-format IDs in any non-exception `.md` file or `.cs` file workspace-wide; the 3 allowed-exception files (`MIGRATION_ID_MAPPING.md` transient, `LLM_PROTOCOL_DECISIONS.md` workspace-meta history, `REPO_PREFIXES.md` single pedagogical 'LOG-I-5' example) intentionally retain OLD-format references for documented reasons. **Migration totals across LLMP-DEC-53..61**: ~270 edits, ~25-30 files modified, 79 IDs renamed to 4-component random-suffix format, 7 `@repo` blocks gained `prefix` field, 12+ registry/skill files restructured for Framework-First, 1 new file (`AyCode.Blazor/.github/TOPIC_CODES.md`). **Outstanding scheduled event** (NOT new work — auto-triggered): 2026-05-10 LLM-targeted deletion-review for `MIGRATION_ID_MAPPING.md` per LLMP-DEC-58 retention policy. Any LLM reading the file from that date onward must surface a deletion-confirmation prompt to the user; the prompt text is embedded in the file's header. **Migration formally complete** as of this entry; further protocol-stack work proceeds on the 4-component foundation. | `AyCode.Core/.github/LLM_PROTOCOL_DECISIONS.md` (this entry only — closure stamp; no file edits outside the Decision Log) |
| LLMP-DEC-62   | 2026-04-26 | Three protocol-stack additions: (a) `META` topic for meta-tooling issues/TODOs; (b) docs-side Framework-First rule with bounded `CONSUMERS.md` exception; (c) `adr-author` skill complexity-aware ask-back trigger restructure | **User-driven coherent batch** addressing 3 long-tail observations from the Phase 1-6 migration: **(1) Mental tracking failure** for protocol-stack issues. The 5-skill stack + 7 repos + per-repo registries had grown complex enough that issues observed mid-session (e.g., `LOGGING_TODO.md` L88 path/anchor typo, `Current protocol state` summary staleness, `docs-check` runtime-discovery deferral, anchor-mismatch typo class) had no formal home — they either landed in LLMP-DEC entries (which are meant for closed decisions, not open issues) or got lost. **Fix**: new `META` topic registered in `TOPIC_CODES.md` (ACCORE-META-*); `META_ISSUES.md` + `META_TODO.md` created at `AyCode.Core/.github/`; seeded with 3 META-T entries from the migration's deferred items: `ACCORE-META-T-J9N4` (docs-check runtime discovery for per-repo TOPIC_CODES.md), `ACCORE-META-T-K2P7` (protocol-audit anchor-mismatch detection invariant), `ACCORE-META-T-F8R3` (Current protocol state summary auto-staleness detection). Empty-state ISSUES file with template. **(2) Docs-side Framework-First** was implicit but not codified. Phase 5.1 (LLMP-DEC-58) retightened `.github/`, but `docs/` files still allowed cross-layer references in principle. User clarified the rule extends to `docs/` AND added a **bounded consumer-awareness exception**: a single `CONSUMERS.md` per repo MAY list higher-layer consumers for change-impact assessment when working in that repo. **Fix**: new sub-bullet in `AyCode.Core/.github/copilot-instructions.md` `## Framework-First Design Principle` section after the Phase-5.1 workspace-meta-history exception paragraph; new file `AyCode.Core/CONSUMERS.md` listing the 6 known ACCORE consumers (ACBLAZOR, MGNOPLIB, MGNOPCORE, MGFBANKPLUG, FBANKNOP, FBANKAPP) with brief usage notes + change-impact lens. The `CONSUMERS.md` is the SINGLE place in ACCORE allowed to name consumer repos; other docs / code stay consumer-agnostic. Top-of-tree consumer products (FBANKNOP, FBANKAPP) need no own CONSUMERS.md. **(3) `adr-author` skill over-trigger / under-trigger.** The previous "When to invoke" section had a flat list of trigger phrases ("let's plan X", "design Y", "döntsük el Y vagy Z") that fired too liberally for trivial planning AND missed architectural intent without the explicit "ADR" keyword. User proposed a 3-tier model: explicit ADR-keyword → auto-trigger; implicit planning + complexity-sniff → ASK-BACK; trivial → no trigger. **Fix**: `adr-author/SKILL.md` `## When to invoke` section restructured into 4 sub-cases — "Explicit ADR invocation (auto-trigger)" / "Implicit planning request (ASK BACK)" / "Trivial — no ADR" / "Proactive flag (drift)". Complexity-sniff heuristics enumerated explicitly (cross-cutting, cross-repo, reversibility-low, ≥2 alternatives, vocabulary signals, re-openable, new-API). Ask-back template is bilingual (Hungarian + English). Default behaviour: ASK if complexity-sniff fires; never silently auto-invoke. **Coherence**: the 3 changes reinforce each other — META topic gives meta-tooling issues a durable home; CONSUMERS.md formalizes a Phase 5.1 implicit gap with a Framework-First-respecting design; adr-author refinement reduces over-classification of "design discussion" as ADR-worthy (which would otherwise pollute the META topic with mis-classified entries). **Self-evidence**: this very batch was tested against the new adr-author trigger logic — user said *"de most nem kell ehhez adr"* (= "no ADR needed for this") and asked for the 3 changes done in one go; the new SKILL.md flow correctly handles this as "Implicit planning + ASK BACK + user said 'no'" → no `adr-author` skill invocation, just structured execution. | new files: `AyCode.Core/.github/META_ISSUES.md`, `AyCode.Core/.github/META_TODO.md` (3 seeded TODOs), `AyCode.Core/CONSUMERS.md`; modified: `AyCode.Core/.github/skills/docs-check/references/TOPIC_CODES.md` (META row added between XCUT and LLMP), `AyCode.Core/.github/copilot-instructions.md` (Framework-First section sub-bullet for docs-side rule + CONSUMERS.md exception), `AyCode.Core/.github/skills/adr-author/SKILL.md` (`## When to invoke` section restructured into 4 sub-cases) |
| LLMP-DEC-63   | 2026-04-26 | Filed 7 META-TODO entries from cross-source improvement review (3 parallel Copilot reviews + own analysis); codified workspace cost-function principle: **correctness > token-economy** | **User-initiated meta-review of protocol-stack improvement opportunities**, surfaced via 3 parallel Copilot session reviews after the LLMP-DEC-62 batch landed. The reviewers proposed ~17 candidate improvements across docs structure, skill behaviour, ADR governance. Cross-source convergence analysis (3-of-3, 2-of-3, 1-of-3, already-covered) identified genuine signal vs. individual ideas vs. overengineering. **User reframing of the cost function** — the reviewers' suggestions implicitly assumed "minimize tokens" as calibration goal, but user clarified: *"felesleges kör költsége >> tokenköltség. inkább több, mint hibás."* (wasted-round cost dominates token cost; prefer broader loading over wrong-answer-then-retry). This **extends the existing amortization principle (LLMP-DEC-43) from session-start-only to per-turn decisions** — every turn faces (a) read-then-answer vs. (b) guess-then-maybe-be-wrong; default toward (a). **7 new META-TODO entries filed** in `META_TODO.md` (LLMP-DEC-62's `META` topic infrastructure proven useful in its first week of existence): `ACCORE-META-T-M5T8` (TL;DR / "When to read" blocks on topic READMEs — 3-of-3 reviewer convergence + user agreement, P2); `ACCORE-META-T-Y4Q9` (Hot-path / Fast-path tagging — single-source, **recalibrated to P3** by user reframing because "load more" preference reduces fast-path criticality); `ACCORE-META-T-V7L2` (ADR quality lint, warning-mode not hard-fail, P3); `ACCORE-META-T-N8K3` (Last-verified-commit opt-in metadata for anti-hallucination drift detection, P3); `ACCORE-META-T-P9F4` (pre-load expansion with foundational reference docs — direct application of user reframing, P2); `ACCORE-META-T-R2W6` (workspace user-preference statement codifying "correctness > token-economy" — the meta-rule, P2); `ACCORE-META-T-C5J7` (docs-check / docs-discovery cap revisit refining LLMP-DEC-27, direct application, P3). **Implementation dependency clusters**: the P2 trio R2W6 → P9F4 → C5J7 should land together (R2W6 codifies the preference; P9F4 applies it to session-start; C5J7 applies it to skill behaviour) — half-state would be inconsistent; M5T8 → Y4Q9 are parent-child convention pair (TL;DR is the bigger signal, fast-path is finer-grained child); V7L2 + LLMP-DEC-62-era K2P7 are lint-family synergy candidates (one validates ADR structure, the other validates cross-ref anchors). **No implementation in this entry** — pure filing. The entries themselves are the actionable plan; **this LLMP-DEC documents the cost-function clarification** as a new protocol principle (which belongs in the Decision Log even before R2W6 codifies it into `copilot-instructions.md`, because the principle now governs subsequent agent behaviour as a known user preference even when the rule text isn't yet present). **Self-evidence again**: this very review — 3 Copilot reviews + user reframing → my recalibration → 7 META-T filed — exercised the LLMP-DEC-62 adr-author flow correctly: planning-language was used (`mi a véleményed`), complexity-sniff fired (≥2 alternatives, cross-cutting impact, new-API), I asked back (`Akarod hogy LLMP-DEC-63-at is felírjam`), user said yes → execute. No spurious ADR; no ad-hoc structural decision without confirmation. | `AyCode.Core/.github/META_TODO.md` (7 new entries `M5T8 / Y4Q9 / V7L2 / N8K3 / P9F4 / R2W6 / C5J7` inserted between `ACCORE-META-T-B6V2` and the TODO entry template — total META-T entries now 11) |
| LLMP-DEC-64   | 2026-04-27 | Fixed `protocol-audit/SKILL.md` C4 + X1 invariant text drift (5-skill matrix wording stale since LLMP-DEC-43); broadened `ACCORE-META-T-F8R3` scope to cover SKILL.md / registry text drift class | A parallel Claude session ran the post-Phase-5.1 `protocol-audit` skill against the workspace and surfaced **3 stale text references in `protocol-audit/SKILL.md` itself** — a positive self-evidence event for the runtime-discovery audit design (LLMP-DEC-58). All 3 share the SAME root cause: **LLMP-DEC-43** introduced the 5-skill 2-reactive/3-user-gated matrix (2 mandatory pre-loaded: `docs-discovery` + `docs-check`; 3 lazy-loaded: `protocol-audit` + `adr-author` + `docs-archive`); the `copilot-instructions.md` files (5 primary + 2 inherit) updated correctly to list all 5 skills + classification, but `protocol-audit/SKILL.md` invariant texts did not. **Drifts identified**: (i) C4 invariant text said *"all three skills"* — stale since 3-skill era; (ii) C4 expected `[LOADED_DOCS]` counts said *"4 for primary, 5 for inherit"* — stale (correct counts after LLMP-DEC-43: **3 for primary, 4 for inherit**, since 3 user-gated skills no longer pre-load); (iii) X1 invariant said *"all three bullets must be listed"* — same stale 3-skill list. **Audit impact**: the actual instruction files PASS (their `## Shared Agent Skills` now has 5 bullets, which is a SUPERSET of the stale 3-bullet check), but the invariant TEXT was misleading and would mislead future maintainers. **Patches applied**: 2 Edits to `protocol-audit/SKILL.md` — C4 rewritten to require reactive/user-gated classification + correct counts (3/4); X1 rewritten to require all 5 bullets with reactive/user-gated labels. **Broader META observation**: this is a **SKILL.md text drift class** parallel to the `Current protocol state` summary drift class previously captured in `ACCORE-META-T-F8R3`. F8R3's description was broadened (3 Edits to `META_TODO.md`) to cover BOTH classes — the auto-staleness detection (when implemented) catches `LLM_PROTOCOL_DECISIONS.md` summary drift AND any SKILL.md / registry text describing 'current state'. **Self-evidence (positive)**: the protocol-audit skill flagged its OWN SKILL.md content drift — exactly the design intent of LLMP-DEC-58 runtime-discovery audit (catches real maintenance debt). The Copilot session's report explicitly noted *"a runtime-discovery audit design (LLMP-DEC-58) is working as intended, surfacing real maintenance debt"* — independent confirmation. | `protocol-audit/SKILL.md` (C4 + X1 invariant text rewrites); `META_TODO.md` (`ACCORE-META-T-F8R3` description + parallel-drift-class section + Fix-direction options widened) |
| LLMP-DEC-65   | 2026-04-27 | Topic-code length cap raised 2-5 → 2-6 in `TOPIC_CODES.md` | Adding the new `SIGDS` topic (5 chars, fits the prior cap) prompted a forward-looking review of the topic-code length spec. The 2-5 cap originally derived from C# class-name visual-distinction concerns (≥3 to avoid `Ac*`/`Mg*` collision; ≤5 to keep IDs visually compact). User judgment: future composite topics (transport-prefixed DataSource variants, multi-domain layered topics) may benefit from one extra char of namespace headroom. Existing 9 ACCORE topics max at 4 chars (XCUT, AUTH, META, LLMP, TOON) — non-breaking change. The 2-6 range still stays well below the `@repo.prefix` 4-12 char range — visually distinct. **Two edits**: `TOPIC_CODES.md` Step 1 ("(2-5 uppercase chars)" → "(2-6 uppercase chars)") and Collision-avoidance section ("are 2-5 chars" → "are 2-6 chars"). Class-name collision rule preserved (no `Ac*`/`Mg*` start). | `docs-check/references/TOPIC_CODES.md` (2 sentence-level edits — Registry maintenance Step 1 + Collision avoidance section) |
| LLMP-DEC-66   | 2026-04-27 | Created `SIGDS` topic (`SIGNALR_DATASOURCE`) — registered in `TOPIC_CODES.md`, scaffolded `AyCode.Services.Server/docs/SIGNALR_DATASOURCE/{README, SIGNALR_DATASOURCE_ISSUES, SIGNALR_DATASOURCE_TODO}.md`, relocated DataSource doc from sibling `SIGNALR/` folder, updated 15 cross-refs across AyCode.Core (9) + AyCode.Blazor (6); README rewrite incorporates 7 doc-vs-code drift fixes + Sample-placeholder Framework-First cleanup; 3 new entries (B-T4K9 / I-W2H6 / T-N5R8) | `AcSignalRDataSource` is conceptually a **client-server DataSource** (change tracking, rollback, sync state, lifecycle events, `IList<T>` wrapper) — the SignalR transport is one current implementation detail, not the topic's defining identity. Previous placement under the `SIG` topic conflated transport concerns with state-management concerns. **Topic chosen**: `SIGDS` (5 chars, within the 2-6 cap raised in LLMP-DEC-65) — `SIG` prefix preserves "SignalR-coupled DataSource" identity (distinguishes from any future `RESTDS`, `GRPCDS` etc.); `DS` suffix is the universal DataSource shorthand. **Topic name**: `SIGNALR_DATASOURCE` (matches existing `SIGNALR_BINARY_PROTOCOL` uppercase+underscore convention). **Folder migration**: `AyCode.Services.Server/docs/SIGNALR/SIGNALR_DATASOURCE.md` → `AyCode.Services.Server/docs/SIGNALR_DATASOURCE/README.md` (folder + paired `SIGNALR_DATASOURCE_ISSUES.md` + `SIGNALR_DATASOURCE_TODO.md`). **README content rewrite** incorporates 7 doc-vs-code drift fixes identified in pre-migration code review: (a) abstract class declaration explicit + subclassing example; (b) `SerializerType` property + JSON/GZip path documented; (c) full `LoadDataSource*` overload set including in-memory `LoadDataSource(TIList fromSource, ...)`; (d) fallback re-serialize path in `LoadDataSourceFromResponseData`; (e) missing public methods enumerated — `AddRange`, `TryRemove`, `TryGetValue`, `TryGetIndex`, `AsReadOnly`, `BinarySearch`; (f) `TrackingState.Get` added to event/state values; (g) `TryRollbackItem(id, out originalValue)` signature shown. **Framework-First cleanup**: replaced consumer-leaking `Order*` placeholder (`OrderGetAll = 300`, etc.) with domain-agnostic `Sample*` (`SampleGetAll = 300`, etc.) — Layer 0 doc no longer references consumer domain types. **Cross-ref updates** (15 references): `AyCode.Core/.github/copilot-instructions.md` Layer #151; `AyCode.Core/README.md` doc-folder table cell; `docs/GLOSSARY.md`; `docs/CONVENTIONS.md`; `AyCode.Services/SignalRs/README.md`; `AyCode.Services.Server/SignalRs/README.md`; `AyCode.Services.Server/README.md`; `AyCode.Services.Server/docs/SIGNALR/README.md` (relative cross-ref `SIGNALR_DATASOURCE.md` → `../SIGNALR_DATASOURCE/README.md`); `AyCode.Services/docs/SIGNALR/README.md`; AyCode.Blazor: `docs/GLOSSARY.md` (×2 same path), `MGGRID/README.md` (×2 same path), `MGGRID/MGGRID_DATASOURCE.md`, `MGGRID/MGGRID_PARAMETERS.md`. **3 new entries**: `ACCORE-SIGDS-B-T4K9` (SaveChangesAsync inner Task drop), `ACCORE-SIGDS-I-W2H6` (BinarySearch NotImpl), `ACCORE-SIGDS-T-N5R8` (ChangeTracking Dictionary perf refactor — pre-existing `//TODO: Dictionary... - J.` comment). **Existing `ACCORE-SIG-I-T7S2`** (GetAll raw byte[] for populate/merge) stays in `SIGNALR_ISSUES.md` per append-only ID rule — its body has cross-cutting transport+DataSource concerns, naturally lives under `SIG`; the new `SIGNALR_DATASOURCE_ISSUES.md` opens with a cross-ref pointer to it. | `docs-check/references/TOPIC_CODES.md` (new `SIGDS` row inserted between `SBP` and `BIN`); 3 new files: `AyCode.Services.Server/docs/SIGNALR_DATASOURCE/README.md`, `SIGNALR_DATASOURCE_ISSUES.md`, `SIGNALR_DATASOURCE_TODO.md`; deleted: `AyCode.Services.Server/docs/SIGNALR/SIGNALR_DATASOURCE.md`; modified: 15 cross-ref locations across `AyCode.Core` (9 files) + `AyCode.Blazor` (4 files, 6 occurrences) |
| LLMP-DEC-67   | 2026-04-27 | Decision Log retention policy revised: **last-15-active rolling window + year-month bucket archives** (supersedes LLMP-DEC-25's "annual at ~50"); first archive operation executed (LLMP-DEC-1..52 → `LLM_PROTOCOL_DECISIONS_2026_04.md`); `docs-archive/SKILL.md` Rule A + Rule B refactor | **User-driven policy revision triggered by acute pain**: this `LLM_PROTOCOL_DECISIONS.md` file had grown past 25K tokens (multiple LLM sessions flagged the size as routine pre-load cost). The original LLMP-DEC-25 archival plan ("annual split at ~50 entries") was set when the protocol stack was nascent and entry velocity low. The April 2026 ID-format migration (LLMP-DEC-50..63 batch) generated 14 entries in 2 days; year-bucket archives would still grow into 100+-entry monsters during similar future high-velocity periods. **Two coordinated changes** based on user input *("inkább csak az utolsó 10 [→ 15] active entry-t tartsuk meg, többit archiválni; year+month bucket year helyett")*: **(A) Retention rule shift**: from "annual at ~50" to **last-N-active rolling window + year-month bucket archives**, where N = 15 (compromise between user's initial "10" suggestion and the migration-batch size of 14 entries — 15 keeps a complete recent initiative + buffer). **(B) Bucket granularity shift**: from `*_<year>.md` to `*_<YYYY>_<MM>.md`. Sparse files OK — only month-buckets containing archived entries get a file. Year-month scales for high-velocity periods (a heavy month produces a manageable file, a quiet month produces no file). **First archive operation**: LLMP-DEC-1..52 (2026-04-20 through 2026-04-26) moved to `LLM_PROTOCOL_DECISIONS_2026_04.md`. Active log now contains LLMP-DEC-53..67 (15 entries). **Second-pass archive note**: parallel sessions added LLMP-DEC-65 (topic-code length cap raise) and LLMP-DEC-66 (SIGDS topic creation) AFTER my drift-fix LLMP-DEC-64 but BEFORE this entry; the policy entry was originally planned as LLMP-DEC-65, became 67. The archive operation extended from 49 entries (LLMP-DEC-1..49) to 52 (LLMP-DEC-1..52) to maintain strict 15-cap at this entry's commit (without LLMP-DEC-50/51/52 archived too, active count would have been 18). **Cross-link integrity**: archive file is on-disk, on-demand readable; references from active entries to archived IDs (e.g., LLMP-DEC-58 references LLMP-DEC-43, LLMP-DEC-50) work — readers open the archive when following a link. IDs are append-only and stable across active ↔ archive boundaries. **Foundational decisions preserved**: the `## Current protocol state (quick reference)` summary at the top of the active file (introduced by LLMP-DEC-25, refreshed by LLMP-DEC-60) stays unchanged — survives all archiving. Foundational decisions (Rules #1-6, ID format spec, governance, etc.) reachable via the summary even when their dated entries are archived. **`docs-archive/SKILL.md` updates** (6 edits): frontmatter description rewritten; intro rewritten; `## Archive criterion (single rule)` restructured into `## Archive criteria (two rules)` with Rule A (Status-based for ISSUES/TODO) + Rule B (Last-15-active for DEC log) + "Why two rules" rationale; Step 4 updated to year-month bucket + sparse-files clause; pointer block example updated; Step 7 fully rewritten. **Governance section in summary** updated: LLMP-DEC-25-era "Archive annually at ~50" bullet replaced with "Last-15-active + year-month bucket" wording, cross-linking LLMP-DEC-67. **Active entry count = 15** — next archive triggers at LLMP-DEC-68 (LLMP-DEC-53 would rotate). | new file: `AyCode.Core/.github/LLM_PROTOCOL_DECISIONS_2026_04.md` (52 entries); modified: `AyCode.Core/.github/LLM_PROTOCOL_DECISIONS.md` (entries 1..52 removed via two sed passes; pointer block added + updated; governance bullet rewritten); `AyCode.Core/.github/skills/docs-archive/SKILL.md` (6 edits) |
| LLMP-DEC-68   | 2026-06-07 | SIGDS phase 2 (code side): relocated `AcSignalRDataSource` + `TrackingItemHelpers` (`AyCode.Services.Server` → `AyCode.Services`) + removed orphan `SignalR.Core 1.2.0` from `AyCode.Blazor.Components` → unblocked WASM AOT for Blazor WebAssembly consumers; closes `ACCORE-SIGDS-T-D9F2` | Completes the code side of LLMP-DEC-66 (which moved only the SIGDS docs). **Symptom**: `FruitBankHybrid.Web.Client` (InteractiveWebAssembly) could not AOT-publish — Mono AOT cross-compiler crashed (`exit -1073741819`) precompiling `Microsoft.AspNetCore.SignalR.Core.dll` (`HubCallerContext.get_Features` → missing `Http.Features 2.x`). **Two root sources**: (1) `AcSignalRDataSource` lived in `AyCode.Services.Server` — a server assembly whose graph pulls `SignalR.Core` + `AyCode.Database`/`KeyDerivation`/`SendGrid` (none WASM-compatible) — forcing every WASM consumer to reference it; (2) an **orphan `Microsoft.AspNetCore.SignalR.Core 1.2.0`** (netstandard2.0 server-hub) `PackageReference` in `AyCode.Blazor.Components.csproj`, unused by code. JIT-WASM tolerated both (lazy load); AOT compiles all assemblies eagerly → crash. **Fix**: (a) `git mv` both files to `AyCode.Services/SignalRs/`, namespace `…Server.SignalRs` → `AyCode.Services.SignalRs` (zero server-only deps; dropped stray `Castle.Core.Logging` using); (b) removed the `SignalR.Core 1.2.0` package; (c) cleaned `.Server` DLL refs from Web.Client/Shared/Components csproj; (d) updated consumer usings; (e) `RunAOTCompilation=true` on Web.Client. **Verified**: AOT-input 175→165 assemblies, `SignalR.Core` gone, publish green (`[164/164]` AOT + emcc link). **Server stays JIT** (IIS in-process compatible — server Native AOT was never the goal; only the browser-WASM client AOTs, the user-observed ~2-3× deserialize speedup). **TourIAm consumer intentionally NOT updated** (per user — its build breaks until separately fixed). | moved: `AyCode.Services/SignalRs/{AcSignalRDataSource,TrackingItemHelpers}.cs` + `AyCode.Services/docs/SIGNALR_DATASOURCE/` folder; modified: `AyCode.Blazor.Components.csproj` (SignalR.Core 1.2.0 + Services.Server ref removed), `MgGridBase.cs`/`MgGridSignalRDataSource.cs` usings; `FruitBankHybrid.Web.Client.csproj` (5 `.Server` refs removed, AOT on), `FruitBankHybrid.Shared.csproj` (Services.Server ref removed) + 3 Shared usings; `TOPIC_CODES.md` SIGDS path; `SIGNALR_DATASOURCE_TODO.md` (closed). **Doc-link cross-refs (~18) pending** — mechanical path rewrite, follow-up doc-sync. **Rolling-window**: per LLMP-DEC-67 this entry rotates LLMP-DEC-53 → archive on next `docs-archive` run. |
| LLMP-DEC-69   | 2026-07-08 | New repo joined the workspace: **GiaApp** (`GIAAPP`, product, Layer 2) — GPS ↔ worksheet reconciliation app on AyCode.Core + AyCode.Blazor; protocol docs scaffolded; `CONSUMERS.md` maps updated (ACCORE row added, ACBLAZOR file created) | 8th workspace repo (6th primary-rules file). **GiaApp**: Blazor Server (.NET 10) app matching field-service worksheet entries against GPS stops (~90 workers; import → stop-formation → geocoding → matching → approve/deny → justification workflow → month closure). Consumes AyCode.Core (entities/user-stack/`AcDalBase` data layer/logging) + AyCode.Blazor (MgGrid admin UI); does NOT use the SignalR binary transport or `MgGridSignalRDataSource` (server-side data binding); AcBinary/Toon + compression available where useful. **Amended 2026-07-09**: superseded same-day by the hybrid-concept update in the GiaApp analysis doc — app-level SignalR hubs DO use the base `AcBinaryHubProtocol` (`Bytes` mode, typed hub methods); only the tag-based client–server layer (`AcSignalRClientBase` / `AcWebSignalRHubBase` / `AcSignalRDataSource` / `AyCodeBinaryHubProtocol`) stays unused (analysis-doc decisions 13–14). **Prefix**: `GIAAPP` per `REPO_PREFIXES.md` "Picking a prefix" workflow (≥4 chars, no `Ac*`/`Mg*` collision, declared in `@repo` block). **Scaffolding**: `.github/copilot-instructions.md` (canonical Rules #1-6 copy from the FBANKAPP template — the pre-existing raw clone contained FruitBank domain rules + FBANKAPP prefix, fully replaced with GiaApp domain/technical rules from `docs/GPS-Munkalap-egyeztetes_elemzes-adatmodell-terv.md`); `.github/TOPIC_CODES.md` (empty per-repo registry, GIAAPP header); `docs/README.md` (navigation index); `docs/CONVENTIONS.md` (framework pointers + no-class-prefix product rule + XML Documentation section). **Consumer maps**: `AyCode.Core/CONSUMERS.md` — GIAAPP row added (7 consumers); `AyCode.Blazor/CONSUMERS.md` — NEW file (first ACBLAZOR consumer map: FBANKAPP + GIAAPP) per the LLMP-DEC-62 bounded-exception pattern. **Known follow-up**: protocol-audit scope texts say "all 5 repos" / "5 primary + 2 inherit" — with GiaApp it is 6 primary + 2 inherit; count-text refresh is a separate cross-repo pass (META-TODO candidate). | new: `GiaApp/.github/copilot-instructions.md` (rewrite), `GiaApp/.github/TOPIC_CODES.md` (rewrite), `GiaApp/docs/README.md`, `GiaApp/docs/CONVENTIONS.md`, `AyCode.Blazor/CONSUMERS.md`; modified: `AyCode.Core/CONSUMERS.md` (GIAAPP row + count), `GiaApp/docs/GPS-Munkalap-egyeztetes_elemzes-adatmodell-terv.md` (§3.1 "NEM használjuk" row narrowed to SignalR-only per user decision) |
| LLMP-DEC-70   | 2026-07-13 | Onboarded the **OpenAI Codex app** as a third coding agent: added `AGENTS.md` bootstrap files to all 6 primary repos (mirrors `CLAUDE.md`; Codex tool-mapping = shell + `apply_patch`) | A colleague started using the **Codex app** (OpenAI desktop app). It auto-loads `AGENTS.md` at the repo root (cascading by directory depth; the global `~/.codex/AGENTS.md` is not reliably injected into project chat context per a known open issue — so the **repo-root `AGENTS.md`** is the dependable vehicle, which also matches our per-repo `CLAUDE.md` pattern). **`AGENTS.md` is the Codex equivalent of `CLAUDE.md`** — a per-agent "bootstrap door" into the canonical shared protocol. **The single source of truth stays `.github/copilot-instructions.md`** — unchanged; the new files only tell Codex to read it first and how to map the protocol's Copilot tool-name verbs. **Content mirrors `CLAUDE.md` verbatim** (which is byte-identical across all 6 primary repos) **except two spots**: (a) the `## Tool mapping` section — Codex has no named `Read`/`Grep`/`Edit` tools, it works through its **shell** (`cat` / `sed -n` / `rg`) + **`apply_patch`**, so `get_file`/`file_search` → shell read/list, `code_search`/`find_symbol` → `rg`, `edit_file`/`create_file` → `apply_patch`; (b) the closing line reads "apply equally to Codex". **The behavioral rules are agent-neutral and carry over unchanged**: the mandatory `[LOADED_DOCS: ...]` first-line prefix on EVERY response (Rule #1 — the linchpin, and the riskiest discipline to get a third agent to honor consistently, as it was for Copilot), hard-gate (docs before code), no-re-read, context recovery, explicit consent. **Scope**: the 6 repos that carry `CLAUDE.md` (ACCORE, ACBLAZOR, MGNOPLIB, FBANKNOP, FBANKAPP, GIAAPP) each got an `AGENTS.md`; the 2 inherit repos (Mango.Nop.Core, Nop.Plugin.Misc.AIPlugin) have neither `CLAUDE.md` nor `AGENTS.md` — existing asymmetry preserved (they bootstrap via the inherit-style `copilot-instructions.md` pointer to ACCORE). **NOT touched (deliberate)**: the 5 skills' `compatibility:` frontmatter (still say "Claude Code and GitHub Copilot") and `protocol-audit`'s tool-mapping reference to "the active repo's `CLAUDE.md`" — these are descriptive-only metadata with zero behavioral impact; left unedited to respect the skill-stability boundary the user set earlier ("a skill-ekhez ne nyúlj, ezek most működnek"). **Known follow-up (META-TODO candidate)**: extend the 5 skill `compatibility:` lines + the `protocol-audit` tool-mapping reference + any future CLAUDE.md-presence audit invariant to also name/verify `AGENTS.md`; cosmetic, batchable. | new files: `AGENTS.md` × 6 (`AyCode.Core`, `AyCode.Blazor`, `Mango.Nop Libraries`, `FruitBank`, `FruitBankHybridApp`, `GiaApp`); `AyCode.Core/.github/LLM_PROTOCOL_DECISIONS.md` (this entry) |

## Known follow-ups

*(No open follow-ups. All items from previous audits resolved — see dated entries above for fix history.)*

## Notes

- Dates before 2026-04-24 are retroactive reconstructions from session history; intra-day ordering is approximate.
- For precise attribution of individual file changes, consult the git history of the affected files.
- This log is a **summary** artifact — it records the decision and its rationale, not the full diff.
