# MGF Standards Conformance — mgf-standard

> **Rules CFM-01..04 / DOC-15.** Declares this project's conformance level
> and audits the rule families. Template:
> [`../recipes/mgf-standards-conformance-md-template.md`](../recipes/mgf-standards-conformance-md-template.md).

## Declared level: **L2 — Standard**

Conforms to every **MUST** rule. (`mgf-common`, the reference
implementation, holds L3; this repo is documentation + a tiny data package,
so L2 is the right bar.)

`mgf-standard` is unusual — it **hosts** the standards it conforms to. A
full **per-MUST depth audit (§6) is complete (2026-06-14)** —
**121 ✅ · 103 N/A · 1 🚫** across all 22 families. The single 🚫 is the
deliberate TS-23 carve-out. (AG-03 — a commit-trailer slip on a few of this
session's commits — was closed by a `prepare-commit-msg` hook that now
mechanically enforces the signoff; history not rewritten.) It was **not** a
rubber-stamp: the audit surfaced and closed **four real findings** —
AP-10 (`PUBLIC_API.md` + sync test), SC-15 (path traversal → shipped as
**0.1.56**), TS-21 (smoke layer), DOC-03 (archive README) — and **four
scaffold completeness gaps** (AG-17/18, REL-10..13, WF-13). Most remaining
rules are N/A (no logging/config/service/deploy/UI surface in a pure data
package) or trivially ✅; the `file:line` evidence lives in §6.

## Shape

- **Kind:** federation member — the standards / contract / registry source
  of truth + a tiny zero-dependency data package (`mgf.standard`).
- **Public surface:** `standards_dir` / `list_standards` / `read_standard`,
  `recipes_dir` / `list_recipes` / `read_recipe`, `libraries`
  + `__version__` (typed; `py.typed` shipped).
- **Gates:** ruff · ruff-format · mypy --strict · pytest · import-linter.

## Per-family summary

| Family | Status | Note |
|---|---|---|
| DP — design | ✅ | Pure-stdlib leaf; `.importlinter` pins "imports nothing `mgf.*`". Depth-audited 2026-06-14 (DP-01..13 in §6): **7 ✅ / 6 N/A**. |
| AP — API | ✅ | Depth-audited 2026-06-14 (AP-01..16): 13 ✅ / 3 N/A. ✅ `__all__` + `py.typed` + SemVer + the AP-13 version-coherence gate + `PUBLIC_API.md` w/ tiers + the AP-10 sync test (the AP-10/AP-11 gap found in this audit was closed same day). N/A AP-04/AP-15 (no deprecations/shims), AP-16 (not a mgf-common consumer). |
| DOC — docs | ✅ | Universal root-doc baseline shipped; OWNS the corpus + `FEDERATION.md`. Depth-audited 2026-06-14 (DOC-01..19 in §6): 17 ✅ / 1 N/A / 1 N/A — `docs/archive/README.md` added to close a DOC-03 bucket-charter gap. |
| AG — agents | ✅ | Depth-audited 2026-06-14 (AG-01..18 in §6): 17 ✅ / 1 N/A (AG-16). The AG-03 trailer slip is now mechanically enforced by `.githooks/prepare-commit-msg` (PR #113). AG-17/AG-18 rows added (were missing from the scaffold). |
| SC — security | ✅ | Depth-audited 2026-06-14 (SC-01..18 in §6): 8 ✅ / 10 N/A. No secrets / no runtime attack surface; gitleaks + pip-audit gates; `SECURITY.md`. The SC-15 traversal gap found in this audit was fixed in 0.1.56 (`_is_unsafe_stem` + `test_path_traversal.py`). |
| REL — release | ✅ | Depth-audited 2026-06-14 (REL-01..13 in §6): 10 ✅ / 3 N/A. Annotated tags + tag-coherence gate, ordered publish flow, wheel smoke, REL-13 consistency gate (owned here). REL-10/11/12 N/A (cohort-walk is the supervisor's). _(REL-10..13 rows added — were missing.)_ |
| PKG — packaging | ✅ | Depth-audited 2026-06-14 (PKG-01..12 in §6): **12 ✅**. devpi-only publish/resolve (`magogi/prod`), tag-driven CI, `+simple/` verify, non-volatile immutability. PKG-12 ✅ — the `no-pypi-surface` gate is cornerstone-only by the federation generator; this leaf's woodpecker correctly omits it (generation-current). |
| WF — CI/workflows | ✅ | Depth-audited 2026-06-14 (WF-01..13 in §6): **13 ✅**. Generated four-gate `.woodpecker.yml` (lint/typecheck/test/import-linter) + tag-driven devpi publish (coherence → smoke → publish → verify-devpi); pinned images; WF-13 generation-current. _(WF-13 row added — was missing.)_ |
| NM — naming | ✅ | `mgf-standard` (hyphens) → `mgf.standard` (NM-01/02). |
| TS — testing | ⚪ 12 ✅ / 15 N/A / 🚫 TS-23 | Depth-audited 2026-06-14 (TS-01..28 in §6). Plain pytest, offline, filterwarnings=error, strict markers/config, coverage≥80, smoke layer (TS-21). **TS-23 declined** (carve-out below — supervisor would close a dep cycle); the supervisor-family rules (TS-22/24/25/27/28) N/A under it. The TS-21 gap found in this audit was fixed same day. |
| LG / CF | N/A | No logging / config surface (data package). Depth-audited 2026-06-14 (LG-01..17 + CF-01..12 in §6): all 29 N/A — no `logging.getLogger`, no `Settings`, no config/env reads in `src/` (grep-confirmed). |
| EH — errors | ⚪ mostly N/A | Depth-audited 2026-06-14 (EH-01..13 in §6): **3 ✅ / 10 N/A**. EH-02/07/09 ✅ at the resolution boundary; EH-01 + the rest N/A — no `AppError` hierarchy by design (leaf with zero `mgf-*` deps; raises stdlib `FileNotFoundError`). |
| TM / PF / OB / GUI | N/A | Data package + accessors: no datetime/duration logic, no perf budgets, no observability emission, no GUI surface. |
| OP — operability | ✅ | Depth-audited 2026-06-14 (OP-01..12): 2 ✅ (OP-03 URLs resolve, OP-04 no stale headline facts) / 10 N/A (no CLI/service/state surface). |
| DEP — deployment | N/A | Depth-audited 2026-06-14 (DEP-01..11): all N/A — a library, not a deployed service (web-service-consumer scope). |
| PR — presentation | ✅ | Depth-audited 2026-06-14 (PR-01/03/04/05/07): 2 ✅ (PR-01 no UI imports, PR-07 taxonomy-classified) / 3 N/A. |
| FB — feedback | ✅ | Cross-repo feedback via the `pending-feedback/<target>.md` outbox + supervisor relay (FB-01..05, FB-05 a MUST since 0.1.51); relayed PAPER-101 to mgf-common. |
| SP — scope | ✅ | Depth-audited 2026-06-14 (SP-01..06 in §6): 5 ✅ / 1 N/A. `SCOPE.md` publishes IN + OUT lists, each cut naming its delegate. |

## 🚫 Declined-with-rationale (CFM-04)

**TS-23 — "a stdlib-only test supervisor MUST drive every CI run."**
Declined for this repo. Adopting `mgf-test-supervisor` would add the edge
`mgf-standard → mgf-test-supervisor`, and since
`mgf-test-supervisor → mgf-common → mgf-standard`, that closes a
dependency **cycle** the REL-13 registry generator records (it reads
`mgf-*` deps from optional groups). This repo's test surface is trivial
(the `mgf.standard` resolver + the moved registry-generator test), so
the supervisor's value here is marginal while the cost (a cyclic registry +
resolution friction) is real. We run plain `pytest` and keep
`mgf-standard` a pure leaf with zero `mgf-*` deps. Framed per
[`../standards/principles/non-adoption-is-valid.md`](../standards/principles/non-adoption-is-valid.md)
(conscious decline + documented rationale + this entry).

> **Audit granularity.** The per-family summary above is the high-level
> rollup; the **per-MUST §6 enumeration below is the substantive record** —
> every MUST audited individually with `file:line` evidence (depth audit
> complete 2026-06-14, no `⏳` remaining). All **22 indexed families** are
> covered. (The earlier family-level-only pass was superseded by the full
> per-rule audit.) Note the doctor does not gate this repo — it ships the
> very corpus the doctor reads.

---

## Findings log (depth audit)

Findings surfaced by the per-MUST depth audit (§6) — MUSTs that applied
and were unmet, with their resolution.

| Finding | Rules | Status |
|---|---|---|
| No `PUBLIC_API.md` + no per-name stability tiers + no AP-10 sync test (the repo shipped `PUBLIC_API.json` only, while this repo's own `docs/design/federation.md:187-198,316-317` requires the `.md` + the sync test of every sibling). | AP-10, AP-11 | ✅ **Resolved 2026-06-14** — added `PUBLIC_API.md` (13 names, tier + description) + `tests/unit/test_public_api_doc.py` (the `__all__` ⇄ `.json` ⇄ `.md` pin). |
| `docs/archive/` (a long-lived bucket; gained a `2026/` subtree this session) had no charter `README.md`. | DOC-03 | ✅ **Resolved 2026-06-14** — added `docs/archive/README.md` (charter + index). |
| Several 2026-06-14 agent commits (the registry + conformance-audit PRs) were authored via `git commit -m` and carry only `Co-Authored-By:`, omitting the AG-03-required `Signed-off-by: Bassam Alsanie` (the `.gitmessage`/`commit.template` was bypassed by `-m`). | AG-03 | ✅ **Resolved 2026-06-14 (PR #113).** Added `.githooks/prepare-commit-msg` (wired via `core.hooksPath`) — auto-adds the human signoff on every commit incl. `-m`, idempotently. The bypass gap is closed; subsequent commits carry both trailers. Already-merged `main` history is not rewritten (published-history immutability). |
| `read_standard`/`read_recipe`/`read_design` built `dir() / f"{name}.md"` from caller-supplied `name` with no directory-traversal guard — `read_standard('../../README')` read the repo-root `README.md`, outside the corpus (confirmed by repro). | SC-15 | ✅ **Resolved 2026-06-14 (0.1.56).** Added `_is_unsafe_stem` — non-bare stems (separator / `..` / absolute) now raise `FileNotFoundError`; pinned by `tests/unit/test_path_traversal.py`. Low real-world severity but a real MUST-miss on a shipped public API. |
| `mgf-standard` is a published wheel library but ships no `tests/smoke/` layer (TS-21: imports + every `__all__` name reachable + shortest happy path, <100 ms). The CI wheel-install step imports the package but is not a runnable smoke suite a downstream can pre-flight. | TS-21 | ✅ **Resolved 2026-06-14.** Added `tests/smoke/test_smoke.py` (marker `smoke`) — the three checks in ~0.03 s. Test-only; no version bump. |
| The mandated PKG-12 `no-pypi-surface` grep gate is absent — `scripts/check_no_pypi_surface.py` is missing and `.woodpecker.yml` has no `no-pypi-surface` step. | PKG-12 | ✅ **Resolved 2026-06-14 — not a gap.** The federation generator gates this step to the cornerstone only (`mgf.fed._woodpecker.gates["no-pypi-surface"] = self.is_cornerstone`). mgf-standard is not the cornerstone, so a fresh render correctly omits it; the on-disk woodpecker is generation-current. Substance (no `mgf-*` pypi.org publish surface) independently holds. _(Minor: PKG-12's "(siblings copy)" wording reads more broadly than the cornerstone-only generator — a candidate AG-10 wording-nudge, not a conformance gap.)_ |

---

## §6 — Per-MUST completeness enumeration (CFM-03)

> Appended 2026-06-07 by the federation conformance-completeness pass so this
> ledger accounts for **every** current MUST (CFM-03 / DOC-15) — making
> `mgf-fed app-doctor --standards` GREEN on completeness.
>
> **Depth audit COMPLETE (2026-06-14).** Every row below has been genuinely
> audited with `file:line` evidence — no `⏳` remain. All 22 families covered:
> **DP, EH, AP, SP, DOC, AG, SC, TS, PKG, REL, LG, CF, WF, OP, DEP, PR** per-MUST,
> plus TM/PF/OB/NM/GUI/FB at family level. Tally: **121 ✅ · 103 N/A · 1 🚫**
> (TS-23 declined-with-rationale, CFM-04). (AG-03's session trailer slip was
> closed by the `prepare-commit-msg` hook — see Findings log.) The audit fixed
> four findings (AP-10 `PUBLIC_API.md`, SC-15 traversal → 0.1.56, TS-21 smoke
> layer, DOC-03 archive README) and four scaffold completeness gaps (AG-17/18,
> REL-10..13, WF-13). The family-level audit in the sections above remains the
> high-level record; the Findings log captures what was surfaced + resolved.

| Rule | Standard | Status | Note |
|---|---|---|---|
| DP-01 | DESIGN_PRINCIPLES | ✅ | Federation-leaf layering enforced by `.importlinter` (`standard-is-the-federation-leaf`; CI runs `lint-imports`); imports are pure-stdlib only (`__init__.py:42-47`). No UI/core or third-party-SDK split exists to lint. |
| DP-02 | DESIGN_PRINCIPLES | N/A | No third-party I/O dependency — stdlib only (`importlib.resources`/`json`/`pathlib`); nothing to place behind a provider ABC. |
| DP-03 | DESIGN_PRINCIPLES | N/A | Single-module data accessor; no domain-identity types cross an internal module boundary (accessors return plain `str`/`Path`/`list` data, not identity objects). |
| DP-04 | DESIGN_PRINCIPLES | ✅ | Every public + private fn fully annotated (e.g. `read_standard(name: str) -> str` `:140`); `mypy --strict` is a CI gate (`pyproject.toml:146`); `Any` appears only for parsed-JSON registry values (`:315`), the honest type for arbitrary JSON. |
| DP-05 | DESIGN_PRINCIPLES | ✅ | `tests/unit/` run fully offline — local file reads only, no credentials/network/daemon; the 1:1 mirror is proportionate to a one-module package. |
| DP-06 | DESIGN_PRINCIPLES | ✅ | Review-enforced (the §10 self-review checklist + the PR test-plan template); runtime surface is minimal — no attack surface, no I/O beyond local doc reads. |
| DP-07 | DESIGN_PRINCIPLES | ✅ | Module docstring + all 9 public fns carry intent/invariant docstrings (`:1-40`, `:118-369`); inline comments are why-comments (`:89-91`, `:104-105`), no what-comments. |
| DP-08 | DESIGN_PRINCIPLES | N/A | SHOULD; no major replaceable external component (no GUI/DB/hypervisor). The only swap-like concern — wheel vs editable data resolution — is documented in `_docs_data_dir` (`:77-84`). |
| DP-09 | DESIGN_PRINCIPLES | N/A | No long-running operations — every accessor is a synchronous, immediate file read. |
| DP-10 | DESIGN_PRINCIPLES | ✅ | The sole fallback is the wheel→editable data-resolution order: documented (`:77-84`), the active path is queryable (`standards_dir()` returns the resolved `Path`), and exhausting it hard-fails with `FileNotFoundError` (`:111`) — never a silent behavioral fallback. |
| EH-01 | ERROR_HANDLING | N/A | No `AppError` hierarchy by design — a pure leaf with zero `mgf-*` deps cannot import `mgf.common.exceptions` without re-forming the very cycle this package exists to avoid (same leaf rationale as the TS-23 carve-out). Raises idiomatic stdlib `FileNotFoundError` for missing data, documented in each `Raises:`. |
| EH-02 | ERROR_HANDLING | ✅ | Stdlib resolution exceptions are caught at the resolver boundary (`:94,:101,:271,:298`) and normalized to one documented `FileNotFoundError` with an actionable message (`:111,:277,:306`). No third-party SDK exists to translate. |
| EH-03 | ERROR_HANDLING | N/A | No in-flight translation: the terminal `raise FileNotFoundError` fires *after* the resolution fallback is exhausted, with no active cause to chain via `from`. |
| EH-04 | ERROR_HANDLING | N/A | No entry point (importable data package — no CLI/`__main__`/process/thread/async). The top-level handlers live in the consumer (`mgf-common` CLI). |
| EH-05 | ERROR_HANDLING | N/A | No process entry point; crash-report + remote-sink surface lives in `mgf.common.observability`. |
| EH-06 | ERROR_HANDLING | N/A | No GUI surface. |
| EH-07 | ERROR_HANDLING | ✅ | No broad `except Exception` anywhere — all four excepts name specific stdlib types (`:94,:101,:271,:298`) and serve documented resolution-fallback paths. |
| EH-08 | ERROR_HANDLING | N/A | No custom typed exceptions (see EH-01); stdlib `FileNotFoundError` with an actionable message is the contract. |
| EH-09 | ERROR_HANDLING | ✅ | Error messages list valid alternatives / both resolution locations checked (`:155,:201,:244,:111-115`), giving the caller an actionable next step. |
| EH-10 | ERROR_HANDLING | N/A | No best-effort observer / loop / scheduler / callback surface. |
| LG-01 | LOGGING | N/A | The package never calls `logging.getLogger` — no log emission anywhere in `src/` (grep-confirmed). |
| LG-02 | LOGGING | N/A | No entry point; logging is configured by the consumer (e.g. mgf-common bootstrap), not this data package. |
| LG-03 | LOGGING | N/A | No log records / no OTel span emission. |
| LG-04 | LOGGING | N/A | No formatter or log sink to redact (and no sensitive fields handled). |
| LG-05 | LOGGING | N/A | No ERROR-level logging — the package raises stdlib `FileNotFoundError` to the caller, it does not log. |
| LG-06 | LOGGING | N/A | No logs to ship to an aggregator. |
| LG-07 | LOGGING | N/A | No GUI (gui-app scope). |
| LG-08 | LOGGING | N/A | No log messages (lazy-%-vs-f-string is moot). |
| LG-09 | LOGGING | N/A | No `extra={}` structured fields (no logging). |
| LG-10 | LOGGING | N/A | Not a headless service (service scope); no logging. |
| LG-11 | LOGGING | N/A | No operation start/end logging — trivial synchronous file reads, no boundary crossings. |
| LG-12 | LOGGING | N/A | No log emission to budget. |
| CF-01 | CONFIGURATION | N/A | No application config — the package reads no config file/env, has no `Settings` object (consumer-owned-config scope). |
| CF-02 | CONFIGURATION | N/A | No config precedence chain (no config loaded). |
| CF-03 | CONFIGURATION | N/A | No config schema/version (consumer-owned-config). |
| CF-04 | CONFIGURATION | N/A | No config-file writes (consumer-owned-config). |
| CF-05 | CONFIGURATION | N/A | No config file and no secrets handled. |
| CF-06 | CONFIGURATION | N/A | No config loading / unknown-key handling (consumer-owned-config). |
| CF-07 | CONFIGURATION | N/A | No sub-config files (hooks/schedules/etc.) (consumer-owned-config). |
| CF-08 | CONFIGURATION | N/A | No `Settings` object or entry point to inject from (consumer-owned-config). |
| CF-09 | CONFIGURATION | N/A | No `--config` CLI — the package ships no CLI (consumer-owned-config). |
| CF-10 | CONFIGURATION | N/A | No `Settings` to construct in tests. |
| CF-11 | CONFIGURATION | N/A | No config fields to rename/alias. |
| CF-12 | CONFIGURATION | N/A | No config backend variants to model as a discriminated union. |
| DP-11 | DESIGN_PRINCIPLES | N/A | No async code; `RUF006` (unawaited-task) is enabled via the `RUF` select (`pyproject.toml:121`) as a backstop. |
| DP-12 | DESIGN_PRINCIPLES | N/A | No datetime/time handling anywhere in the package. |
| DP-13 | DESIGN_PRINCIPLES | ✅ | All file access is via `Path.read_text()` (atomic open+close, `:157,:202,:246,:276,:304`) + `with as_file(...)` (`:98`); no long-lived handles/sockets/subprocesses; `SIM115` enabled via the `SIM` select. |
| LG-13 | LOGGING | N/A | No high-frequency log sites (no logging at all). |
| LG-14 | LOGGING | N/A | No correlation contextvars — no logging, no request context. |
| SC-01 | SECURITY_STANDARD | ✅ | No secrets in `src/` (grep clean); `my_stuff/` gitignored (AG-18); gitleaks CI scans tree + history (`.woodpecker.yml:90-93`). The only real secret — the publish token — is a tag-scoped CI secret, never committed. |
| SC-02 | SECURITY_STANDARD | ✅ | No subprocess in shipped `src/`. The two dev-script call sites use `argv` lists + `shell=False` (`scripts/audit_pr_conformance.py:93`, `scripts/seed_ledger_rebaseline.py:81`). |
| SC-03 | SECURITY_STANDARD | ✅ | Registry parsed with `json.loads` (`__init__.py:311`); no `yaml.load`, no `pickle` anywhere in the package. |
| SC-04 | SECURITY_STANDARD | N/A | The package writes no files (read-only accessor); the dev generators write only public artifacts (`MGF_LIBRARIES`, `rules.json`) — no private-data writes. |
| SC-05 | SECURITY_STANDARD | N/A | No cryptographic operations. |
| SC-06 | SECURITY_STANDARD | N/A | No outbound network connections. |
| SC-07 | SECURITY_STANDARD | N/A | No external requests in the shipped path (the dev `lint-imports` subprocess does carry `timeout=60`, `audit_pr_conformance.py:99`). |
| SC-08 | SECURITY_STANDARD | N/A | The accessors are consumed by trusted sibling code, not an untrusted external boundary; SC-08 places validation at the boundary (the CLI/HTTP handler), not the use case. (Defensive traversal guard tracked under SC-15.) |
| SC-09 | SECURITY_STANDARD | N/A | No logging surface to redact. |
| SC-10 | SECURITY_STANDARD | ✅ | `uv.lock` committed; CI runs `pip-audit` on every PR (`.woodpecker.yml:81-86`, one triaged ignore `CVE-2025-71176`). |
| SC-11 | SECURITY_STANDARD | ✅ | Exception messages carry only topic names + resolution paths (no secret material); no crash-reporter surface in this package. |
| SC-12 | SECURITY_STANDARD | ✅ | `SECURITY.md` present — supported versions, private report channels (email + Codeberg advisory, `SECURITY.md:34-38`), 90-day embargo, disclosure-in-CHANGELOG timeline. |
| SC-13 | SECURITY_STANDARD | N/A | No keys at rest. |
| SC-14 | SECURITY_STANDARD | N/A | No authentication surface. |
| SC-15 | SECURITY_STANDARD | ✅ | The corpus readers (`read_standard`/`read_recipe`/`read_design`) reject non-bare stems via `_is_unsafe_stem` (`__init__.py`) — a path separator, `..`, or absolute path raises `FileNotFoundError`, so a reader can only reach a file inside its corpus dir. Pinned by `tests/unit/test_path_traversal.py`. Fixed in **0.1.56** (was ⚠️). |
| SC-16 | SECURITY_STANDARD | N/A | No privileged operations (`sudo`/`setuid`/capabilities). |
| SC-17 | SECURITY_STANDARD | N/A | No security-relevant actions to audit-log (no vault/ssh/user-argv subprocess/auth) and no logging surface. |
| SC-18 | SECURITY_STANDARD | ✅ | Reproducible from a tagged commit — `hatchling.build` (`pyproject.toml:69-70`) + committed `uv.lock`; CI `smoke` step builds + installs the wheel; build metadata recorded in `CHANGELOG.md`. |
| TS-01 | TESTING | ✅ | Single-module package (`mgf/standard/__init__.py`) fully covered by `tests/unit/` (10 files — standards/recipes/design/libraries/fed-waves/rules-index/public-api/traversal seams); a formal mirror-linter is moot for one source module. |
| TS-02 | TESTING | ✅ | Unit suite runs offline — local file reads only, no credentials/network/daemon. |
| TS-03 | TESTING | ✅ | Tests isolate cleanly — no shared module-level state, no `HOME`/`XDG`/cwd leakage; no global mutation (read-only accessor). |
| TS-04 | TESTING | ✅ | `filterwarnings = ["error"]` set (`pyproject.toml [tool.pytest.ini_options]`). |
| TS-05 | TESTING | ✅ | `--strict-markers` + `--strict-config` in `addopts`. |
| TS-06 | TESTING | ✅ | `[tool.coverage.report] fail_under = 80`; CI runs `coverage run --source=src/mgf -m pytest` (`.woodpecker.yml:66`). |
| TS-07 | TESTING | N/A | No typed exception hierarchy (EH-01 leaf carve-out); the stdlib `FileNotFoundError` contract IS asserted (`test_standards.py:44` etc.). |
| TS-08 | TESTING | N/A | No third-party translation seam (EH-02); the resolution-fallback paths are covered (known + unknown stem). |
| TS-09 | TESTING | N/A | No best-effort observer loops (EH-10). |
| TS-10 | TESTING | ✅ | The mechanically-pinnable security rules are pinned — SC-15 by `tests/unit/test_path_traversal.py`; SC-01/SC-10 by the gitleaks + pip-audit CI gates. |
| TS-11 | TESTING | N/A | No GUI workers. |
| TS-12 | TESTING | N/A | No async code. |
| TS-13 | TESTING | N/A | No data round-trip (parse↔serialise) the package owns — `json.loads` is a one-way read; nothing is serialised. |
| TS-14 | TESTING | N/A | No perf budgets (PF family N/A — trivial read paths). |
| TS-15 | TESTING | N/A | No real backends to smoke against. |
| TS-16 | TESTING | ✅ | Failure messages are self-explanatory — asserts carry context (e.g. `assert topics, "standards corpus resolved empty"`). |
| TS-17 | TESTING | ✅ | No cross-package fixture imports; tests are self-contained (no `conftest.py` needed at this size). |
| TS-18 | TESTING | N/A | No test exceeds 1 s (full suite ~0.3 s); no `slow`-marked tests. |
| EH-11 | ERROR_HANDLING | N/A | No retry / external-call surface. |
| EH-12 | ERROR_HANDLING | N/A | No external write/send operations — every accessor is a pure read (idempotent trivially). |
| EH-13 | ERROR_HANDLING | N/A | No external-call surface to amplify upstream load. |
| AP-01 | API_DESIGN | ✅ | `__all__` enumerates the 13 public names (`__init__.py:49-63`), sorted; privates (`_docs_data_dir`, `_load_registry`) excluded. |
| AP-02 | API_DESIGN | ✅ | Every public name carries an intent/invariant docstring (`:118-369`) with inline usage examples (`e.g. "LOGGING"`, `:144`); the module docstring enumerates the surface (`:1-40`). |
| AP-03 | API_DESIGN | ✅ | SemVer — `version = "0.1.55"` (`pyproject.toml:3`); the 0.x MINOR-may-break window is stated in the `CHANGELOG.md` header. |
| AP-04 | API_DESIGN | N/A | No deprecated names — nothing has entered a deprecation cycle. |
| AP-05 | API_DESIGN | ✅ | Signatures stable + minimal (single `name: str` positional on the readers); additive history, no renames/removals. |
| AP-06 | API_DESIGN | ✅ | Return types pinned narrowly (`-> str`, `-> list[str]`, `-> Path`, `-> list[dict[str, Any]]`, `-> list[list[str]]`); no widening. |
| AP-07 | API_DESIGN | ✅ | Raised exceptions documented in every `Raises:` (`FileNotFoundError`); the typed-hierarchy clause carries the EH-01 leaf carve-out (stdlib `FileNotFoundError` is the contract). |
| AP-08 | API_DESIGN | ✅ | `from __future__ import annotations` (`:42`); ruff `FA` + `TCH` selected (`pyproject.toml:122`); no runtime-only type imports to gate. |
| AP-09 | API_DESIGN | ✅ | PEP 561 `py.typed` shipped (`src/mgf/standard/py.typed`). |
| AP-10 | API_DESIGN | ✅ | `PUBLIC_API.md` documents all 13 public names; kept in sync with `__all__` + `PUBLIC_API.json` by `tests/unit/test_public_api_doc.py` (the AP-10 sync test required by `docs/design/federation.md`). Closed 2026-06-14. |
| AP-11 | API_DESIGN | ✅ | Each public name carries a stability tier (`stable`) in `PUBLIC_API.md`; the tier vocabulary is documented in its header. Closed 2026-06-14 with AP-10. |
| AP-12 | API_DESIGN | ✅ | No public-API break has occurred (additive 0.x history); `CHANGELOG.md` is maintained per release and is where migration guidance would land on a break. |
| AP-13 | API_DESIGN | ✅ | `__version__ = "0.1.55"` (`:65`) mirrors the `pyproject` version; enforced by the CI `tag-coherence` step (`.woodpecker.yml:151`, cites AP-13) + `test_federation_design.py::TestVersionCoherence` (`:58-71`). |
| AP-14 | API_DESIGN | ✅ | Closed-box respected: private functions are `_`-prefixed and excluded from `__all__`; no internal submodules to leak; `.importlinter` leaf contract enforced in CI. |
| AP-15 | API_DESIGN | N/A | No back-compat shims exist. |
| AP-16 | API_DESIGN | N/A | mgf-standard does not depend on the mgf-common cornerstone (it is the standards *source*, not a runtime sibling) — the federation pin-window has no mgf-common pin here to widen. |
| SP-01 | SCOPE | ✅ | Explicit IN-scope list — `SCOPE.md` SP-02 "In scope" (corpus + accessors, registry, recipes, design docs, scaffolding template). |
| SP-02 | SCOPE | ✅ | Explicit OUT-of-scope list with reasoning — `SCOPE.md` SP-03 "Out of scope (delegated)" + SP-04 "Non-goals", each cut stating why. |
| SP-03 | SCOPE | ✅ | Review-enforced — `SCOPE.md` is the bar a new module/accessor clears (process rule; the surface is deliberately minimal). |
| SP-04 | SCOPE | N/A | No Adjacent-scope bucket declared — the surface is deliberately closed/fixed (this repo *is* the standard); nothing pending a demand signal. |
| SP-05 | SCOPE | ✅ | Each OUT-of-scope cut cites where it lives instead (→ `mgf-fed` orchestrates; `mgf-common` consumes via `[standards]`; each library implements). |
| SP-06 | SCOPE | ✅ | Revisit-on-MAJOR commitment stands; `SCOPE.md` SP-06 pins public-accessor stability via `PUBLIC_API.json` (AP-13). No MAJOR boundary reached (0.x). |
| LG-15 | LOGGING | N/A | No INFO+ lifecycle/security `event`-field logging (no logging surface). |
| LG-16 | LOGGING | N/A | No WARNING/ERROR records emitted. |
| LG-17 | LOGGING | N/A | No ERROR records to fingerprint (SHOULD; no logging). |
| TS-19 | TESTING | ✅ | Markers registered (`smoke`, `integration`) + `--strict-markers` (TS-05). _(SHOULD: defensively register `slow`/`perf` — not yet; no test uses them.)_ |
| TS-20 | TESTING | ✅ | Tests correctly partitioned — all are unit tests, all in `tests/unit/`; none mis-filed. (No `integration/`/`e2e/` because none exist; smoke layer tracked under TS-21.) |
| TS-21 | TESTING | ✅ | `tests/smoke/test_smoke.py` (marker `smoke`) verifies imports + every `__all__` name reachable + the shortest happy path of each public function, in ~0.03 s (`pytest -m smoke`). Added 2026-06-14 (was ❌). |
| TS-22 | TESTING | N/A | Tiered runs require `mgf.test_supervisor.tiers` — not adopted (the **TS-23 carve-out**: adopting the supervisor would close a dependency cycle). |
| TS-23 | TESTING | 🚫 | **Declined (CFM-04)** — see the Declined-with-rationale section above. Adopting `mgf-test-supervisor` would close a `mgf-standard → … → mgf-standard` cycle; this repo runs plain `pytest` and stays a pure leaf. |
| TS-24 | TESTING | N/A | Structured `run.jsonl` records are a supervisor feature — not adopted (TS-23 carve-out). |
| TS-25 | TESTING | N/A | Flaky-quarantine is a supervisor feature — not adopted (TS-23 carve-out). |
| TS-26 | TESTING | N/A | No compiled artifacts (pure-Python package) — TS-26 explicitly allows N/A. |
| TS-27 | TESTING | N/A | Failure-bundle assembly is a supervisor feature — not adopted (TS-23 carve-out). |
| TS-28 | TESTING | N/A | Per-test perf attribution is a supervisor feature — not adopted (TS-23 carve-out). |
| WF-01 | WORKFLOWS | ✅ | `.woodpecker.yml` runs on every push + pull_request (+ tag/manual) — `when:` event list; no local-only ship path. |
| WF-02 | WORKFLOWS | ✅ | The four gates are CI-enforced — `lint` (ruff), `typecheck` (mypy --strict), `test-3.11/12/13` (pytest), and `lint-imports` (import-linter, `.woodpecker.yml:33`). |
| WF-03 | WORKFLOWS | ✅ | Tag-driven publish to the self-hosted devpi index — the `publish` step fires only on `refs/tags/v*`. |
| WF-04 | WORKFLOWS | ✅ | Publish credential is the `devpi_password` Woodpecker **org** secret (the `magogi` account's upload password), scoped to tag-event runs; the upload user `magogi` is a literal, not a secret. |
| WF-05 | WORKFLOWS | ✅ | `tag-coherence` step aborts the run unless the `v*` tag matches `pyproject::version` AND `__version__`, before any upload. |
| WF-06 | WORKFLOWS | ✅ | `publish` uploads the wheel built by the `build` step in the same run (no reuse of a prior/local `dist/`). |
| WF-07 | WORKFLOWS | ✅ | `smoke` step installs the freshly-built wheel into an ephemeral venv and imports the package + `__version__`. |
| WF-08 | WORKFLOWS | ✅ | `verify-devpi` polls the devpi `+simple/mgf-standard/` index for the published version post-publish (`.woodpecker.yml`, inline check). |
| WF-09 | WORKFLOWS | ✅ | Every image is version-pinned — `python:3.11/3.12/3.13-slim` + `zricethezav/gitleaks:v8.30.1` (no floating `:slim`/`:latest`). |
| WF-10 | WORKFLOWS | ✅ | Independent steps run in parallel (the `test-3.x` matrix fans out); `depends_on` is used only for genuine ordering (build→publish, smoke before upload). |
| WF-11 | WORKFLOWS | ✅ | Reproducible from inputs — pinned images, declared env, deps from pinned indexes; no host-machine state. |
| WF-12 | WORKFLOWS | ✅ | Woodpecker surfaces each step's exact command + exit code + logs; `||` appears only on dependency-install fallbacks, never to swallow a gate result. |
| WF-13 | WORKFLOWS | ✅ | `.woodpecker.yml` is a generated artifact (`policy.toml woodpecker_generated = true`; mgf-standard not in `[exempt].woodpecker`); all 13 `woodpecker_required_steps` present + matching, and the cornerstone-only `no-pypi-surface` step is correctly omitted (PKG-12). `mgf-fed drift-check` is the mechanical generation-currency gate. _(Row added 2026-06-14 — was missing from the scaffold.)_ |
| REL-01 | RELEASING | ✅ | Releases carry an annotated `v<X.Y.Z>` tag (e.g. `v0.1.55` is an annotated tag object); the CI `tag-coherence` step pins tag == pyproject == `__version__`. |
| REL-02 | RELEASING | ✅ | Version strings never reused across wheel contents — the SC-15 fix bumped 0.1.55→0.1.56 rather than re-cutting 0.1.55. |
| REL-03 | RELEASING | ✅ | `PUBLIC_API.{md,json}` track HEAD (may be ahead of the registry); `PUBLIC_API.md` carries the HEAD-tracking banner. |
| REL-04 | RELEASING | ✅ | Publish credential is the `magogi` devpi account's upload password — the tag-scoped Woodpecker **org** secret `devpi_password` in CI; local chmod-600 under `my_stuff/tokens/` (AG-18, never committed). Read/install is anonymous. No OIDC referenced. |
| REL-05 | RELEASING | ✅ | Published versions are immutable by policy (PKG-07); fixes ship as a new version. |
| REL-06 | RELEASING | ✅ | Release flow strictly ordered — the 0.1.56 fix followed bump → regen PUBLIC_API/registry → build → test → flow; CI publish runs tag-coherence → smoke → publish → verify-devpi (`.woodpecker.yml`). |
| REL-07 | RELEASING | ✅ | Release commits close the FEEDBACK entries they ship (e.g. the PUBLIC_API.md paper); CHANGELOG is the audit trail. |
| REL-08 | RELEASING | ✅ | Pre-release smoke installs the built wheel into an ephemeral venv and imports it (`.woodpecker.yml` `smoke` step, tag-event). |
| REL-09 | RELEASING | ✅ | Shipped/declined FEEDBACK entries produce a consumer notification via the `pending-feedback/<target>.md` relay (worked example: PAPER-101 to mgf-common). |
| REL-10 | RELEASING | N/A | The mgf-common-MINOR cohort-walk is the supervisor's duty; `mgf-standard` is a leaf that runs no cohort waves (it *ships* the recipe). Its own release consistency is covered by REL-13. _(Row added 2026-06-14 — was missing from the scaffold.)_ |
| REL-11 | RELEASING | N/A | Cohort-walk Phase A/B split is the supervisor's procedure — not executed by this leaf. _(Row added 2026-06-14.)_ |
| REL-12 | RELEASING | N/A | The Phase-A pytest-denial fallback is a cohort-wave agent procedure — not executed by this leaf. _(Row added 2026-06-14.)_ |
| REL-13 | RELEASING | ✅ | This repo *owns* the consistency gate — `scripts/gen_mgf_libraries.py --check`; run GREEN + CURRENT on the 0.1.56 registry regen. _(Row added 2026-06-14.)_ |
| PKG-01 | PACKAGE_DISTRIBUTION | ✅ | Published to + resolved from the self-hosted devpi index (`magogi/prod`); CI `--index-url` is the devpi `+simple/`, publish targets devpi — never pypi.org or the Codeberg registry for `mgf-*`. |
| PKG-02 | PACKAGE_DISTRIBUTION | ✅ | CI uses the canonical endpoints — `…/magogi/prod/+simple/` (index) + the `+simple/mgf-standard/` listing for verify; no hand-typed variants. |
| PKG-03 | PACKAGE_DISTRIBUTION | ✅ | Publish auth is the `magogi` devpi account's upload password (CI **org** secret `devpi_password`, tag-scoped; local chmod-600 under `my_stuff/tokens/`); **install/read is anonymous** — no token. No OIDC referenced. |
| PKG-04 | PACKAGE_DISTRIBUTION | ✅ | Publish flow strictly ordered (gates → build → twine check → publish → verify); the wheel uploaded is the one built + checked in the same run (`.woodpecker.yml`). |
| PKG-05 | PACKAGE_DISTRIBUTION | ✅ | Post-publish `verify-devpi` step queries the devpi `+simple/mgf-standard/` index for the version, never pypi.org or Codeberg (`.woodpecker.yml`, inline check). |
| PKG-06 | PACKAGE_DISTRIBUTION | ✅ | `mgf-standard` has **zero `mgf-*` dependencies** (the leaf), so there is no `mgf-*` name a public package could shadow — the dependency-confusion surface PKG-06 targets does not exist here. (Resolution is the single devpi `--index-url` — `…/magogi/prod/+simple/`, which serves third-party deps via `root/pypi` — with no `--extra-index-url`.) |
| PKG-07 | PACKAGE_DISTRIBUTION | ✅ | Published versions immutable — the `magogi/prod` stage is **non-volatile** (enforced, not just policy); botched-upload recovery is a host-admin `devpi remove` op, never a silent content swap. |
| PKG-08 | PACKAGE_DISTRIBUTION | ✅ | Retention policy adhered to (keep ≥ current + previous minor); storage is devpi **host-disk** hygiene — no external cloud quota (prune superseded versions via an admin `devpi remove`). |
| PKG-09 | PACKAGE_DISTRIBUTION | ✅ | CI publishing is tag-driven (`v*`), build-in-CI, secret-authenticated (the `devpi_password` org secret); no publish on non-tag events; the secret never echoed (`.woodpecker.yml`). |
| PKG-10 | PACKAGE_DISTRIBUTION | ✅ | Naming defers to NM-01..04 — `mgf-standard` (dist) → `mgf.standard` (import). |
| PKG-11 | PACKAGE_DISTRIBUTION | ✅ | Agent/federation version checks resolve against the devpi index (PKG-05), not pypi.org / Codeberg / local `dist/` — followed in this session's registry work. |
| PKG-12 | PACKAGE_DISTRIBUTION | ✅ | No residual `mgf-*` pypi.org **or Codeberg-registry** publish surface (publish targets the devpi index; the `verify-devpi` step confirms; resolution is the single devpi `--index-url`, no `--extra-index-url` — PKG-06). The `no-pypi-surface` CI step is **cornerstone-only by the federation generator** (`mgf.fed._woodpecker.gates["no-pypi-surface"] = self.is_cornerstone`) — mgf-common runs the federation-wide check; a non-cornerstone leaf's woodpecker correctly omits it. mgf-standard's `.woodpecker.yml` is therefore generation-**current**, not drifted. |
| DOC-01 | DOCUMENTATION | ✅ | All 10 baseline root docs + `docs/` dir present (README, LICENSE, CHANGELOG, CONTRIBUTING, SECURITY, FEEDBACK, AGENTS, STARTHERE, DEPS, FEDERATION) + the library-only `PUBLIC_API.{md,json}`. `FEDERATION.md` canonical here (DOC-17). |
| DOC-02 | DOCUMENTATION | ✅ | `docs/` organized into buckets — `standards/` (canonical, owned here), `recipes/`, `inprogress/`, `claude/`, `design/`, `reference-consumers/`, `archive/`, `memory/`. No `cutover/` (no breaking change shipped — see DOC-05). |
| DOC-03 | DOCUMENTATION | ✅ | Multi-file buckets carry a charter `README.md` (standards, recipes, inprogress, design, reference-consumers; **`archive/README.md` added 2026-06-14**). Single-purpose buckets self-describe via their governing file — `memory/MEMORY.md` (the AG-17 index/charter), `claude/CLAUDE.md` (DOC-07). |
| DOC-04 | DOCUMENTATION | ✅ | `CHANGELOG.md` (Keep a Changelog) updated in-commit per release; additive 0.x history, no broken surface to cutover-link yet. |
| DOC-05 | DOCUMENTATION | N/A | No breaking change has shipped (additive 0.x); no `docs/cutover/` guide is due. |
| DOC-06 | DOCUMENTATION | ✅ | Living trackers follow the standard shape with `file:line` evidence (e.g. this tracker); DOC-11 archival enforced 2026-06-14. |
| DOC-07 | DOCUMENTATION | ✅ | `docs/claude/CLAUDE.md` present (dense-lookup agent notes; referenced by STARTHERE + AGENTS.md). |
| DOC-08 | DOCUMENTATION | ✅ | `PUBLIC_API.md` tracks `__all__` + the `PUBLIC_API.json` companion; both pinned by `tests/unit/test_public_api_doc.py` (added 2026-06-14, AP-10). |
| DOC-09 | DOCUMENTATION | ✅ | Code-naming docs drift-pinned: `PUBLIC_API.{md,json}`↔`__all__` (`test_public_api_doc.py`), `__version__`↔pyproject (`tag-coherence` + `TestVersionCoherence`), Index of MUSTs↔`rules.json` (`gen_rules_index.py --check`). |
| DOC-10 | DOCUMENTATION | ✅ | `FEEDBACK.md` is the consumer-facing flow; `docs/inprogress/` is the internal hygiene queue — kept distinct (DOC-10). |
| DOC-11 | DOCUMENTATION | ✅ | `docs/inprogress/` is a workspace, not a graveyard — 4 closed trackers archived to `docs/archive/2026/` 2026-06-14 (PR #98); `inprogress/README.md` indexes active vs archived. |
| DOC-12 | DOCUMENTATION | ✅ | Docs are AI-navigable — relative cross-links, `path:line` prose form, hierarchical `## §N` headings (this repo is the reference implementation of the convention). |
| DOC-13 | DOCUMENTATION | ✅ | `FEEDBACK.md` repo-scoped (this repo's standards/contract/registry); federation-wide papers route to mgf-common via the `pending-feedback/<target>.md` outbox. |
| DOC-14 | DOCUMENTATION | N/A | federation sibling — ADP-04 carve-out (no MGF_ADOPTION.md). |
| DOC-15 | DOCUMENTATION | ✅ | This file (`docs/inprogress/MGF_STANDARDS_CONFORMANCE.md`) declares the level (L2) and uses the ✅/🚫/⏳/N/A markers (CFM-01..04). |
| DOC-16 | DOCUMENTATION | ✅ | `DEPS.md` is bidirectional — §1 "What this project depends on" + §2 "Who depends on this project" (`DEPS.md:14,51`). |
| DOC-17 | DOCUMENTATION | ✅ | `FEDERATION.md` at this repo's root IS the canonical contract (every sibling links here, not a copy); shipped as wheel data via `federation()`. |
| DOC-18 | DOCUMENTATION | ✅ | Change-propagation followed — e.g. the archival PR repointed 4 inbound links same-commit; standards docs carry Propagation headers; couplings pinned where mechanizable. |
| DOC-19 | DOCUMENTATION | ✅ | LESSON_LEARNED.md present at repo root (verified federation-wide). |
| OP-01 | OPERABILITY | N/A | No CLI/service entry point; the version is exposed programmatically as `mgf.standard.__version__` (AP-13). |
| OP-02 | OPERABILITY | N/A | No CLI to host a `doctor` command — federation diagnostics are `mgf-fed app-doctor` (the consumer), not this corpus package. |
| OP-03 | OPERABILITY | ✅ | `pyproject.toml` `Homepage`/`Issues` URLs resolve to the live Codeberg repo (`:65-66`). |
| OP-04 | OPERABILITY | ✅ | No stale headline facts — README/STARTHERE state no numeric test/file counts that could drift; the one machine-checkable headline (registry library count) is REL-13-gated. |
| OP-05 | OPERABILITY | N/A | No running app / active configuration to inspect. |
| OP-06 | OPERABILITY | N/A | No logs / no CLI `logs` command (no logging surface). |
| OP-07 | OPERABILITY | N/A | No CLI/app to host a `bundle` diagnostic-tarball command. |
| OP-08 | OPERABILITY | N/A | No state directories — the package writes nothing at runtime. |
| OP-09 | OPERABILITY | N/A | No service / `environment=production` config to guard. |
| OP-10 | OPERABILITY | N/A | No container/compose/k8s deployable; the wheel is version-pinned + immutable (PKG-07/REL-05). |
| OP-11 | OPERABILITY | N/A | No alerting — not a running service. |
| OP-12 | OPERABILITY | N/A | No stateful backend to back up/restore. |
| DEP-01 | DEPLOYMENT | N/A | No cloud infrastructure — a library, not a deployed service. |
| DEP-02 | DEPLOYMENT | N/A | No VMs/containers to configure-as-code. |
| DEP-03 | DEPLOYMENT | N/A | No deployed artefact; the wheel's immutability + reproducibility are covered by PKG-07/REL-05/SC-18. |
| DEP-04 | DEPLOYMENT | N/A | No production secrets to manage (the publish token is a CI secret — PKG-03/REL-04). |
| DEP-05 | DEPLOYMENT | N/A | No deploy/backup/restore/rollback scripts. |
| DEP-06 | DEPLOYMENT | N/A | No deploy to make reversible. |
| DEP-07 | DEPLOYMENT | N/A | No `deploy/` dir — web-service-consumer scope; this is a library. |
| DEP-08 | DEPLOYMENT | N/A | No production runtime to observe end-to-end. |
| DEP-09 | DEPLOYMENT | N/A | No DNS/TLS to manage. |
| DEP-10 | DEPLOYMENT | N/A | No production cut — no first-production-cut runbook due. |
| DEP-11 | DEPLOYMENT | N/A | No multi-environment deploy — web-service-consumer scope. |
| PR-01 | PRESENTATION_LAYER | ✅ | The package imports **no** UI framework — `src/` pulls only stdlib (`json`, `importlib.resources`, `pathlib`, `typing`); no PySide/click/flask/fastapi/rich. Backed by the `.importlinter` leaf contract. |
| PR-03 | PRESENTATION_LAYER | N/A | Not an app repo with multiple UIs — no `core/view/ui` split. |
| PR-04 | PRESENTATION_LAYER | N/A | No UI layer hierarchy to enforce (the `.importlinter` contract here pins the federation-leaf invariant, not PR layers). |
| PR-05 | PRESENTATION_LAYER | N/A | No `ui/` adapters. |
| PR-07 | PRESENTATION_LAYER | ✅ | This tracker classifies every PR-* rule per the audit-outcomes taxonomy (✅ / N/A markers above). |
| AG-01 | AGENTS | ✅ | `AGENTS.md` is a thin pointer (no briefing copy) → the canonical federation briefing + this repo's STARTHERE/CLAUDE. (mgf-common isn't a dep here, so it points to the source URL — a documented exception.) |
| AG-02 | AGENTS | ✅ | Defers to the single canonical briefing; project-specific lookups live in `docs/claude/CLAUDE.md`. |
| AG-03 | AGENTS | ✅ | BOTH trailers (`Signed-off-by: Bassam Alsanie` + `Co-Authored-By:`) — wired via `.gitmessage`/`commit.template` (AG-18) AND now mechanically enforced by the committed `.githooks/prepare-commit-msg` hook, which auto-adds the human signoff even on `git commit -m` (the bypass that caused the 2026-06-14 session slip). Idempotent (`git interpret-trailers`). The historical slipped commits are documented in the Findings log; published history is not rewritten. |
| AG-04 | AGENTS | ✅ | Reusable friction routes to `FEEDBACK.md` / the `pending-feedback/` outbox (PAPER-101 relayed to mgf-common). |
| AG-05 | AGENTS | ✅ | Memory-verification discipline holds — agents grep/read current state before acting (this session re-verified registry + gates before each change); supported by AG-17 memory. |
| AG-06 | AGENTS | ✅ | Risky ops gated — merges/pushes under the maintainer's standing self-merge authorization; no force-push/destructive ops without confirmation. |
| AG-07 | AGENTS | ✅ | Agent-behavioral (no repo artifact to gate) — multi-step work is tracked; single-step edits skip task ceremony per the rule. |
| AG-08 | AGENTS | ✅ | Memory is federation-scoped, durable facts only — committed `docs/memory/` holds topic facts, not session logs. |
| AG-09 | AGENTS | ✅ | Sibling-version claims verified against the devpi index (the REL-13 contract), not local `dist/`. |
| AG-10 | AGENTS | ✅ | Drift → a PAPER, not a silent edit — the FEEDBACK/outbox channel is the mechanism; this audit *records* findings rather than fixing-to-match. |
| AG-11 | AGENTS | ✅ | Cross-project feedback routes to the TARGET repo's `FEEDBACK.md` via `pending-feedback/<target>.md` (worked example: mgf-common-PAPER-101). |
| AG-12 | AGENTS | ✅ | Project-scoped briefing resolvable — `docs/claude/CLAUDE.md` is the `--project` content (AGENTS.md a thin pointer). |
| AG-13 | AGENTS | ✅ | Single-owner discipline — only the supervisor changes a library; `MGF_LIBRARIES.md` is the source of truth; REL-13 keeps the federation consistent. |
| AG-14 | AGENTS | ✅ | Same-change propagation (the agent-facing DOC-18) — e.g. PUBLIC_API.md shipped with its sync test + conformance flip in one PR; archival repointed links in one PR. |
| AG-15 | AGENTS | ✅ | Empowerment exercised through sanctioned channels — this audit pushes back with recorded rationale (the EH-01 carve-out, the AP-10 ❌ finding) rather than rubber-stamping. |
| AG-16 | AGENTS | N/A | `mgf-common[standards]` does NOT apply here — this repo sits *below* mgf-common (zero `mgf-*` deps by design; it IS the corpus the extra resolves). Same leaf rationale as TS-23. |
| AG-17 | AGENTS | ✅ | In-repo memory present — `docs/memory/MEMORY.md` index + topic notes (`corpus-and-anti-drift.md`, `release-and-registry.md`), kept current. _(Row added 2026-06-14 — was missing from the scaffold.)_ |
| AG-18 | AGENTS | ✅ | Standardized git config — canonical `.gitignore` ignores build/IDE/`.claude/settings.local.json` + **`my_stuff/`** (PR #89); `.gitmessage` wired via `commit.template`. _(Row added 2026-06-14 — was missing from the scaffold.)_ |
| AG-19 | AGENTS | ✅ | Machine-local runtime store (`~/.claude/projects/<slug>/memory/`) is a `memory/`-scoped git repo with allowlist `.gitignore` (`*` / `!*.md` / `!.gitignore`), pushed to private `magogi-admin/mgf-standard-memory` Codeberg remote; bootstrapped by `scripts/init_memory_vcs.py`. _(Row added 2026-06-26 — was missing from the scaffold.)_ |
| AG-20 | AGENTS | ✅ | Owned-infra discipline: the fleet [`MGF_INFRA.md`](../../MGF_INFRA.md) registry (this repo's root) is the asset/access inventory + recovery playbook an agent consults before declaring "blocked"; "blocked"/"gated" notes in `docs/memory/` + the runtime store carry an unblock-path + as-of date. Review-enforced behavioural rule (like AG-04/05/15). _(Row added 2026-06-29 with the AG-20 / MGF_INFRA introduction, standards v2.26.)_ |
| FB-05 | DOCUMENTATION | ✅ | Cross-repo feedback through `pending-feedback/<target>.md` outbox (`pending-feedback/mgf-common.md` present); `pending-feedback/relayed/` tracks landed papers; PAPER-101 relayed to mgf-common; `mgf-fed feedback --check` surfaces un-relayed papers. |
| GUI-01 | GUI_CONSUMERS | N/A | No GUI surface — pure data package + accessors; no PySide6/PyQt6 imports in `src/` (import-linter leaf contract enforced in CI). |
| GUI-02 | GUI_CONSUMERS | N/A | No Qt main thread / off-thread worker pattern — no GUI consumer layer. |
| GUI-03 | GUI_CONSUMERS | N/A | No long-running worker operations to cancel — no GUI surface. |
| GUI-04 | GUI_CONSUMERS | N/A | No GUI workers — no GUI surface. |
| GUI-05 | GUI_CONSUMERS | N/A | No `main()` / Qt bootstrap — data package with no CLI or `QApplication.exec()` entry point. |
| GUI-06 | GUI_CONSUMERS | N/A | No presentation widgets / controllers — no GUI surface. |
| GUI-07 | GUI_CONSUMERS | N/A | No streaming SDK calls — no GUI surface; accessors are synchronous one-shot reads. |
| GUI-08 | GUI_CONSUMERS | N/A | No GUI-state persistence — no GUI surface. |
| GUI-09 | GUI_CONSUMERS | N/A | No `pytest-qt` / Fake backend tests — no GUI surface. |
| GUI-10 | GUI_CONSUMERS | N/A | No GUI feature / capability gating — no GUI surface. |
| NM-01 | NAMING | ✅ | Distribution name `mgf-standard` uses hyphens (`pyproject.toml:[project] name = "mgf-standard"`). |
| NM-02 | NAMING | ✅ | Package imported as `mgf.standard` — namespace pkg at `src/mgf/standard/` (no `src/mgf/__init__.py`); import-linter confirms the namespace shape. |
| NM-03 | NAMING | ✅ | Codeberg slug `mgf-standard` uses hyphens; `[project.urls]` Homepage + Issues cite the hyphen slug (`pyproject.toml:65-66`). |
| OB-01 | OBSERVABILITY | N/A | No observability emission — data package; no logging, metrics, or traces in `src/`; three-pillars concern belongs to service consumers (LG / TM / PF families all N/A). |
| OB-02 | OBSERVABILITY | N/A | No metric names — no metrics emitted (OB-01 N/A). |
| OB-03 | OBSERVABILITY | N/A | No metric label sets — no metrics emitted. |
| OB-04 | OBSERVABILITY | N/A | No OTel traces — no spans emitted. |
| OB-05 | OBSERVABILITY | N/A | No customer-facing operations / SLI — not a running service. |
| OB-07 | OBSERVABILITY | N/A | No alerts — not a running service. |
| OB-08 | OBSERVABILITY | N/A | No SLI/SLO/alert definitions to version — not a service. |
| OB-09 | OBSERVABILITY | N/A | No `LogRecord` schema usage — data package emits no logs (LG family all N/A). |
| OB-10 | OBSERVABILITY | N/A | No cross-language wire-format conformance needed — no log emission (OB-09 N/A). |
| OB-11 | OBSERVABILITY | N/A | No `LogStatsCollector` — no log emission (OB-09 N/A). |
| PF-01 | PERFORMANCE | N/A | No performance budgets — trivial synchronous file reads; no perf-sensitive surface to baseline. |
| PF-02 | PERFORMANCE | N/A | No `@pytest.mark.perf` tests — nothing to budget (PF-01 N/A). |
| PF-03 | PERFORMANCE | N/A | No `tests/perf/baselines.json` — no perf tests (PF-01 N/A). |
| PF-04 | PERFORMANCE | N/A | No re-baselining process — no perf baselines (PF-01 N/A). |
| PF-05 | PERFORMANCE | N/A | No perf harness needed — no perf tests (PF-01 N/A). |
| PF-07 | PERFORMANCE | N/A | No perf-test failure reporting — no perf tests (PF-01 N/A). |
| PF-08 | PERFORMANCE | N/A | No hardware-tier baselines — no perf tests (PF-01 N/A). |
| TM-01 | TIME | N/A | No datetime handling in `src/` — DP-12 gate confirms (grep-confirmed; `app-doctor ✓ DP-12`). |
| TM-02 | TIME | N/A | No wire-format datetimes — data package; no serialisation surface. |
| TM-03 | TIME | N/A | No duration measurements — synchronous file reads only (DP-09 N/A). |
| TM-04 | TIME | N/A | No `datetime.now()` calls — DP-12 gate confirms. |
| TM-07 | TIME | N/A | No timezone handling — no datetimes anywhere in `src/`. |
| TM-08 | TIME | N/A | No async code / sleep / scheduling — DP-11 N/A. |
