# Magogi Foundation Standards — Conformance Tracker (`mgf-hrb`)

> **Status.** v0.6 — 2026-06-09 evidence-based depth audit (16-family fan-out + adversarial refute, replaces the essay-style §2). **143 ✅ / 21 ⏳ / 54 N/A of 218 (87% of applicable).** Verified below the declared L2. See §Z for per-MUST verdicts.
> **Scope.** `mgf-hrb`'s conformance to the standards at [`mgf-standard/docs/standards/`](https://codeberg.org/magogi-admin/mgf_common/src/branch/main/docs/standards/) at v0.42.0.
> **Audience.** Maintainer-tomorrow, AI coding agents, future contributors.
> **Cross-references.** [`README.md`](../../README.md) (declared level), [`STANDARDS_NOTE.md`](../../STANDARDS_NOTE.md) (the deeper rationale for this audit's posture), [`FEEDBACK.md`](../../FEEDBACK.md) (the friction log).

---

## §1 You are here

`mgf-hrb` declares **L2 — Standard** in [`README.md`](../../README.md) and pins `mgf-common>=0.41,<0.43` (walked into the unified-logging cohort, REL-10). Flipped from L1 on 2026-05-24 after the loggers + `HrbSettings` + LG-rationale pass (see §4 audit log).

**Why L2 fits.** This project is **dual-language**: Zig below the socket (the broker server, the lease engine, the capability core, the kabi seam, the worker constellation, the privileged helper) and Python above it (the SDK at [`src/mgf/hrb/`](../../src/mgf/hrb/), an embedded operator CLI at [`src/mgf/hrb/cli/`](../../src/mgf/hrb/cli/), the eventual policy). The `mgf-common` engineering standards are Python-flavoured and apply naturally only to the **Python siblings**. The Zig majority is governed by its own conformance contract — the kabi behavioural contract ([Part 6.4 / `hrb-code/src/conformance.zig`](../../hrb-code/src/conformance.zig)) and the survivability conformance suite (S1–S5, [Part 12](../../hrb-design/mgf-hrb-survivability-review.md)).

The L2 declaration is honest because every applicable Python-side rule is either ✅ met (the AP/EH/TS/DOC/SC majority + LG/CF for the CLI) or 🚫 declined-with-rationale (Python-rule × Zig-code or hot-path × library-shape). The 🚫s carry written rationale per [`mgf-common`'s non-adoption-is-valid](https://codeberg.org/magogi-admin/mgf_common/src/branch/main/docs/standards/principles/non-adoption-is-valid.md) principle — L2 doesn't require every rule ✅, it requires every applicable rule met *or* declined with a real reason.

**Audit method.** Read each standard's rule list, classify each rule as (a) doesn't apply at all (Python-only rule × Zig code), (b) the surface that would carry it doesn't exist yet (defer with a trigger), or (c) already met / actively wired. Re-audit on every restructure that adds or removes a surface.

**Counts (2026-05-24, L1 → L2 flip):**

| Priority | Count | Status |
|---|---|---|
| ✅ structurally conformant | EH-01/-02/-04/-07, AP-01/-08/-10/-11/-14, TS-01/-02/-04/-06, SC-01/-07/-12, DOC-01/-07/-13/-15/-16/-17, DP-01/-02/-09/-13, **LG-01/-08/-09 (CLI)**, **CF-01/-02/-08/-10**, **PR-01/-02/-04/-06/-07 (SDK side; hardened-pair binding per PRESENTATION_LAYER.md §8.1)** | met |
| 🚫 declined-with-rationale (see §3) | DP-03, EH-11, LG-12, SC-06, DOC-14, **LG-01/-04/-08/-09 on the SDK hot path** | rationale recorded |
| ⏳ activates later | EH-03 (no chained-exception sites yet), SC-02/-15 (no subprocess invocation / no operator-supplied paths in CLI yet), DP-04/-11/-12, DOC-02/-04 | trigger spelled out per row |
| N/A | DEP-* (library shape), REL-* (no published version yet) | shape mismatch |

**Headline.** L2 — Standard, declared honestly. The pass that made it true wired `logging.getLogger(__name__)` + lazy `%`-formatting + `extra={}` in the three CLI command modules and `cli/__init__.py`, adopted `mgf.common.bootstrap()` in `main()` (EH-04), introduced `HrbSettings(BaseAppSettings)` at `src/mgf/hrb/config.py` (CF-01/-02/-08/-10) with constructor-injection wiring through `build_parser(settings=...)`, and recorded the principled 🚫 for LG-* on the SDK's hot path (the SDK is a library; the broker emits structured events on the wire; the client surfaces by typed exceptions per EH-01). The Zig majority is governed by the kabi + S-conformance suites.

---

## §2 Per-standard audit → superseded by §Z

> **2026-06-09:** the hand-written per-family prose below is **superseded by the §Z evidence-based
> per-MUST audit** (file:line, refute-survived). Of 218: **143 ✅ · 21 ⏳ · 54 N/A · 0 declined**;
> applicable = 164 (ships a CLI → OP/PR/LG apply in full); **71% evidenced** — one of the federation's
> strongest. Security-engineered client core (import-linter UI-forbid + synthetic-violation liveness
> test, frozen domain types, mypy --strict, bounded buffers + deadlines + fd-ownership + DoS/slowloris/
> trust-boundary tests, explicit deadline_ms cancellation). The 71% reflects the missing publish chain
> (CI exists), the DP-02 broker-transport ABC, the CLI operability commands, and the logging build-out.

**Open-gap clusters (the 47 ⏳ — detail in §Z):**

| Cluster | Rules | Count |
|---|---|---|
| **CLOSEABLE** (publish chain + SCOPE + AP-13 json re-stamp + REL-03 banner + bucket READMEs + sbom/vuln reconcile) | AG-16, AP-13, DOC-03, OP-03, OP-04, PKG-01, PKG-03, PKG-04, PKG-05, PKG-09, PKG-12, REL-03, REL-06, REL-08, SC-10, SC-18, SP-01, SP-02, SP-03, SP-04, SP-05, SP-06, TS-01, WF-03, WF-04, WF-05, WF-06, WF-07, WF-08 | 29 |
| **DEFERRED** (DP-02 broker-transport ABC, OP CLI commands OP-01/05/06/07, logging LG-*, EH-08/09, SC-17, CF-09, TS-10/14, WF-11) | CF-09, DP-02, EH-08, EH-09, LG-05, LG-11, LG-15, LG-16, LG-17, OP-01, OP-05, OP-06, OP-07, REL-01, SC-17, TS-10, TS-14, WF-11 | 18 |

### §2.1 PR — PRESENTATION_LAYER

> Dedicated PR-* classification (PR-07 mandates this section for an L1+ sibling with a UI consumer — mgf-hrb ships `mgf.hrb.cli`). The per-MUST evidence also lives in §Z `### PRESENTATION_LAYER`; this focused, drift-pinned view is what `test_pr_07_tracker_has_pr_section` + the tracker-shape validator assert.

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PR-01 | ✅ | `pyproject.toml` `[tool.importlinter]` contract "PR-01 — SDK forbids UI framework imports" (forbidden PySide6/PyQt6/textual/rich/prompt_toolkit/click on source `mgf.hrb`); pinned by `tests/conformance/test_pr_standard_sdk.py::test_pr_01_sdk_forbids_ui_frameworks_via_import_linter`. | SDK root fenced by a KEPT, CI-blocking forbidden contract; argparse-only CLI explicitly permitted. MET. |
| PR-02 | ⏳ | SHOULD. `hrb-app` exists as the dedicated `<sibling>-app` repo (Qt GUI + absorbed CLI) — the PR-02 mechanism — but `mgf.hrb.cli` still ships inside this SDK, so presentation is not yet fully concentrated. | In progress, not a false ✅. Activates at the SDK's 2nd UI consumer; resolution is the CLI's full migration into `hrb-app`. |
| PR-03 | N/A | The three-layer `core/view/ui/<framework>` split governs an APP repo. mgf-hrb is the domain SDK; `src/mgf/hrb/` has no core/view/ui layering. | App-side rule with no SDK binding surface (standard §8.2). |
| PR-04 | ✅ | `pyproject.toml` `[tool.importlinter]` declares the SDK-binding contracts PR-01 (SDK root) + PR-06 (`mgf.hrb.fmt` stdlib-only) as a blocking CI gate; liveness-pinned by `tests/conformance/test_import_linter_alive.py`. | The app-layer hierarchy contracts live in `hrb-app`; the SDK-side mechanical enforcement is present and alive. MET on the SDK binding. |
| PR-05 | N/A | Exactly one UI adapter exists (`src/mgf/hrb/cli/`); no second `ui/<framework>/`. Sibling-UI isolation is only meaningful with ≥2 UIs (standard §6). | N/A until a second UI lands. |
| PR-06 | ✅ | `src/mgf/hrb/fmt.py` is the standard's named reference implementation; stdlib-only, pinned by a stdlib-allowlist meta-test + the `mgf.hrb.fmt` import-linter forbidden contract in `pyproject.toml`. | SHOULD, and met — medium-agnostic formatting kept stdlib-pure. MET. |
| PR-07 | ✅ | This `### §2.1 PR — PRESENTATION_LAYER` section + `tests/conformance/test_conformance_tracker_shape.py` (section/marker/evidence validators) + `tests/conformance/test_pr_standard_sdk.py::test_pr_07_tracker_has_pr_section`. | Per-applicable-rule rows classified per the audit-outcomes taxonomy. MET. |

---

## §Z Per-MUST evidenced audit (all 259 MUSTs (PAPER-100 re-baseline 2026-06-11) — CFM-03 completeness)

> **2026-06-09 depth audit** (16-family fan-out + adversarial refute on every ✅, hardened prompt + ruthless CLI-operability/socket-transport/socket-security pass; ~33 agents + a 24-id re-run for 3 truncated families, dropped spurious PR-02/PR-06). Ships a CLI → OP/PR/LG apply in full (applicable=164, high). No 🚫-flood, no mislabels. **Mix: 117 ✅ · 47 ⏳ · 54 N/A · 0 🚫.** Replaces the prior scaffold.


### DESIGN_PRINCIPLES

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DP-01 | ✅ | pyproject.toml [tool.importlinter] root_packages=["mgf.hrb"] + 2 forbidden contracts: PR-01 (lines 183-201, mgf.hrb forbids PySide6/qasync/textual/rich/prompt_toolkit/click) and PR-06 ( | [verify-upheld] DP-01 (UI not imported by core, CI-lints layering) MET. The package is a single-package client with a presentation-layer-forbid posture rather than an L1..L5 split; the contract-enforced UI-forbid (strictest on fmt |
| DP-02 | ⏳ | src/mgf/hrb/_client.py line 168 defines `class _Transport:` — a SINGLE CONCRETE class (owns the socket, serializes line-JSON). There is NO abc.ABC or typing.Protocol for the broker tran | DP-02 (every third-party I/O dependency MUST sit behind an ABC with >=1 production + >=1 mock impl + an EXPECTED_METHODS lock-in test) is NOT MET. The Zig broker is precisely the external I/O dependency the standard names ('hardwa |
| DP-03 | ✅ | src/mgf/hrb/domain.py docstring states 'Frozen dataclasses across module boundaries (DP-03)'. Grep for `@dataclass` NOT followed by frozen=True in domain.py returns EMPTY — every datacl | [verify-upheld] DP-03 (frozen domain types crossing module boundaries; no bare strings/dicts as identity) MET. Raw-dict escape hatches (inspect_raw/capabilities_raw) are documented forward-compat hatches, not identity crossings; t |
| DP-04 | ✅ | I RAN .venv/bin/mypy --strict src/: 'Success: no issues found in 16 source files' exit 0. pyproject [tool.mypy] python_version=3.11, strict=true. Any appears only in the documented line | [verify-upheld] DP-04 (every public function type-annotated; mypy --strict passes on src/) MET — verified live, clean under strict. |
| DP-05 | ✅ | tests mirror src under tests/unit/mgf/hrb/ (test_client.py, test_config.py, test_domain.py, test_exceptions_from_wire.py, test_fmt*.py, test_identity.py, ...). Unit tests run against th | [verify-upheld] DP-05 (tests mirror src; run with no real daemon/network/credentials) MET. Default suite never touches the Zig daemon. (Minor: the no-real-I/O is achieved via a duck-typed fake rather than a provider ABC, which is  |
| DP-06 | ✅ | Security/reliability/perf/error-reporting are first-class in code AND tests: bounded response buffer _MAX_RESPONSE_BYTES (_client.py), client-side deadline so a wedged broker cannot han | [verify-upheld] DP-06 is a code-review checklist (standard §14), but the dedicated security/reliability/perf test families + the four concerns engineered into the transport hot path substantiate MET. |
| DP-07 | ✅ | Every public class/function carries an intent+invariant docstring: Client (564), Client.connect (609, full hello-wire-format + deadline rationale), claim/release/revoke/recover/inspect/ | [verify-upheld] DP-07 (rich docstrings stating intent + invariants on every public class/function) MET — thorough, with why-comments (G4/J4/F-HRB/I1 tags) inline. |
| DP-08 | ✅ | pyproject [project.scripts] comment documents the CLI swap recipe ('nothing else in mgf.hrb imports from mgf.hrb.cli, so extraction is mechanical'). _client.py module docstring document | [verify-upheld] DP-08 is a SHOULD; replaceability is documented for the components that exist (CLI extraction recipe, wire/transport evolution). The one true external seam (the broker transport) lacks a formal swap-recipe table be |
| DP-09 | ✅ | _client.py module docstring: 'DP-09 explicit cancellation: every long-lived call takes an explicit deadline_ms argument.' Every claimant/observer verb takes *, deadline_ms: int = 0: cla | [verify-upheld] DP-09 (cancellation explicit; long-running ops take an explicit token-like parameter, never a thread-global) MET. deadline_ms is the CancellationToken analogue — forwarded on the wire AND bounding the client-side s |
| DP-10 | ✅ | exceptions.py lines 26-45: `try: from mgf.common.exceptions import AppError as _BaseError / except ImportError: _BaseError = Exception` followed by an explicit _warnings.warn(...ImportW | [verify-upheld] DP-10 (no silent fallback; active backend queryable + logged) MET. The single fallback path warns loudly; with filterwarnings=error the suite would surface it. No credential-store fallback exists because the SDK st |
| DP-11 | ✅ | grep -rn 'asyncio.create_task\|TaskGroup' src/ returns NONE. The only async surface, Client.amonitor (1923), uses asyncio.to_thread(self.drain_events, ...) (1949) + asyncio.sleep — awai | [verify-upheld] DP-11 (async tasks must have an owner; no bare create_task) MET — there are no asyncio tasks at all, and the one daemon thread is owned, signalled, and joined. RUF006 enforced mechanically. |
| DP-12 | ✅ | grep -rE 'datetime\|utcnow\|.now(\|fromtimestamp\|astimezone\|isoformat\|time.time' over src/mgf/hrb/ returns NONE. Time crosses the wire only as integer milliseconds from the broker's  | [verify-upheld] DP-12 (UTC at every boundary; no naive datetimes cross module boundaries) MET. The package carries time as broker-monotonic integer ms rather than Python datetimes, so the naive-datetime hazard never arises; DTZ gu |
| DP-13 | ✅ | _client.py docstring: 'DP-13 deterministic cleanup: the socket is owned via a context manager.' Client.close (1753) tears down monitor_fd then transport (only if _owns_transport); Clien | [verify-upheld] DP-13 (every owned external resource released deterministically; no GC reliance) MET — sockets, mmap, pipes, and the monitor thread are all acquired/released via context managers or explicit try/finally with leak-a |
| DP-14 | ✅ | No canonical corpus set is restated in this repo's code/tests; taxonomies derive from their source. | New MUST, corpus v3.3.0 (DP-4/CIR-21/PAPER-131). |

### ERROR_HANDLING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| EH-01 | ✅ | src/mgf/hrb/exceptions.py:81 `class MgfHrbError(_BaseError)` where _BaseError is `mgf.common.exceptions.AppError` (imported line 27, with a documented warn-on-fallback to bare Exception | Single typed tree rooted at the federation base AppError; every raised type is a subclass; exported in __all__. Meets EH-01. |
| EH-02 | ✅ | The one third-party boundary the SDK owns is the unix-socket call to the Zig broker. exceptions.py:305-351 from_wire() maps every broker wire `err` code via _WIRE_TO_EXC (267-284: NotFo | verify-upheld. Tried to refute: searched for any os/socket call escaping untranslated — every recv/send/connect OSError site at the transport wraps to the typed tree (J4 closed the mid-stream recv path too). Both directions (OSErr |
| EH-03 | ✅ | Every translated re-raise chains the cause: _client.py:275,290,378,392,458,462,712,724,741 all `... from exc`; sysfs.py:213 `... from exc`. from_wire returns a fresh exception which cal | verify-upheld. Refute attempt: looked for a translated re-raise missing `from`. The only `from`-less raises are the connect-path bare `raise` (preserves cause by definition) and from_wire's primary raise of a broker error (no caug |
| EH-04 | ✅ | cli/__init__.py:189 wraps the whole subcommand dispatch in `with mgf.common.bootstrap(app_name="mgf-hrb", app_version=__version__):` — the federation reference context manager that inst | EH-04 requires a top-level handler at every entry point. The CLI entry point installs the process/thread excepthooks via bootstrap; no async/Qt entry exists. Met for the surfaces that apply. |
| EH-05 | ✅ | cli/__init__.py:189 runs inside mgf.common.bootstrap, which wires mgf.common.observability install_excepthook + report_now (local JSON crash report + optional remote sink, per ERROR_HAN | verify-upheld. Refute attempt: checked for a local reporter that might bypass the hardened mgf-common one — none exists; delegation to the federation reference impl is exactly the §6 preferred shape. The unhandled path lands in th |
| EH-06 | N/A | mgf-hrb ships an SDK + an argparse CLI (cli/__init__.py, cli/_doctor.py, etc.). It has no GUI worker layer — no QThread/CoreWorker; the prompt notes the CLI moved to hrb-app (the GUI re | EH-06 governs GUI worker error pipelines (Signal-based failed/error routing). No GUI workers exist in this package, so the rule does not apply. |
| EH-07 | ✅ | Every `except Exception`/`except BaseException` site is in a permitted carve-out: _shm.py:90 catches around _validate, closes the mmap, then bare `raise` (cleanup re-raise); diagnostics | verify-upheld. Refute attempt: examined each of the 6 sites for a swallow-without-reraise/translate. None swallows: each re-raises, translates to a typed exception, or is a documented best-effort capture (diagnostics G2 comment +  |
| EH-08 | ⏳ | The typed exceptions in exceptions.py carry NO machine-readable constructor fields — from_wire() (line 351) builds every instance as `cls(err_str)`, so the ONLY state is the message str | EH-08 is not met: the broker reports a structured error (wire `err` code, plus urn/op context available at the transport) yet the typed exception only carries the raw err string as its message. There is no .urn/.op/.code/.reason f |
| EH-09 | ⏳ | Some user-facing CLI messages do end in an action — cli/_info.py:77-80 prints 'error: no resource at URN ...' plus a hint line, and doctor findings carry a `remediation` field (diagnost | Partial coverage in the CLI but transport/exception messages lack a uniform actionable next-step, and the mandated hint-pinning test is absent. Not fully met. |
| EH-10 | ✅ | diagnostics.py:569 is the canonical best-effort-observer shape: `except Exception as exc:  # any failure becomes one finding (G2)` catches broadly, converts the failure into a typed Doc | The diagnostics/doctor capture loops follow the never-raises 'log/return-a-finding, continue' invariant with a documenting comment. Met for the observer surfaces this SDK has. |
| EH-11 | N/A | The SDK performs NO automatic retries — by deliberate design (G2 'honest re-acquisition, not transparent retry', exceptions.py:240-242). Each op is a single socket round-trip bounded by | EH-11 governs retry loops the code itself performs. This SDK intentionally does not retry (single-shot ops, consumer owns backoff). With no retry mechanism in the package, the exponential-backoff/jitter/cap rule does not apply. |
| EH-12 | ✅ | The retry-safe writes are release and revoke, both documented total + idempotent keyed on the natural key: _client.py:524 Lease.release 'Total + idempotent (Part 3.2)'; :1461 'Release a | verify-upheld. Refute attempt: checked whether any multi-attempt external write lacks idempotency — release/revoke (the only writes safe to repeat) are explicitly total+idempotent on urn/lease; claim is correctly NOT treated as id |
| EH-13 | ✅ | No client-side retry loop exists (see EH-11: single-shot ops, no SDK-driven retries), so the SDK cannot amplify load against a struggling broker — the amplification source EH-13 targets | EH-13 allows recording the judgment that load is already bounded (per non-adoption-is-valid) in place of a breaker. Here the SDK does zero automatic retries and every op is deadline-capped, so there is no unbounded-retry amplifica |

### LOGGING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| LG-01 | ✅ | Module-scope hierarchical loggers everywhere: _client.py:69, domain.py:31, diagnostics.py:56, exceptions.py:24, cli/__init__.py:55, cli/_scan.py:25, cli/_info.py:25, cli/_doctor.py:32,  | Refute attempt failed — every logger is acquired via logging.getLogger(__name__) at module scope and there are zero bare logging.* calls. UPHELD. [verify-upheld] |
| LG-02 | ✅ | Exactly one setup site: cli/__init__.py:189 `with mgf.common.bootstrap(app_name="mgf-hrb", app_version=__version__)`. grep basicConfig\|setup_logging across src/ → NONE (no competing co | Refute attempt failed — single bootstrap entry point, no competing basicConfig/setup_logging, and the bootstrap-installed formatter demonstrably emits JSON when stdout/stderr is not a TTY. UPHELD. [verify-upheld] |
| LG-03 | ✅ | Delegated to mgf.common. logging_setup.py installs JsonFormatter (lines 151/203) which carries _add_otel_context; bootstrap also wires _wire_otel (_lifecycle.py step 7). This package ad | Refute attempt failed — OTel trace context is attached automatically by the bootstrap-installed standard JsonFormatter; nothing here overrides it. Correctly delegated. UPHELD. [verify-upheld] |
| LG-04 | ✅ | Delegated to mgf.common. _lifecycle.py (step 4, ~lines 800-836) constructs a Redactor(extra_keys=..., extra_value_patterns=...) and passes it to _wire_logging; both console and Rotating | Refute attempt failed — redaction is performed by the bootstrap-installed Redactor before any sink, and this client emits no un-redactable secret fields. UPHELD. [verify-upheld] |
| LG-05 | ⏳ | Two ERROR sites stringify the exception into the message with NO exc_info: cli/_info.py:84 `logger.error("broker returned error: %s", exc)` and cli/_scan.py:55 `logger.error("broker ret | LG-05 (MUST: ERROR-level logs include the exception via LOG.exception/exc_info=True, never just the stringified exception in the message) is violated at the two CLI broker-error ERROR sites. Real gap. |
| LG-06 | ✅ | Project kind = cli (pyproject.toml:41-42 console_scripts mgf-hrb=mgf.hrb.cli:main; no GUI/service). For cli the matrix prescribes the rotating-file branch. bootstrap→logging_setup insta | Refute attempt failed — a searchable rotating-file aggregator (the cli-kind branch) is installed via the bootstrap-installed logging setup. UPHELD. [verify-upheld] |
| LG-07 | N/A | gui-app-only rule. mgf-hrb ships no GUI: grep PySide/PyQt/tkinter in src/ returns only doc-comment mentions ('No import PySide6' in fmt.py:27). It is a CLI + client SDK; the matrix scop | Not applicable — no desktop GUI, so the log-viewer-dialog requirement does not apply. |
| LG-08 | ✅ | grep -rE '(logger\|LOG\|log)\.(info\|debug\|warning\|error\|exception\|critical)\(\s*f["\x27]' src/ → NONE. Every reviewed call site uses %s/%d positional args: _client.py:210/276/379/3 | Refute attempt failed — lazy %-style formatting throughout, zero f-string log calls. UPHELD. [verify-upheld] |
| LG-09 | ✅ | Structured fields passed via extra={}: _client.py:279-284 (op/urn/errno/exc_type), :382-386, :440-444 (buffered_bytes/errno/exc_type), :649-658 (socket_path/client_id/hello_deadline_ms) | Refute attempt failed — extra={} used consistently for structured context; fields not concatenated into the message. UPHELD. [verify-upheld] |
| LG-10 | N/A | service-only rule. mgf-hrb has no systemd/daemon entry point — the only console script is the CLI (pyproject.toml:42). 'daemon' mentions in src/ refer to the client's internal event-pol | Not applicable — there is no headless systemd-service entry point; the package is a CLI + SDK. |
| LG-11 | ⏳ | grep '"operation"' src/ → NONE. Client.call / Client.connect cross a process+network boundary (Unix socket to the broker) — squarely within LG-11's scope (≥100ms OR crosses a process/ne | LG-11 (MUST: log operation start/end with a stable `operation` field for any function crossing a process/network/storage boundary) is unmet — no operation field exists and the socket-boundary calls log only ad-hoc DEBUG records. |
| LG-12 | ✅ | All call sites are cheap: lazy %-formatting (LG-08) defers the format; extra={} dicts are cheap literal builds; JSON serialisation + redaction + file/OTLP IO happen in the bootstrap-ins | Refute attempt failed — emission is cheap and heavy work is deferred to the handlers. UPHELD. [verify-upheld] |
| LG-13 | ✅ | The one realistic flood vector — unrecognised/non-string broker wire-err codes streaming from a buggy broker — is dedup'd once-per-code-per-process: exceptions.py:302 `_warned_unknown_w | Refute attempt failed — the runaway vector uses once-per-code dedup and the byte-recv loops log only on terminal failure, so no per-loop flooding. UPHELD. [verify-upheld] |
| LG-14 | ✅ | grep -i 'contextvar\|thread_local\|threading.local' src/ → NONE. The package registers no app-specific correlation context and uses NO forbidden thread-local / function-arg-threaded cor | Refute attempt failed — no forbidden thread-local/arg-threaded correlation; the contextvar mechanism is delegated to the bootstrap formatter and not violated. UPHELD. [verify-upheld] |
| LG-15 | ⏳ | grep '"event"' src/ → NO event fields. No docs/reference/EVENTS.md exists (find -iname 'EVENTS*' hits only stdlib/vendored files). Several INFO+/WARNING boundary events that LG-15 §4.5  | LG-15 (MUST: notable lifecycle/security/boundary INFO+ records carry a stable `event` field documented in EVENTS.md) is unmet — no event fields and no EVENTS.md catalogue. |
| LG-16 | ⏳ | WARNING/ERROR records partially satisfy WHAT (past-tense: 'broker connect failed', 'broker connection lost') and WHY (extra={} fields). But: (a) they carry no `event` field (LG-15 compa | LG-16 (MUST: every WARNING/ERROR answers WHAT/WHY/HOW with no buried context) is not fully met — known-remediation records omit the HOW hint and some ERRORs bury context in the message string. |
| LG-17 | ⏳ | grep 'fingerprint' src/ → NONE. No ERROR record carries a `fingerprint` field, and crucially the ERROR sites (_info.py:84, _scan.py:55) lack exc_info, so the standard formatter cannot a | LG-17 (SHOULD: ERROR records carry a stable fingerprint; default auto-computed when exc_info is set) is unmet — no fingerprints and the ERRORs lack exc_info to trigger the automatic default. |

### CONFIGURATION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| CF-01 | ✅ | src/mgf/hrb/config.py:30 — class HrbSettings(BaseAppSettings, env_prefix="MGF_HRB_") is the single typed pydantic-settings subclass (fields socket_path + default_deadline_ms at :35-36). | [verify-upheld] Refute attempt failed: confirmed there is exactly one BaseSettings subclass and no ad-hoc env/file reads anywhere in src. Application config lives in one typed object — MET. |
| CF-02 | ✅ | HrbSettings inherits settings_customise_sources from BaseAppSettings (mgf/common/config/_settings.py:264) which wires init>env>dotenv>YAML>file_secret precedence; CONFIGURATION.md §0b l | [verify-upheld] Precedence is provided by the base and pinned by two passing precedence tests. CF-09's missing --config flag is the only place CLI-flag precedence is incomplete, but the chain itself (init/ctor > env > YAML > defau |
| CF-03 | ✅ | BaseAppSettings declares `version: int = 1` (_settings.py:175) plus the `_check_version` field_validator (_settings.py:251-256, raises 'config.yaml version {v} is newer than supported') | [verify-upheld] The version field + loud-on-higher validator are inherited unchanged. MET (auto-provided per §0b). |
| CF-04 | N/A | `grep -rn 'save_settings\|atomic_write\|write_text\|\.replace(\|to_yaml\|model_dump'` across src/mgf/hrb/ finds no config-write call site (only sysfs.py:113 str.replace on a devpath tok | Atomic-write MUST applies only to files the app WRITES. mgf-hrb owns no on-disk config/state file it writes — nothing to make atomic. N/A. |
| CF-05 | ✅ | HrbSettings carries only socket_path (a filesystem path) + default_deadline_ms (int) (config.py:35-36). `grep -rn 'vault\|secret\|token\|password\|api_key\|credential'` over src/mgf/hrb | [verify-upheld] No secret lives in the config schema; the privileged-broker trust is established via kernel peer-cred + a connection-bound capability id, so no Vault is required. MET. |
| CF-06 | ✅ | BaseAppSettings' settings_config() defaults set `"extra": "forbid"` (_settings.py:101, comment 'rule CF-06') and HrbSettings sets only env_prefix via the subclass-kwarg pattern (config. | [verify-upheld] Unknown-key rejection is inherited and not overridden. MET (auto-provided per §0b). |
| CF-07 | N/A | No satellite/sub-config files exist in mgf-hrb. `grep -rn 'from_yaml_file\|discriminator\|save_to_file'` over src/mgf/hrb/ finds none; the package ships exactly one Settings class (HrbS | CF-07 governs the shape of sub-config files; mgf-hrb has none. N/A. |
| CF-08 | ✅ | build_parser(settings: HrbSettings \| None = None) takes Settings by injection (cli/__init__.py:75-83); main() constructs HrbSettings() ONCE at the entry point (cli/__init__.py:179, ins | [verify-upheld] Verified the only HrbSettings() instantiations are the build_parser default and the single entry-point construction inside main() — no module-level instance. MET. |
| CF-09 | ⏳ | build_parser (cli/__init__.py:85-132) adds `--version`, `--socket`, and the subcommands (scan/info/doctor/explain) but NO `--config <path>` flag. There is no XDG/OS-convention default-p | [verify-refuted: not in the upheld list — adjudicated fresh] CF-09 (applies to consumer-owned-config; this ships a real CLI) MUST always expose a `--config <path>` flag honouring XDG/OS conventions. mgf-hrb's CLI has no such flag, |
| CF-10 | ✅ | tests/unit/mgf/hrb/test_config.py constructs HrbSettings with explicit values: test_constructor_injection_overrides_defaults (:31, HrbSettings(socket_path=..., default_deadline_ms=...)) | [verify-upheld] Tests construct Settings with explicit values and isolate env via monkeypatch — no env-var/.env leakage. MET. |
| CF-11 | N/A | `grep -rn 'alias\|AliasChoices\|validation_alias'` over src/mgf/hrb/ finds no field aliases; HrbSettings has only two fields (socket_path, default_deadline_ms) and no field has been ren | CF-11 governs renaming a config field without breaking on-disk configs. No rename has occurred and the schema is at its initial shape, so there is nothing to alias. N/A (becomes APPLIES only when a field is renamed). |
| CF-12 | N/A | HrbSettings has no field with mutually-exclusive backend variants — socket_path is a single str and default_deadline_ms a single int (config.py:35-36). `grep -rn 'discriminator\|Annotat | CF-12 (discriminated union for a `kind` discriminator) applies only where a config field carries mutually-exclusive backend variants; mgf-hrb has none. N/A. |

### SECURITY_STANDARD

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| SC-01 | N/A | grep -rniE 'password\|api_key\|secret\|private_key\|BEGIN .*KEY\|token=\|Fernet\|secrets\.\|os\.urandom' over src/ returns nothing (the only 'token' hits are InvalidTokenError / lease/c | The Python client holds no secret material. There is nothing to put in a vault; the capability ids it presents are broker-minted, transient, and not stored. No secrets-in-config/source/logs exposure exists. Not applicable. |
| SC-02 | N/A | grep -rn 'import subprocess\|subprocess\.' src/ returns NOTHING. The package talks to the broker over a Unix socket (socket.socket(AF_UNIX)), never spawning processes. No shell=True any | This Python client invokes no subprocesses — the privileged execution lives in the separate Zig broker. The argv-only rule has no applicable call site here. |
| SC-03 | ✅ | No yaml.load( or pickle.load in src/ (grep clean except the word 'pickled' in a diagnostics.py docstring at line 109, not a call). The broker's line-JSON responses are parsed via json.l | All deserialization of untrusted broker bytes uses json.loads + typed projection; no yaml.load, no pickle for IPC. Deserialization safety is met. |
| SC-04 | N/A | No file writes of private data in src/ — no config.yaml write, no vault file, no crash-report write (the crash reporter is mgf-common's, invoked via bootstrap). The client only opens a  | This client owns no on-disk private-data file that it writes, so the 0o600 + atomic-write rule has no applicable write site here. |
| SC-05 | N/A | grep for hashlib.md5/sha1/random.*/Fernet/cryptography returns nothing in src/. No cryptographic primitives are used by the Python client; the CSPRNG cap-id minting referenced in connec | No crypto in the Python layer. Not applicable. |
| SC-06 | N/A | No outbound TLS/HTTP/SSH in src/ — the only transport is a local Unix-domain socket (socket.AF_UNIX, _client.py:660). No httpx/requests/paramiko/ssl usage; grep for verify=False/CERT_NO | A Unix-socket-only client makes no TLS connection. TLS-verify rule is not applicable. |
| SC-07 | ✅ | [verify-upheld] _call_locked sets self._sock.settimeout(deadline_ms/1000.0) when deadline_ms>0 (_client.py:265-266) and re-types socket.timeout to HrbTimeoutError on send (:271-275) and | Every blocking socket boundary (connect-hello, send, recv, recvmsg) is deadline-bounded and converts socket.timeout into the typed broker TimeoutError family; the no-blocks-forever contract holds end-to-end and is tested. Upheld. |
| SC-08 | ✅ | [verify-upheld] Boundary validation present + tested at each ingress: (1) CLI args via argparse with required subcommands (cli/__init__.py:100) and _safe_for_help() control-char/length  | Untrusted ingress (CLI parser, typed config, wire-response byte ceiling, shm descriptor numbers) is validated at the boundary with negative tests. The single broker-side clause does not undercut the verdict; the SDK-side validatio |
| SC-09 | ✅ | [verify-upheld] SDK logs only non-secret structured fields — extra={op,urn,cap_id,deadline_ms,correlation_id,exc_type,errno,buffered_bytes,socket_path,broker_version} (_client.py:213-21 | Primary defense (log only non-secret fields) is followed and the redactor backstop is wired via the standard bootstrap. No secret-bearing field reaches a sink. Upheld. |
| SC-10 | ✅ | uv.lock IS committed (193978 bytes, present at repo root) — the lockfile half is satisfied. BUT grep -niE 'pip-audit\|osv\|safety\|gitleaks\|cyclonedx\|sbom' over .woodpecker.yml return | SC-10 has two halves: (a) committed lockfile — MET (uv.lock); (b) CI runs a vuln scanner (pip-audit/osv-scanner/safety) on every PR — NOT MET. The scanner gate is absent, so SC-10 is an open gap until a pip-audit/osv step (and ide — FIXED 2026-06-09: pip-audit vuln-scan added to CI |
| SC-11 | ✅ | [verify-upheld] Exception messages carry only non-secret operational context — socket path, op name, exc type, byte counts, broker greeting dict (_client.py:709-712,:721-724,:754-757; e | Tracebacks/exception args carry no secret material here, and the typed translation seam plus mgf-common crash-reporter redaction satisfy the scrub-before-egress requirement. Upheld. |
| SC-12 | ✅ | [verify-upheld] SECURITY.md exists at repo root (4505 bytes). 'Reporting a vulnerability' section with private contact bassam@magogi.org + subject prefix [mgf-hrb security] (SECURITY.md | Repo-root SECURITY.md is present and covers contact, timeline, embargo/disclosure, and scope per the §11.1 template. Upheld. |
| SC-13 | N/A | No cryptographic keys at rest in src/ — no KEY = b'...', no embedded keys, no keyring use, no key derivation. The client holds no key material (see SC-01/SC-05). | No at-rest keys in the Python client. Not applicable. |
| SC-14 | N/A | No authentication boundary in this package — the client presents a broker-minted cap_id (from the hello handshake, _client.py:758) but does NOT authenticate users or compare passwords/k | There is no auth-failure path in the Python client to enumerate or rate-limit; the trust gate is broker-side. Not applicable to this layer. |
| SC-15 | N/A | No filesystem path is constructed from external input in this client. socket_path comes from typed HrbSettings/CLI (operator-controlled, trusted input per §8.5). The only mmap is over a | No path-traversal-relevant path construction from untrusted input in the Python layer; the sysfs-read traversal defense is the broker's. Not applicable here. |
| SC-16 | N/A | No privileged operations in src/ — no sudo/setuid/chmod/capability grants in the Python client. Privilege separation (the separate privileged helper per worker, D-031) is entirely broke | The privileged surface is the Zig broker, not this unprivileged Python client. Minimum-privilege confinement is a broker concern; not applicable to this package. |
| SC-17 | ⏳ | grep for audit=true / 'audit' as a log field over src/ returns NOTHING — the Python client emits NO audit-log records. It READS the broker's audit ring via Client.audit_tail (_client.py | SC-17 says the application MUST emit a structured audit=true record for security-relevant actions. The broker is the canonical audit source, but for a CLI that issues control/raw ops against a privileged broker, either client-side |
| SC-18 | ✅ | No publish/build/sbom flow in CI: .woodpecker.yml comment lines 53-55 state 'No publish flow today — mgf-hrb is not on PyPI. When it lands, copy the publish steps...'. grep for twine/sb | SC-18 requires the published artefact be buildable from a tagged commit using declared deps with recorded build metadata (and the federation pattern emits a CycloneDX SBOM). The CI has no build/publish/SBOM step (explicitly deferr — FIXED 2026-06-09: .woodpecker sbom step (reproducible CycloneDX) |
| SC-19 | ✅ | Introduces no credential of its own; the secrets its pipeline consumes (`codeberg_repo_read`, `codeberg_ssh_clone_key`, `codeberg_ssh_host_key`, `devpi_password`) are all declared in `mgf-standard/SECRETS.toml` and verified by `mgf-secrets doctor` C3 (unregistered-actual). |
| SC-20 | ✅ | Holds a `my_stuff/` bare-value cache; the encrypted originals live in `mgf-secrets-store` (age, 2 recipients). `my_stuff/` is git-ignored (AG-18, app-doctor ✓) so no plaintext is committed. |
| SC-21 | ✅ | `my_stuff/` is git-ignored and materialised 0600 by `mgf-secrets materialize`; doctor check C6 pages on the doc-form shape. |
| SC-22 | N/A | Manages no Woodpecker secrets. Add/rotate/re-scope for the secrets it consumes is performed in `mgf-secrets` (`sync` / `rotate`), which owns the playbook and the cross-family contract surface. |
| SC-23 | ✅ | 2 fail-fast guard line(s) in `.woodpecker.yml` on the secret-consuming step(s) — a secret unscoped for the event fails the step with a named FATAL instead of injecting empty. |

### TESTING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| TS-01 | ⏳ | src/mgf/hrb/ has 8 source modules (_client, config, diagnostics, domain, exceptions, fmt, identity, _shm, sysfs); tests/unit/mgf/hrb/ mirrors most (test_client, test_config, test_domain | Sentence 1 (tests mirror src 1:1) is substantially met by the unit dir, but sentence 2 — 'CI MUST lint that no source file lacks a mirror beyond a documented allow-list' — has no implementation and no allow-list file. The mechanic |
| TS-02 | ✅ | Default suite ran here: `485 passed, 94 deselected in 45.31s` with NO Zig broker built, no network, no creds. Unit tests reach the broker only via tests/unit/mgf/hrb/test_client.py:24 ` | [verify-upheld] Reproduced the green no-broker run in-sandbox. Note: the transport seam is a concrete _Transport with a duck-typed _FakeTransport rather than a formal DP-02 Protocol/ABC (grep found no Protocol/abstractmethod in _c |
| TS-03 | ✅ | tests/conftest.py registers a Hypothesis profile (deadline=None), isolates broker sockets per pytest-xdist worker via PYTEST_XDIST_WORKER, pre-unlinks sockets on spawn + tears down in f | [verify-upheld] Isolation mechanisms verified. Caveat surfaced during refute: pytest-randomly is NOT installed (the §16 mechanical check names it; the suite ran in definition order), so order-independence is not actively shuffled  |
| TS-04 | ✅ | pyproject.toml [tool.pytest.ini_options]: `filterwarnings = ["error"]   # TS-04 — every warning is an error`. | [verify-upheld] Literal MUST present verbatim; suite passes under it (485 passed), proving no unhandled warnings leak. |
| TS-05 | ✅ | pyproject.toml addopts = "--strict-markers --strict-config -m 'not e2e and not use_case and not stress and not perf and not conformance and not slow'". | [verify-upheld] Both --strict-markers and --strict-config present; the full 13-marker taxonomy is registered (TS-19) so strict-markers does not reject the suite — confirmed by the green run. |
| TS-06 | ✅ | pyproject.toml [tool.coverage.report] fail_under = 80; [tool.coverage.run] source=["mgf.hrb"], branch=true, omit=["src/mgf/hrb/cli/__main__.py"]. .woodpecker.yml test-3.13 step: `pytest | [verify-upheld] Gate enforced in pyproject AND CI; measured 86.74% with branch coverage on clears the 80% floor. Reproduced in-sandbox. |
| TS-07 | ✅ | tests/unit/mgf/hrb/test_exceptions_from_wire.py:48 test_known_codes_map_to_typed_exceptions asserts `str(exc) == wire_code` (message format) + isinstance against the typed class + root  | [verify-upheld] Message format (a) tested for the full typed set; (b) field-preservation and (c) field-copy bind only 'where applicable' and these exceptions carry no copied fields, so they are vacuously satisfied. The applicable  |
| TS-08 | ✅ | The EH-02 seam is from_wire() (broker wire-err code → typed exception). test_exceptions_from_wire.py covers: success/each known code (test_known_codes_map_to_typed_exceptions, 5 paramet | [verify-upheld] The single broker→typed translation seam has tests for success, each known third-party code, and the catch-all unknown-vendor-error path — exactly the three branches TS-08 requires, plus a defensive malformed-input |
| TS-09 | N/A | grep for EH-10 best-effort-observer loops in src/mgf/hrb/_client.py, domain.py, identity.py found only docstring uses of 'best-effort' describing optional response fields (e.g. _client. | TS-09 binds 'every best-effort observer (rule EH-10)'. mgf-hrb has no EH-10 observer pattern — it is a request/response socket client, not an event-fan-out with pluggable observers. Rule does not apply. |
| TS-10 | ⏳ | There ARE security-relevant pins: tests/unit/mgf/hrb/test_hrb_trust_boundary.py pins F-HRB-001/002/003 (response-byte cap, deadline bounds own socket wait, shm descriptor validation) an | TS-10 requires every security-relevant SC-01..SC-18 rule to be pinned by a test 'where mechanically possible', referencing SECURITY.md §15. mgf-hrb has strong ad-hoc trust-boundary/DoS pins but no SC-id-keyed pin set proving the f |
| TS-11 | N/A | grep for QThread/PySide6/CoreWorker/do_work in src/ returned only fmt.py — and those are docstring lines stating fmt is medium-agnostic ('No import PySide6', 'GUIs that want their own v | TS-11 binds GUI workers (rule EH-06, PySide6+pytest-qt). mgf-hrb is an SDK+CLI that is contractually forbidden from importing any UI framework; it has no QThread workers. Rule does not apply. |
| TS-12 | ✅ | Async surface = Client.amonitor (async generator) in _client.py. tests/unit/mgf/hrb/test_client.py:856 test_amonitor_returns_async_generator (asserts inspect.isasyncgen + await agen.acl | [verify-upheld] The async API IS tested and torn down explicitly (per-call asyncio.run = per-test loop; aclose() teardown; no asyncio.sleep-for-sync). TS-12's literal MUST says 'pytest-asyncio (or anyio)'; this project uses asynci |
| TS-13 | ✅ | tests/unit/mgf/hrb/test_fmt_property.py (pytestmark=pytest.mark.property) uses Hypothesis @given over fmt.py formatters (format_uptime/duration/rss/severity_glyph) — positive domain (in | [verify-upheld] The genuine round-trip/invariant surface (fmt helpers) has real Hypothesis property coverage of the input class. The '_strategies.py module' placement is a SHOULD-style convention (§5.2), not the MUST; the binding  |
| TS-14 | ⏳ | tests/perf/test_hot_path_latency.py (pytestmark=[perf, timeout(120)]) measures the real production path (broker.list/capabilities over a socketpair) and is excluded from the default sui | TS-14 cites PF-01 explicitly: the budget 'MUST be a regression threshold against a recorded baseline, never an absolute wall-clock value (PF-01, closing PAPER-50)'. These budgets are absolute wall-clock values with no recorded bas |
| TS-15 | ✅ | The real-backend layer is e2e (tests/e2e/test_e2e.py, test_revoke_lifecycle.py, test_r1_usb_claim_happy_path.py), gated out by addopts -m 'not e2e ...'. The e2e tests self-spawn a broke | [verify-upheld] Real-backend smoke is opt-in (separate marker + separate CI tier-3 job), self-spawns a scratch broker, cleans up via fixture teardown — satisfying TS-15's opt-in + self-contained-cleanup requirements. |
| TS-16 | ✅ | Sampled tests carry context-rich messages: tests/smoke/test_cli_runs.py `assert result.returncode == 0, (f"--help exited {result.returncode}; stderr:\n{result.stderr}")` and the missing | [verify-upheld] Failure messages embed context where the bare assert would be ambiguous, meeting TS-16. Code-review-enforced per §16; sampled evidence across smoke/perf/unit is strong. |
| TS-17 | ✅ | Shared broker/sock fixtures live in top-level tests/conftest.py (broker, broker_sock_path) built on the tests/_broker.py helper MODULE (functions, not fixtures). tests/contract/conftest | [verify-upheld] Fixtures discovered via the conftest hierarchy (project-wide + directory-scoped); no fixture imported across test packages. Importing the non-fixture _broker helper module is allowed (it exports functions). TS-17 m |
| TS-18 | ✅ | pyproject.toml markers register `slow: legacy marker for tests >1s wall-clock (TS-18). Deprecated.` and a 30s per-test pytest-timeout. The repo's heavy tests use the descriptive WHY-mar | [verify-upheld] `slow` is registered AND default-excluded; the project follows §13.11's guidance to prefer the descriptive marker over bare `slow`. Both the literal slow-registration and the default-exclude are present. |
| TS-19 | ✅ | pyproject.toml [tool.pytest.ini_options].markers declares the full 13-layer taxonomy with tier annotations: smoke(tier-0), e2e(tier-3), integration(tier-2), contract(tier-1), property(t | [verify-upheld] Every marker the suite uses is declared, both layer + orthogonal axes present, --strict-markers active. mgf-hrb is the documented origin of this taxonomy (docs/testing/TAXONOMY.md). TS-19 met. |
| TS-20 | ✅ | All four canonical dirs exist: tests/unit/ (mirrors src/, unmarked default), tests/integration/ (marker registered), tests/e2e/ (test_e2e.py + 2 more), tests/smoke/ (test_sdk_imports/te | [verify-upheld] Tests partitioned across the four canonical directories with per-file pytestmark, enabling `pytest -m <layer>` isolation. TS-20 met. |
| TS-21 | ✅ | tests/smoke/ with pytestmark=pytest.mark.smoke: test_sdk_imports.py verifies package import + __all__ reachability + no private leak; test_cli_runs.py exercises shortest CLI happy paths | [verify-upheld] The published library has a smoke layer covering (a) import, (b) __all__ reachability, (c) shortest happy path of public entry points (both SDK and CLI). It is the tier-0 pre-flight. TS-21 met. |
| TS-22 | ✅ | .woodpecker.yml runs `mgf-test-supervisor --tier 0-2 --skip-quarantined` (PR) and `--tier 0-3 --quarantine-attempt` (main/nightly), plus --self-check. pyproject markers carry tier annot | [verify-upheld] Tiered runs supported (--tier N-M verified in the installed supervisor's --help) and exercised in CI; marker→tier mapping encoded. TS-22 met via the published supervisor. |
| TS-23 | ✅ | CI .woodpecker.yml runs `mgf-test-supervisor --self-check` as a dedicated step + per-version `pytest` and the tiered supervisor runs (NOT plain-pytest-only for the gate). tests/smoke/te | [verify-upheld] Reproduced the self-check green in-sandbox (32.5s, the hang scenario waits). CI drives the out-of-process subprocess supervisor (no bootstrap circularity — published sibling), bounds hangs with a thread-dump timeou |
| TS-24 | ✅ | CI runs the published mgf.test_supervisor which writes per-test JSON to .gates/last-run/run.jsonl using the mgf.common.testing.TestRecord schema (records module). .gitignore ignores .ga | [verify-upheld] Per-test structured records produced by the adopted supervisor against the canonical TestRecord schema; the project consumes the published writer and gitignores the output. TS-24 met via adoption (the schema/writer |
| TS-25 | ✅ | .woodpecker.yml runs `--quarantine-attempt` (main/nightly, eviction-tracking) and `--skip-quarantined` (PRs); the installed supervisor's --help confirms --quarantine-attempt / --skip-qu | [verify-upheld] Auto-quarantine adopted via the published supervisor with both eviction (--quarantine-attempt) and skip wired in CI; the --no-skip-quarantined 'show me everything' flag exists per the rule. TS-25 (L2) met via adopt |
| TS-26 | ✅ | tests/smoke/test_broker_freshness.py (pytestmark=smoke) calls _broker.broker_is_stale() and `pytest.fail(reason, pytrace=False)` on STALE (binary older than newest .zig) and `pytest.ski | [verify-upheld] mgf-hrb ships a compiled Zig broker dependency and pins exactly the freshness check TS-26 mandates — stale→FAIL with rebuild command, missing→SKIP, fired early via a dedicated smoke test. This IS the standard's own |
| TS-27 | ✅ | The adopted mgf.test_supervisor.supervisor::_write_failure_bundle produces .gates/last-run/failures/<id>.txt per failure; mgf-hrb wires MGF_TEST_SUPERVISOR_DAEMON_PROCESS_NAME=mgf-hrb-s | [verify-upheld] Single-file per-failure bundles produced by the adopted supervisor, with mgf-hrb specifically configuring the daemon-state diagnostic (the env-var override that >=0.1.6 carries). TS-27 met via adoption + daemon-nam |
| TS-28 | ✅ | The installed supervisor's --help shows `--perf` is accepted (writer mgf.common.testing.perf_span + reader mgf.test_supervisor.perf live in the federation siblings mgf-hrb adopts). mgf- | TS-28 (L2) binds 'surfaced through the supervisor' and is satisfied by adoption per non-adoption-is-valid: the --perf surface exists in the adopted supervisor, perf_span lives in mgf.common.testing (a dependency), and capture is o |

### API_DESIGN

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| AP-01 | ✅ | src/mgf/hrb/__init__.py:99-209 — explicit sorted strings-only __all__ (60+ names, alphabetical). Per-module __all__ confirmed: domain.py, exceptions.py:54, config.py, _client.py:113, di | [verify-upheld] Tried to refute: __all__ is genuinely sorted strings-only (not list(globals())), present at every consumer boundary, and a live CI test pins it bidirectionally against the JSON. AP-01 met. |
| AP-02 | ✅ | exceptions.py:79-120 — every public exception (MgfHrbError/NotFoundError/NotPermittedError) carries intent + a '**What to do**' actionable invariants block (verified by Read). _client.p | [verify-upheld] Refute attempt: the literal '>>>' usage-example clause IS uneven — _client.py/identity.py have 0 '>>>' lines and the StrEnums/exceptions/identity functions document intent+invariants without a runnable example. But |
| AP-03 | ✅ | pyproject.toml:3 version = "0.1.2". CHANGELOG.md follows Keep a Changelog with [0.1.2]/[0.1.1]/[0.1.0] entries and an explicit 'will adhere to Semantic Versioning' statement; 0.1.1 ('No | [verify-upheld] MAJOR.MINOR.PATCH form used; project is in the 0.x window the standard's §4.3 cites; the two PATCH bumps are correctly non-breaking dep-walks. Met. |
| AP-04 | ✅ | src/mgf/hrb/cli/__init__.py:171-177 — the mgf-hrb CLI itself is the only live deprecation: main() prints a _DEPRECATION_BANNER to stderr (line 170) AND emits a DeprecationWarning ('The  | Freshly adjudicated (was not in the ✅ list). AP-04 binds the announce→survive→remove cycle for deprecated public NAMES. No public name is deprecated in the released window, so the rule is vacuously satisfied; the one deprecation p |
| AP-05 | ✅ | cli/__init__.py:75 build_parser(settings: HrbSettings \| None = None); :146 main(argv: Sequence[str] \| None = None). _client.py:610-616 connect(cls, path: str, *, client_id: int = 1, h | [verify-upheld] Refute target was the connect signature; confirmed it adds only keyword-only-with-default params (no required-param addition, no rename, no removal) across the released window. Met. |
| AP-06 | ✅ | CHANGELOG [0.1.1]/[0.1.2] both non-breaking dep-walks. Verbs return concrete frozen typed domain records (DumpAllResult/InspectFullResult/ControlOutcome/etc. enumerated in domain.py __a | [verify-upheld] No return-type narrowing or widening occurred in the non-MAJOR 0.1.1/0.1.2 releases; return contracts are pinned to concrete frozen domain types. Met for the released window. |
| AP-07 | ✅ | exceptions.py:81 MgfHrbError root subclassing the project base (_BaseError = mgf.common base, with bare-Exception fallback at line 42), with subclasses NotFoundError/NotPermittedError/C | [verify-upheld] Exceptions raised by public verbs are documented and are subclasses of the project's typed MgfHrbError hierarchy rooted at the project base. AP-07 met. |
| AP-08 | ✅ | Every src/mgf/hrb/*.py and cli/*.py begins with 'from __future__ import annotations' (__init__.py:20 confirmed by Read; the prompt's grep -L returned nothing). cli/__init__.py uses TYPE | [verify-upheld] Future-annotations present on every public module and runtime-unused type imports are TYPE_CHECKING-guarded with ruff TCH enforcing. Met. |
| AP-09 | ✅ | src/mgf/hrb/py.typed exists (0-byte marker, confirmed by ls). pyproject [tool.hatch.build.targets.wheel] packages=['src/mgf'] walks the tree so the wheel ships it. .woodpecker.yml typec | [verify-upheld] PEP 561 py.typed present + packaged; mypy --strict is a CI gate. Met. |
| AP-10 | ✅ | PUBLIC_API.md (19965 bytes) lists every public name with Kind/Notes columns; PUBLIC_API.json companion. tests/conformance/test_public_api_pins.py enforces JSON per-module 'all' == runti | [verify-upheld] Canonical PUBLIC_API.md + machine-readable JSON list every public name and a live CI test keeps names in sync with __all__. The stale JSON 'version' field is a real drift but feeds AP-13, not AP-10's name-coverage  |
| AP-11 | ✅ | PUBLIC_API.md header §'Stability tier (AP-11)' (read directly): 'Pre-0.1.0. Everything below is experimental until the SDK reaches its first published release. Names may change; behavio | Freshly adjudicated (was not in the ✅ list). AP-11 requires tiers be declared per public name; the doc declares the whole 0.x surface uniformly 'experimental' (a legitimate blanket declaration for a pre-stable library, matching th |
| AP-12 | ✅ | CHANGELOG.md uses Keep a Changelog structure (### Added/Changed/Security headings in the 0.1.0 body; [Unreleased] block present). The released window 0.1.0→0.1.2 contains NO breaking pu | [verify-upheld] AP-12's migration-recipe clause binds only when a breaking change ships; none has in the released window, and the CHANGELOG is structurally ready to carry recipes. Vacuously-correct for the breaking clause + struct |
| AP-13 | ✅ | __version__ = "0.1.2" at src/mgf/hrb/__init__.py:97 mirrors pyproject.toml:3 version="0.1.2" — the attribute is present and currently in sync. BUT: grep across tests/ found NO version-s | Freshly adjudicated (was not in the ✅ list). AP-13 has two clauses: (1) __version__ present + mirrors pyproject — currently MET; (2) 'CI MUST lint that the two stay in sync' — NOT MET (no version-sync test exists). The stale PUBLI — FIXED 2026-06-09: PUBLIC_API.json version synced 0.1.0→0.1.2 (mirrors __version__+pyproject) + a version-mirror pin test + CI tag-coherence |
| AP-14 | ✅ | All implementation in single-underscore private modules (_client.py, _shm.py, cli/_doctor.py/_explain.py/_info.py/_scan.py), re-exported through public __init__.py __all__ (e.g. Client/ | [verify-upheld] Refute target was whether import-linter truly enforces the _-module closed-box. The TWO live contracts are PR-01/PR-06 (UI-framework forbids) NOT a dedicated _-module/consumer-test forbidden contract — so the liter |
| AP-15 | ✅ | No backward-compat re-export shim module exists in src/mgf/hrb/ (grep for module-level warnings.warn on import found only exceptions.py:45 [an ImportWarning fallback, not a deprecation  | Freshly adjudicated (was not in the ✅ list). AP-15 binds shims that survive removal of original code and re-export an old name — no such surviving re-export shim with a silent path exists. The one deprecated surface (the CLI) is l |
| AP-16 | ✅ | pyproject.toml pins the cornerstone with the federation window `mgf-common[standards]>=0.46,<1.0` (floor kept, ceiling <1.0 per API_DESIGN §4.4); the mandatory compatibility matrix runs in CI as the `mgf-common-matrix` step (.woodpecker.yml:227), exercising the suite against the declared floor. | Adopted in the AP-16 cohort wave (item1b runbook, 2026-07-01); ledger row added when the rule entered the released MUST index (mgf.standard 0.1.61 reconciled the count 264→265). |

### SCOPE

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| SP-01 | ✅ | No SCOPE.md or explicit IN-scope list anywhere in the repo. `find . -iname '*scope*'` returns only design/conformance docs; `grep -niE 'in scope' README.md STARTHERE.md INDEX.md DECISIO | MUST publish an explicit IN-scope list. Even a broker-client+CLI must state what it ships (the socket client, the CLI surface, the transport seam, the domain types) as the bar PRs clear — this is the artifact, not just a prose pur — FIXED 2026-06-09: SCOPE.md §1 |
| SP-02 | ✅ | No OUT-of-scope list with reasoning exists. `grep -rilE 'out.of.scope'` hits only the conformance ledger and design docs; the sole README/STARTHERE 'out of scope' mention (STARTHERE.md: | MUST publish an explicit OUT-of-scope list with per-entry reasoning. For this package the obvious OUT entries are highly relevant (the privileged Zig broker/kernel internals — out, lives in separate repos hrb-cap/kabi/model/rt; GU — FIXED 2026-06-09: SCOPE.md §2 |
| SP-03 | ✅ | CONTRIBUTING.md (read in full, 103 lines) defines the PR process (branch, gates, CHANGELOG, PUBLIC_API delta, DECISIONS entry) but has NO scope-creep review question — no requirement th | MUST require every new-module/new-function PR to justify against §1 or §3. The gate is absent from the contributor guide and the underlying scope sections it would reference do not exist. Smallest fix: add the §4 'Is this §1 / §3 — FIXED 2026-06-09: SCOPE.md §3 |
| SP-04 | ✅ | No Adjacent-scope (§3) list exists, so no items carry a documented consumer-demand promotion criterion. FEEDBACK.md exists (the would-be ≥2-consumer demand channel — confirmed at FEEDBA | MUST require Adjacent items to carry a documented demand signal before promotion to IN. The demand-signal mechanism (FEEDBACK.md) is in place, but the Adjacent list and its per-item promotion criteria — the thing this rule governs — FIXED 2026-06-09: SCOPE.md §4 |
| SP-05 | ✅ | No OUT-of-scope list exists (see SP-02), therefore no ecosystem-alternative citations exist for any cut. `grep -rniE 'use instead\|instead use\|alternative'` across docs returns only un | MUST cite the ecosystem alternative for every OUT cut. With no OUT list, zero cuts carry a citation. Smallest fix: when adding §2 OUT to SCOPE.md, give each row a 'what to use instead' citation (e.g., kernel/privileged enforcement — FIXED 2026-06-09: SCOPE.md §5 |
| SP-06 | ✅ | No scope document exists, so there is no 'revisit on every MAJOR release' clause and no §6 versioning table. CHANGELOG.md has no SCOPE.md / scope-policy / SP-0x entries (`grep -niE 'SCO | MUST revisit scope policy on every MAJOR release (the only place a previously-IN item may be removed, per AP-04 deprecation). The policy itself is absent, so the revisit cadence cannot exist. Smallest fix: add §6 'Versioning of th — FIXED 2026-06-09: SCOPE.md §6 |

### WORKFLOWS

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| WF-01 | ✅ | .woodpecker.yml top-level `when:` lists `event: push`, `event: pull_request`, `event: manual`, `event: cron`. Every push to main and every PR triggers the run; supervisor-tier-0-3 addit | CI runs on every push to the long-lived branch and every PR. Platform branch-protection is the operator's half; the workflow satisfies its half. Met. |
| WF-02 | ✅ | [verify-upheld] The cited line numbers (75-94/130/141/152) DO NOT match the actual file (it is ~155 lines, structured differently), but the SUBSTANCE holds: the `lint` step runs `ruff c | Refute attempt: the verdict's line citations are fabricated, but adjudicating against the real file confirms all four green gates are present and CI-enforced as separate non-swallowed steps. The four-gate floor is met. Upheld desp |
| WF-03 | ✅ | The .woodpecker.yml has NO publish step. The file's own header comment states: 'No publish flow today — mgf-hrb is not on PyPI. When it lands, copy the publish steps verbatim from mgf-c | WF-03 requires a tag-driven publish workflow targeting the Codeberg registry for any mgf-* package. mgf-hrb publishes (release tags exist), so the rule applies and is unmet — there is no tag-gated publish step at all. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-04 | ✅ | No publish step exists, hence no `codeberg_package_token` `from_secret` reference and no tag-event-scoped secret. The header comment defers this to a future copy from mgf-common. | WF-04 (publish credential in CI secret store, tag-event-scoped, no OIDC) cannot be satisfied without a publish flow. For a package that ships releases, the absence is a real gap, not N/A. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-05 | ✅ | No tag-coherence check (TAG_VERSION vs pyproject `version` vs `__version__`) exists in .woodpecker.yml because there is no publish workflow. Source has __version__ = '0.1.2' in src/mgf/ | WF-05 requires the publish workflow to verify tag↔pyproject↔__version__ coherence before upload. With no publish flow, the check is absent. Unmet. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-06 | ✅ | No publish/build step exists. Worse, the stale-artifact footgun WF-06 warns against is LIVE in the repo: `dist/` contains mgf_hrb-0.1.1-py3-none-any.whl and mgf_hrb-0.1.1.tar.gz while t | WF-06 requires the uploaded wheel be freshly built in the publish run. No publish flow + a stale 0.1.1 dist/ alongside a 0.1.2 source means the rule is unmet and the hazard it guards is already present. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-07 | ✅ | No pre-publish smoke step (ephemeral venv install of the freshly-built wheel + `import mgf.hrb` + `__version__` assert + `mgf-hrb --version` console-script invocation) exists, since the | WF-07 requires pre-publish wheel-smoke. Absent. Especially relevant here because the package ships a console script (`mgf-hrb`), whose entry-point WF-07 §3.2 explicitly says to smoke. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-08 | ✅ | No post-publish verify step polling `…/api/v1/packages/magogi-admin/pypi/mgf-hrb/<version>` for 200 exists; no publish workflow at all. | WF-08 requires post-publish registry verification. Absent because the publish flow is unbuilt. Unmet. — FIXED 2026-06-09: tag-driven Codeberg publish chain added to the existing CI (build→tag-coherence→smoke→publish→verify-codeberg) + scripts/verify_codeberg.py |
| WF-09 | ✅ | [verify-upheld] The cited line numbers don't match the actual file, but every step's `image:` is a pinned rolling-minor interpreter: python:3.13-slim (lint, typecheck, zig-build-and-tes | Refute attempt: confirmed no unpinned/`latest` image refs and a lockfile present. WF-09's literal MUST (pin every external dependency; python:3.X-slim not python:slim) is satisfied. Upheld. |
| WF-10 | ✅ | [verify-upheld] lint, typecheck, zig-build-and-test have no `depends_on` → run in parallel. The three test-3.{11,12,13} steps each `depends_on: [zig-build-and-test]` only (the genuine d | Refute attempt: independent gates run in parallel; serial `depends_on` is used only for genuine dependencies (broker-binary-before-test, self-check-before-tier). Version axis fans out. WF-10 satisfied. Upheld. |
| WF-11 | ⏳ | uv.lock IS checked in, the daemon env var is declared in-workflow (`MGF_TEST_SUPERVISOR_DAEMON_PROCESS_NAME`), and no host-machine state is referenced. BUT every step installs via `pip  | WF-11 (reproducible from inputs alone) is partially met — no host state, env declared — but CI resolving deps fresh from pyproject ranges (e.g. `mgf-common>=0.41,<0.47`) rather than the committed lock means re-runs can pull differ |
| WF-12 | ✅ | [verify-upheld] `grep -E '\\|\\| true\|2>/dev/null'` over .woodpecker.yml returns nothing — no error-swallowing constructs. Each step runs in its own fresh python:X-slim container doing | Refute attempt: confirmed no `\|\| true`, no `2>/dev/null`, no green-tick-for-skipped patterns. Every step's command and exit code surfaces. WF-12 satisfied. Upheld. |
| WF-13 | N/A | .woodpecker.yml header carries no 'GENERATED — do not hand-edit' marker; file is hand-authored (bespoke Zig+Python pipeline, not regen'd from a template). | WF-13 governs generated .woodpecker.yml artifacts. mgf-hrb ships a hand-maintained pipeline; not applicable. |
| WF-14 | N/A | CI installs resolve via `pip` (no `uv` verb in .woodpecker.yml). | New MUST, corpus v3.3.0 (DP-5/CIR-04). WF-14 binds CI `uv` verbs; N/A here. |

### RELEASING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| REL-01 | ✅ | `git cat-file -t` returns: v0.1.0=tag, v0.1.1=tag, v0.1.2=commit. v0.1.2 is a LIGHTWEIGHT tag, not annotated (no taggername/date/message metadata — `git for-each-ref refs/tags/v0.1.2` s | REL-01 requires every release to have an ANNOTATED v<version> tag on the exact commit that built the published wheel. v0.1.2 is lightweight (violates 'annotated tags only', §3.1), and no wheel was actually published for any versio — FIXED 2026-06-09: release tags re-annotated (v0.1.2) on the same build commits + force-pushed (annotated, GC-safe; no content change). 0 lightweight v-tags remain. |
| REL-02 | ✅ | [verify-upheld] Three CHANGELOG sections [0.1.0]/[0.1.1]/[0.1.2] with three matching tags; versions strictly increasing. dist/ holds ONLY mgf_hrb-0.1.1-py3-none-any.whl + .tar.gz (both  | Tried to refute by hunting for a re-stamped wheel: the only dist/ artifact is an older version's (0.1.1), not a rebuilt 0.1.2-labelled wheel. No same-version content swap exists; bump-then-build discipline holds. Upheld. |
| REL-03 | ✅ | PUBLIC_API.json::version = "0.1.0" (grep), but pyproject.toml and __init__.py are both 0.1.2 — the JSON was NOT regenerated after the 0.1.1/0.1.2 bumps, so its version is stale by two v | REL-03 requires PUBLIC_API.json::__version__ to track the surface and carry the master-HEAD/verify-via-pip banner. The JSON version drifted to 0.1.0 (stale) and the REL-03 banner is absent. Unmet. — FIXED 2026-06-09: PUBLIC_API.md master-HEAD banner added |
| REL-04 | ✅ | No publish/write token appears in chat, env, or the workflow: .woodpecker.yml has no `from_secret`/`TWINE_`/publish step (no publish flow exists). The only token reference is pyproject. | REL-04 forbids passing publish tokens via chat/shell-history/env in unmanaged sessions and mandates smallest-scope tokens. No write token is mishandled anywhere, and the documented consumer auth is correctly scoped to read:package |
| REL-05 | ✅ | [verify-upheld] Versions are strictly forward-only (0.1.0→0.1.1→0.1.2) per CHANGELOG + three tags; 0.1.1/0.1.2 are pin walks shipped as fresh versions ('<0.46', '<0.47'), not in-place e | Tried to refute by looking for a content swap of an already-resolved version: none exists. The release record shows strict supersession with one version per content set; immutability-by-policy is not contradicted. Upheld. |
| REL-06 | ✅ | The ordered flow (bump → regen PUBLIC_API.json → build → test → twine check → commit → tag → push → upload → REST verify) is not satisfied: PUBLIC_API.json was NOT regenerated (still ve | Multiple ordered-flow steps are missing or out of order: the regen-JSON step did not run for 0.1.1/0.1.2, and the build→twine-check→upload→verify tail does not exist. A release that never reaches the publish steps and ships a stal — FIXED 2026-06-09: ordered tag→build→tag-coherence→smoke→publish→verify |
| REL-07 | N/A | The 0.1.1 and 0.1.2 release commits are pure mgf-common pin walks ('<0.46', '<0.47'; CHANGELOG: 'No API change' / 'CLI-only release ... no library surface change') and close zero FEEDBA | REL-07 requires a release commit to flip every FEEDBACK entry it ships to SHIPPED. None of the three 0.1.x release commits ship a FEEDBACK entry (the pin-walk releases ship no feature; FEEDBACK closures are tracked against feature |
| REL-08 | ✅ | No evidence of an ephemeral-venv smoke against the actually-built wheel: the 0.1.2 wheel was never built (dist/ holds only the Jun-4 0.1.1 wheel), and no SBOM exists (`ls dist/*.cdx.jso | REL-08 requires pre-release smoke that installs and imports the freshly-built wheel. The current release version (0.1.2) has no built wheel to smoke, no smoke record exists for any version, and the companion SBOM gate is unmet. Th — FIXED 2026-06-09: smoke installs the wheel + imports mgf.hrb before publish |
| REL-09 | N/A | No `docs/cutover/` directory exists (`ls docs/cutover` → not found). The 0.1.1/0.1.2 releases are pin walks that close no FEEDBACK entries (see REL-07), so no status flip occurred that  | REL-09 fires only when a release flips a FEEDBACK entry's status. Since the 0.1.x releases close no FEEDBACK entries, there is no closure that owes a consumer notification paragraph — the rule does not apply to these releases. |

### PACKAGE_DISTRIBUTION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PKG-01 | ⏳ | Consumer-side resolution IS Codeberg-bound: pyproject.toml:226-233 (named index codeberg-mgf + [tool.uv.sources] for mgf-common/mgf-test-supervisor) and uv.lock:418/455-456/470 resolve  | The CONSUME half of PKG-01 conforms, but the PUBLISH half does not — there is no committed flow that publishes mgf-hrb to Codeberg; the only publish path defaults to PyPI. Partially met → ⏳. |
| PKG-02 | ✅ | [verify-upheld] Every committed registry endpoint is the canonical §3 form: pyproject.toml:228 simple index `https://codeberg.org/api/packages/magogi-admin/pypi/simple/`; uv.lock:418/47 | Refute attempt: I checked the publish script's documented URL and all lock/pyproject endpoints — all match §3 exactly with no hand-typed variants. The fact that publish-wheel defaults to PyPI is a PKG-01/12 cutover gap, not a malf |
| PKG-03 | ✅ | No CI publish exists (.woodpecker.yml:53-55 — 'No publish flow today'), so there is no codeberg_package_token tag-scoped Woodpecker secret to evaluate, and no write:package CI token in  | The Codeberg-token auth model (write:package, REL-04 storage, tag-scoped CI secret) is not yet realized — the token surface is still PyPI-shaped and CI publishing is absent. Not met → ⏳. — FIXED 2026-06-09: publish uses codeberg_package_token secret-token |
| PKG-04 | ✅ | .woodpecker.yml:53-55 explicitly states there is no publish flow ('When it lands, copy the publish steps verbatim from mgf-common/.woodpecker.yml (tag-coherence → smoke → publish → veri | Neither CI nor the local script implements the ordered publish ritual (check + REST-verify + tag steps absent). Not met → ⏳. — FIXED 2026-06-09: ordered publish ritual |
| PKG-05 | ✅ | There is no post-publish verification at all: .woodpecker.yml has no verify step (the comment at :54 even names the OLD 'verify-pypi' target as the model to copy later), and scripts/pub | No Codeberg REST verification exists in any committed flow. Not met → ⏳. — FIXED 2026-06-09: verify-codeberg REST poll |
| PKG-06 | ✅ | [verify-upheld] pyproject.toml:226-233 is the canonical dependency-confusion-safe shape: `[[tool.uv.index]] name="codeberg-mgf" url=".../pypi/simple/" explicit = true` + `[tool.uv.sourc | Refute attempt: I verified every mgf-* direct dep is named-index-mapped with explicit=true and that no bare extra-index-url is committed. The spec-bound drift is a PKG-11/lock-staleness nuance, not a PKG-06 confusion-surface. Uphe |
| PKG-07 | N/A | Immutability/re-upload-recovery is a release-session operational policy for a published package. mgf-hrb has no committed publish flow (.woodpecker.yml:53-55) and no published-to-Codebe | No publish history or re-upload event exists to evaluate against this policy rule — not applicable to the current repo state. |
| PKG-08 | N/A | Retention/quota policy is an account-level (magogi-admin registry-operator) concern. Nothing in mgf-hrb (a single consumer/SDK repo) implements or owns the federation-wide retention pru | Account-quota retention is a registry-operator responsibility outside a single sibling package's scope — N/A for this repo, consistent with prior siblings. |
| PKG-09 | ✅ | .woodpecker.yml:53-55 — 'No publish flow today — mgf-hrb is not on PyPI. When it lands, copy the publish steps verbatim from mgf-common/.woodpecker.yml (tag-coherence → smoke → publish  | CI publishing is entirely absent. Not met → ⏳. — FIXED 2026-06-09: tag-driven secret-token publish step |
| PKG-10 | ✅ | [verify-upheld] NM-conformant: pyproject.toml:2 distribution name `name = "mgf-hrb"` (hyphenated); import package is dotted `mgf.hrb` (src/mgf/hrb/, pyproject.toml:55 `packages = ["src/ | Refute attempt: I confirmed hyphenated dist name + dotted import + PEP-503 wheel normalization and found no pypi.org-project canonical URL for the package. Upheld; PKG-10 defers to NAMING which is satisfied. |
| PKG-11 | ✅ | [verify-upheld] The only resolved-version surface in the repo (uv.lock) binds sibling resolution to Codeberg, not pypi.org: uv.lock:455-456 pin mgf-common and mgf-test-supervisor with ` | Refute attempt: grepped all .py/.toml for sibling-version checks and pypi.org; the only pypi.org hit is a third-party doc link, and sibling resolution binds to Codeberg. Minor: uv.lock mgf-common spec (`<0.46`) lags pyproject (`<0 |
| PKG-12 | ⏳ | Residual pypi.org PUBLISH surface remains: scripts/publish-wheel defaults to PyPI ('$PUBLISH_URL index URL (default: PyPI)', line 19; line 61-64 `uv publish --token` with no URL = PyPI  | The publish path still defaults to a pypi.org mgf-* publish target and the mandated no-pypi-surface grep gate (the cornerstone enforcement) is not copied in. Not met → ⏳. |

### DOCUMENTATION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DOC-01 | ✅ | ls -la repo root: README.md, LICENSE, CHANGELOG.md, CONTRIBUTING.md, SECURITY.md, FEEDBACK.md, AGENTS.md, STARTHERE.md, DEPS.md, FEDERATION.md all present, plus docs/ dir + library-only | [verify-upheld] Full uniform ten-doc baseline + docs/ + the library-only PUBLIC_API pair all present at root. No baseline doc missing; matches §2.0.1 matrix for a federation sibling. |
| DOC-02 | ✅ | docs/ contains standards/ (pointer-only README per §2.0.4: docs/standards/README.md L1-10), claude/CLAUDE.md, inprogress/ (MGF_STANDARDS_CONFORMANCE.md, POST_PRESENTATION_TRACKER.md, RO | Non-root docs are organised into the six-bucket hierarchy applicable to a federation sibling. docs/standards/ is correctly a pointer-only README that does not duplicate cornerstone content (DOC-02 §2.0.4). reference/ and cutover/  |
| DOC-03 | ✅ | Bucket READMEs present: docs/standards/README.md, docs/outbound/README.md, recipes/README.md (charter L1-21). MISSING: docs/inprogress/README.md, docs/claude/README.md, docs/testing/REA | DOC-03 requires every long-lived bucket to have its own README.md charter. docs/inprogress/ (3 trackers), docs/claude/, and docs/testing/ (6 component docs) are long-lived buckets with no charter README. Smallest fix: add a one-pa — FIXED 2026-06-09: docs/{inprogress,claude,testing}/ bucket READMEs added (charters) |
| DOC-04 | ✅ | CHANGELOG.md: Keep a Changelog format, [Unreleased] + dated [0.1.2]/[0.1.1]/[0.1.0] sections. Refuted the specific commit then RE-confirmed it: `git show --stat 965e3d4` touches CHANGEL | [verify-upheld] The cited same-commit-discipline example is accurate (965e3d4 = feat touching CHANGELOG + _client.py + a contract test together). Format is Keep-a-Changelog conformant. The verdict's wording ('feat') and file set c |
| DOC-05 | N/A | No docs/cutover/ directory (`ls docs/cutover` → No such file or directory). CHANGELOG.md shows only [0.1.0] (inaugural, 2026-06-02), [0.1.1] (mgf-common 0.45 walk), [0.1.2] (mgf-common  | DOC-05 binds only when a breaking change (MAJOR, or MINOR within 0.x per AP-03) ships. mgf-hrb has shipped no breaking change — 0.1.0 is the inaugural release and 0.1.1/0.1.2 are additive federation-cohort walks. The cutover-guide |
| DOC-06 | ✅ | grep headings: ROADMAP.md = §1 Status snapshot → §2 In-flight (active queue) → §3 Pending-scheduled → §4 Tier-1 work → §5 hardware-gated, with per-item ✅ CLOSED markers carrying dates.  | [verify-upheld] Both living trackers follow the DOC-06/§3.1 six-section shape (priority table → work units with acceptance criteria → closed items → cross-refs) with status-flipped, dated, falsifiable items. |
| DOC-07 | ✅ | docs/claude/CLAUDE.md (379 lines): mgf-common auto-managed BEGIN/END block, Standing instructions + topic table, 'The top-30 most-violated rules' inline (DP/EH/LG/CF/SC/TS/AP), 'Quick s | [verify-upheld] Dense-lookup AI-agent entry point with the §4 key sections (file map='Where things live', cross-cutting patterns=top-30 rules, build=bootstrapping/gates, pitfalls=Gotchas). Uses topical headings rather than literal |
| DOC-08 | ✅ | PUBLIC_API.json present (machine-readable, $schema_note cites DOC-08/AP-10), generated by scripts/regenerate_public_api.py (docstring L2-25: 'Regenerate PUBLIC_API.json from each module | PUBLIC_API.json is generated from __all__ and pinned in CI against the live __all__ in both directions, satisfying the machine-companion pin. (Note: json version=0.1.0 vs pyproject 0.1.2 is a separate AP-13 version-drift concern,  |
| DOC-09 | ✅ | tests/conformance/test_public_api_pins.py — test_every_listed_module_matches_runtime_all imports each documented module and asserts the JSON `all` list equals the module's runtime __all | DOC-09 is satisfied by option (a): a CI lint that verifies referenced names exist (the canonical PUBLIC_API shape). Name-existence drift is fail-fast in CI. The behavioral-verification clause is a SHOULD; the MUST floor (name-exis |
| DOC-10 | ✅ | FEEDBACK.md: §1 Process severity table (🔴/🟡/🟢/💭) + OPEN→ACCEPTED→SCHEDULED→SHIPPED lifecycle table; 23 severity-marker hits, 18 PAPER/PREFIX-NN entry blocks; maintainer trackers (ROADMA | [verify-upheld] Consumer signal (FEEDBACK PREFIX-NN papers with severity + lifecycle) and internal posture (inprogress trackers) are kept on separate non-overlapping surfaces, per DOC-10. |
| DOC-11 | ✅ | docs/inprogress/ holds three active trackers (ROADMAP.md with live §2 In-flight queue + numerous §3/§4 ✅ CLOSED items dated, POST_PRESENTATION_TRACKER.md with §4 Closed items, MGF_STAND | [verify-upheld] inprogress is used as a workspace with active queues; no fully-closed-for-a-cycle tracker is sitting unarchived. DOC-11 is a maintenance signal, met. |
| DOC-12 | ✅ | grep of README links: relative links to docs/inprogress/MGF_STANDARDS_CONFORMANCE.md, STARTHERE.md, hrb-design/…, hrb-code/src/conformance.zig (repo-rooted path); the ONLY absolute URL  | [verify-upheld] Agent-navigable: relative links, repo-rooted file paths, hierarchical numbered headings in trackers; absolute URL reserved for the cross-repo reference. (CLAUDE.md uses topical headings — a soft deviation, not a vi |
| DOC-13 | ✅ | FEEDBACK.md §1 states papers are about mgf-hrb's own surface and mirrors the federation shape. docs/outbound/README.md routes sibling-targeted fixes via a git-apply patch table: LOG-01- | [verify-upheld] Repo-scoped FEEDBACK with a documented outbound seam (docs/outbound/) for sibling-targeted papers — exactly the DOC-13/FB-04 discipline. |
| DOC-14 | N/A | README.md L4 declares shape: 'Federation Python library (sibling of mgf-common)'. No docs/inprogress/MGF_ADOPTION.md or docs/MGF_ADOPTION.md exists. | DOC-14 / ADP-04 explicitly carve out federation siblings: they do NOT maintain MGF_ADOPTION.md — their adoption relationship to mgf-common lives in mgf-common's federation_roadmap.md + their own CHANGELOG. mgf-hrb is a sibling, so |
| DOC-15 | ✅ | docs/inprogress/MGF_STANDARDS_CONFORMANCE.md exists at the canonical path; README.md line 5 declares 'Conformance level. L2 — Standard' and links the tracker '§4 audit log'. The tracker | [verify-upheld] The conformance tracker is present at the canonical path; README + the tracker itself both declare L2 (CFM-01 satisfied). The docs/standards/README L1 line is a stale secondary mention (a real cleanup item) but doe |
| DOC-16 | ✅ | DEPS.md at root: §1 'What mgf-hrb depends on' (mgf-common cornerstone runtime + dev-extra deps + in-repo Zig broker as a build component), §2 'Who depends on mgf-hrb' (hrb-app 55 import | [verify-upheld] Bidirectional dependency manifest with both directions present (§1 deps + §2 dependents with import-site counts), exactly the DOC-16 shape; §2 subsumes the former USERS.md roster. |
| DOC-17 | ✅ | FEDERATION.md (837 bytes): '# FEDERATION — pointer'; 'The federation contract is not maintained here — there is one canonical copy'; links the canonical mgf-standard/FEDERATION.md;  | [verify-upheld] Sibling ships FEDERATION.md as a pointer stub, not a copy — DOC-17 conformant. |
| DOC-18 | ✅ | DEPS.md present at repo root: §1 'What mgf-hrb depends on' (mgf-common >=0.40,<0.41 + dev-extra table), §2 'Who depends on mgf-hrb' (hrb-app 55 import sites, vm-vmanager-app, figrecover | The DEPS.md bidirectional manifest is present and complete in both directions with a sync/verification discipline (import survey before MINOR releases). DOC-18's ripple-rule for the DEPS surface is satisfied: the file shows both s |
| DOC-19 | ✅ | LESSON_LEARNED.md at root: append-only/dated header ('Newest first … never rewrite history'), cites DOC-19 + the lesson-learned template, with a seeded 2026-06-07 'File seeded (DOC-19 a | [verify-upheld] A seeded file with no real lessons yet is conformant per DOC-19 (presence is the bar); the file exists at root with the correct append-only/supersede discipline header. |

### OPERABILITY

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| OP-01 | ⏳ | src/mgf/hrb/cli/__init__.py:89 — `p.add_argument("--version", action="version", version=f"mgf-hrb {__version__}")`; __version__ = "0.1.2" (src/mgf/hrb/__init__.py:97). No git commit SHA | OP-01 requires a RICH version: package version + git SHA built into the artefact + active environment label + load-bearing runtime info (Python version, key dep versions, OS/arch). `mgf-hrb --version` prints only `mgf-hrb 0.1.2` — |
| OP-02 | ✅ | src/mgf/hrb/cli/_doctor.py:35 `doctor_command(*, socket_path)`; wired in src/mgf/hrb/cli/__init__.py:113-116 (subparser) + :201-203 (dispatch). It runs diagnostics.run_all (src/mgf/hrb/ | [verify-upheld] Refute attempt failed. doctor_command genuinely exists, is wired into both the subparser and the dispatch, and probes the app's own preconditions (not a generic host scan) with a pass/fail checklist + remediation p |
| OP-03 | ✅ | pyproject.toml has NO `[project.urls]` table at all — there is no Homepage / Documentation / Issues key (grep over the whole file finds only the [[tool.uv.index]] codeberg package-regis | OP-03 requires pyproject's Homepage/Documentation/Issues URLs to be present + resolve, and CI to verify (HEAD lint or at minimum a placeholder-grep). With NO project URLs declared at all, PyPI/Codeberg metadata gives bug-filers no — FIXED 2026-06-09: CI no-placeholder grep in lint step |
| OP-04 | ⏳ | README.md:4 states the project `pins \`mgf-common>=0.38,<0.39\``, but pyproject.toml:12 actually pins `"mgf-common>=0.41,<0.47"`. README.md:6 also asserts headline counts (308 Zig tests | OP-04 requires headline facts in README to match reality, calling out a wrong dep pin (`mgf-common = \"0.25,<0.26\"` in README vs reality) as the canonical failure. The README dep-pin (0.38,<0.39) is stale against the real pin (0. |
| OP-05 | ⏳ | src/mgf/hrb/cli/_explain.py — `explain <topic>` is a HARDWARE/tool explainer (topics: usb, pci, doctor) printing ASCII topology diagrams + vocabulary, wired at __init__.py:118-130/:204- | OP-05 requires the active configuration to be inspectable from a running app (`<app> explain` printing the active settings with each field's source + secrets redacted, mirroring `mgf-common explain` over MgfSettings). The hrb `exp |
| OP-06 | ⏳ | No `logs` subcommand exists. The argparse subparsers (src/mgf/hrb/cli/__init__.py:100-130) are only scan / info / doctor / explain. grep for a logs/tail command in src/mgf/hrb/cli/ retu | OP-06 requires recent logs to be accessible without source-tree path knowledge — for a CLI, an `<app> logs` command tailing the rotating file. mgf-hrb ships none. Gap: add `mgf-hrb logs` that tails the rotating-file sink (the mgf- |
| OP-07 | ⏳ | No `bundle` / diagnostic-tarball subcommand exists (subparsers are scan/info/doctor/explain only; grep for bundle/tarball in src/ returns nothing). The pieces exist (doctor output; mgf- | OP-07 requires a `bundle` command producing one attachable `<app>-bundle-<timestamp>.tar.gz` (redacted config + last N log lines + crash reports + doctor output + system info, all Redactor-scrubbed). mgf-hrb ships no such command. |
| OP-08 | N/A | mgf-hrb is a socket CLIENT + CLI; it owns no state directory of its own. grep for XDG_STATE/state_dir/crash-dir/RotatingFileHandler/maxBytes/backupCount in src/ finds no hrb-owned state | OP-08 binds whoever OWNS the growing state directory. This package creates no crash dir, no rotating logs, no ephemeral cache of its own — the only retention-bearing infra (crash reports, log rotation) is mgf-common's, applied und |
| OP-09 | N/A | mgf-hrb is a user-facing client + CLI (project.scripts mgf-hrb = mgf.hrb.cli:main, pyproject.toml:42-43), not a deployed multi-user service. There is no `environment=production` listene | OP-09 is a service-only rule (Applies to: service) — production safety guards refusing dev-shaped values before a listener opens. mgf-hrb has no production-listener shape, so it does not apply. |
| OP-10 | N/A | No production container/k8s/compose manifest in the repo; mgf-hrb is distributed as a pip wheel (hatchling build, pyproject.toml build-system) consumed by clients, not as a deployed `im | OP-10 is a service-only rule (versioned deployable artefacts + rollback for `image:` manifests). mgf-hrb ships no deployable image and has no production deploy/rollback story of its own, so it does not apply. |
| OP-11 | N/A | No Prometheus alert rules, alertmanager config, paging path, or docs/runbooks/ in the repo (it is a client SDK + CLI). No alerting surface exists. | OP-11 is a service-only rule (alerts page humans + carry runbooks). A single-user CLI/client has no alerting/on-call surface, so it does not apply. |
| OP-12 | N/A | No backup script, no S3/R2/GCS target, no docs/drills/ directory, no restore-drill artefact in the repo. mgf-hrb persists no data store of its own (it is a socket client). | OP-12 is a service-only rule (backup+restore drill against a real target). mgf-hrb owns no persistent data store to back up, so it does not apply. |

### DEPLOYMENT

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DEP-01 | N/A | DEPLOYMENT.md §Scope L7-18 binds 'stateful web-service consumer applications'; L20-21 Out-of-scope: 'Federation libraries (no runtime)'. DEP-01 rule 'Applies to: service'. mgf-hrb decla | No cloud infrastructure exists for a wheel-published SDK+CLI. The only privileged component (the Zig broker daemon) lives in separate concerns/repos and is out of this package's scope; this package never provisions VMs/LBs/DNS/buc |
| DEP-02 | N/A | DEP-02 'Applies to: service'; standard L793 'platform owns the VM lifecycle -> DEP-02 is N/A', L758 'DEP-02 does not apply (no VM)'. mgf-hrb owns no production VM/container image — dist | No production VM or container image is owned by this federation library; there is no VM state to express as config-as-code. |
| DEP-03 | N/A | DEP-03 'Applies to: service' — governs deploy-time artefact resolution for a running service (L298-315 'deploy script MUST check out a SHA', 'install only from the lock at deploy time') | There is no deploy step that resolves and installs this package onto production hosts; artefact-immutability at the library boundary is covered by REL/PKG, not the DEPLOYMENT family which targets service deploys. |
| DEP-04 | N/A | DEP-04 'Applies to: service' — production secrets (DB creds, TLS keys, OAuth) for a deployed web service stored in Ansible Vault/KMS. mgf-hrb owns no production deployment and no such s | A library+CLI client deployed nowhere holds no production service secrets; secret-at-rest management is not bound for a federation sibling. |
| DEP-05 | N/A | DEP-05 'Applies to: service' — deploy/backup/restore/rollback scripts must take an env arg (prod/staging/dev). mgf-hrb has no deploy/scripts/deploy.sh and no environment-targeted operat | There are no production deploy/backup/restore scripts because the package is not deployed to environments; the env-explicit discipline has nothing to bind. |
| DEP-06 | N/A | DEP-06 'Applies to: service' — release rollback runbook (blue/green, symlink-swap, snapshot-restore) for a deployed service. mgf-hrb has no production release rollout to reverse (no dep | No production deploy exists to make reversible; deploy-rollback discipline does not bind a wheel-published federation library. |
| DEP-07 | N/A | DEP-07 'Applies to: service' — 'Every web-service consumer MUST organise deployment artefacts in a top-level deploy/ directory'. mgf-hrb is explicitly a federation library (README.md L4 | The deploy/ directory shape requirement is gated on the web-service-consumer shape; a federation sibling does not carry a deploy/ tree. |
| DEP-08 | N/A | DEP-08 'Applies to: service' — production metrics/logs/traces flow to a queryable sink + committed deploy/docs/slo.md + paging alerts. mgf-hrb runs no production service; no deploy/docs | There is no running production service to observe end-to-end; the SLO/burn-rate/paging contract has no deployed target for a federation library. |
| DEP-09 | N/A | DEP-09 'Applies to: service' — DNS records in IaC + auto-renewed TLS certs for a deployed service. mgf-hrb owns no hostname, DNS records, or TLS endpoint (no terraform, no deploy/docs/d | A library that talks to a local broker over a unix socket exposes no DNS/TLS surface; DNS+TLS management does not bind. |
| DEP-10 | N/A | DEP-10 'Applies to: service' — deploy/docs/first-production-cut.md documenting green-field cloud provisioning (terraform apply -> ansible -> first deploy.sh prod -> DNS cutover). mgf-hr | There is no production cut to document for a wheel-published federation library; the green-field provisioning runbook has nothing to describe. |
| DEP-11 | N/A | DEP-11 'Applies to: service' — 'Every web-service consumer MUST be deployable to >=2 environments (prod + staging/dev) from the same IaC + config-management code'. mgf-hrb has no IaC, n | Multi-environment deployability is gated on the web-service-consumer shape; a federation library is consumed via its package index, not deployed across prod/staging environments. |

### PRESENTATION_LAYER

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PR-01 | ✅ | pyproject.toml:184 declares contract 'PR-01 — SDK forbids UI framework imports' type=forbidden source_modules=['mgf.hrb'] forbidden_modules=[PySide6,qasync,textual,rich,prompt_toolkit,c | [verify-upheld] SDK root fenced by a KEPT forbidden contract, blocking CI gate, source-grep shows zero real UI-framework imports, backed by passing per-rule + §9.5-floor tests. argparse-only CLI is explicitly permitted. MET. |
| PR-03 | N/A | PR-03 governs the three-layer split (core/view/ui/<framework>) INSIDE an app repo. mgf-hrb is the domain SDK, not the app; src/mgf/hrb/ has no core/ view/ ui/ layering — it is the SDK t | App-side rule with no SDK binding surface. Correctly N/A on the SDK side per §8.2 and the test plan. |
| PR-04 | ✅ | pyproject.toml [tool.importlinter] root_packages=['mgf.hrb'] include_external_packages=true declares 2 contracts: PR-01 (SDK-root forbidden) at :184 and PR-06 (mgf.hrb.fmt strict forbid | [verify-upheld] The app-layer 'core/view no-UI; ui/* independence' two-contract requirement is itself app-side (lives in hrb-app). The SDK-binding mechanical enforcement — the PR-01/PR-06 fences + an alive deliberate-violation met |
| PR-05 | N/A | Repo has exactly ONE UI adapter: src/mgf/hrb/cli/ (_doctor.py/_explain.py/_info.py/_scan.py/__main__.py/__init__.py). `find` for qt/gui/ui/view/tui/web dirs under src/ returns NONE — no | PR-05 ('Each ui/<framework>/ adapter MUST consume view/ only — never another ui/<other>/') is the sibling-UI isolation rule and is, by the standard's own words (§6: 'sibling-UI isolation is only meaningful when ≥2 UIs exist'), an  |
| PR-07 | ✅ | tests/conformance/test_pr_standard_sdk.py::test_pr_07_tracker_has_pr_section (run, passing) asserts docs/inprogress/MGF_STANDARDS_CONFORMANCE.md contains the heading 'PR — PRESENTATION_ | [verify-upheld] The PR section heading + per-applicable-rule rows exist and are CI-pinned by a passing conformance test, with a drift detector wired alongside (§8.1). MET. |

### AGENTS

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| AG-01 | ✅ | /home/bassam/PycharmProjects/mgf-hrb/AGENTS.md (37 lines) is a thin pointer ('do not edit it; project-specific agent notes belong in this project's CLAUDE.md', lines 4-5; 'Run mgf-commo | Ships AGENTS.md at repo root as a thin pointer, byte-identical to the federation/cornerstone template, carrying no copy of the briefing. MET. |
| AG-02 | ✅ | AGENTS.md lines 7-9 point at the single source `mgf-common agents`; line 36 'One message for the whole federation; no per-project variant.' Project-specific lookups live in docs/claude/ | The canonical briefing is delegated to `mgf-common agents`; AGENTS.md points at that single source and project-specific content is routed to docs/claude/CLAUDE.md. MET. |
| AG-03 | ✅ | git config user = 'Bassam Alsanie <bassam@magogi.org>'; commit.template = /home/bassam/PycharmProjects/mgf-hrb/.gitmessage which prefills 'Signed-off-by: Bassam Alsanie <bassam@magogi.o | Canonical identity configured, .gitmessage template carries both mandatory trailers, and the actual history shows both trailers on agent-authored commits. MET. |
| AG-04 | N/A | FEEDBACK.md present at repo root (97KB, paper-structured) providing the channel; but AG-04 ('agents MUST file reusable friction as a paper') is an agent-behavioral rule. §9 marks it Rev | A process obligation on the agent's behavior in-session, not a statically verifiable repo artifact; the FEEDBACK channel exists but conformance is review-only and cannot be adjudicated from repo state. |
| AG-05 | N/A | AG-05 (verify memory claims before acting) is self-enforcement / runtime memory subsystem (§9: 'Self-enforcement'). | Pure agent-session behavioral discipline; no repo artifact binds it. Not statically adjudicable. |
| AG-06 | N/A | AG-06 (risky-op confirmation) is runtime/harness enforcement via permission prompts (§9: 'Not a code rule'). | Harness/runtime behavioral rule, not a repo artifact. Not statically adjudicable. |
| AG-07 | N/A | AG-07 (TaskCreate/TaskUpdate for >=3-step work) is self-enforcement at runtime (§9). | Agent-session workflow discipline; no repo artifact binds it. |
| AG-08 | N/A | AG-08 (federation-scoped memory writes) is runtime auto-memory discipline (§9: 'Self-enforcement; runtime auto-memory rules cover this'). | Memory-subsystem behavioral rule, not a repo artifact. |
| AG-09 | N/A | AG-09 (verify sibling versions against Codeberg registry, not local dist/) is Review-only (§9). | Agent-session verification discipline; not a statically verifiable repo artifact. |
| AG-10 | N/A | AG-10 (standards drift -> file a PAPER, never silently edit) is Review-only (§9). FEEDBACK.md provides the channel. | Behavioral rule on how an agent responds to drift; not adjudicable from repo state. |
| AG-11 | N/A | AG-11 (cross-project feedback routed to the TARGET project's FEEDBACK.md) refines AG-04 routing; Review-only. FEEDBACK.md present as the local channel. | Routing discipline on agent feedback behavior; no static repo artifact binds it. |
| AG-12 | ✅ | /home/bassam/PycharmProjects/mgf-hrb/docs/claude/CLAUDE.md (15769 bytes) present with the `mgf-common catch-up` auto-managed BEGIN block (lines 3-6) and '▶ First, run `mgf-common agents | Project-scoped briefing content lives in docs/claude/CLAUDE.md (the --project target) with mgf-common installed as a dependency to surface it; AGENTS.md kept a thin pointer. MET. |
| AG-13 | N/A | AG-13 (only the mgf-common supervisor changes a library; others file in target FEEDBACK.md) is a federation-governance behavioral rule; FEEDBACK.md present as the channel. | Cross-project governance discipline, not a statically verifiable repo artifact; not adjudicable from mgf-hrb's state alone. |
| AG-14 | N/A | AG-14 (propagate coupled surfaces in the same change; walk the Change-Propagation Matrix; run `mgf-common doctor --standards`) is the agent-facing form of DOC-18, Review-only. The mecha | Behavioral propagation discipline on the agent's change-set; not a static repo artifact. Not adjudicable from repo state. |
| AG-15 | N/A | AG-15 (read the Agent Empowerment Charter; use channels rather than silently comply/skip) is Review-only (§9: 'the charter grants license, not a checkable artifact'). | Explicitly a non-checkable license/standing rule; no repo artifact binds it. |
| AG-16 | ✅ | /home/bassam/PycharmProjects/mgf-hrb/pyproject.toml declares 'mgf-common>=0.41,<0.47' (line 12) as core and a `dev` extra (lines 16-37), but `grep 'mgf-common\[standards\]'` over pyproj | Real gap: the standards corpus is NOT resolvable to agents because the project never depends on mgf-common[standards]. Smallest fix: add 'mgf-common[standards]>=0.41,<0.47' to the dev/tooling extra in [project.optional-dependencie — FIXED 2026-06-09: separate [standards] extra |
| AG-17 | ✅ | docs/memory/MEMORY.md present at docs/memory/MEMORY.md (confirmed by app-doctor ✓ AG-17). | AG-17 (project memory file present). MET. |
| AG-18 | ✅ | my_stuff/ listed in .gitignore; .githooks/prepare-commit-msg hook present (confirmed by app-doctor ✓ AG-18 × 2 checks). | Both AG-18 requirements met: personal dir git-ignored + prepare-commit-msg hook wired. MET. |
| AG-19 | ✅ | runtime auto-memory store is git-tracked with allowlist .gitignore + an off-machine remote (confirmed by app-doctor ✓ AG-19). | AG-19 runtime memory store tracked. MET. |
| TM-01 | N/A | no datetime crosses a boundary in this repo's code. |
| TM-02 | N/A | no datetime wire format emitted. |
| TM-03 | N/A | no duration measurements with a wall clock (timeouts are not timed spans). |
| TM-04 | N/A | no `datetime.now()` in production logic. |
| TM-07 | N/A | UTC only; no IANA timezone-name usage. |
| TM-08 | ✅ | async sleeps use `asyncio.sleep`. |
| PF-01 | ⏳ | FLAG: perf tests use in-file thresholds, no recorded baseline. |
| PF-02 | ✅ | perf tests marked `@pytest.mark.perf`. |
| PF-03 | ⏳ | FLAG: no `tests/perf/baselines.json`. |
| PF-04 | N/A | re-baselining flow activates with recorded baselines. |
| PF-05 | ⏳ | FLAG: perf tests are plain-pytest timing, no statistical harness. |
| PF-07 | ✅ | perf failures surface the comparison numerically. |
| PF-08 | N/A | thresholds are relative-drop, not hardware-tier-sensitive. |
| OB-01 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-02 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-03 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-04 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-05 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-07 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-08 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-09 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-10 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| OB-11 | N/A | no owned observability surface — consumes `mgf.common.observability` (OB rules bind the owner). |
| NM-01 | ✅ | distribution name is hyphenated (NM-01). |
| NM-02 | ✅ | dotted import namespace `mgf.<sibling>` (NM-02). |
| NM-03 | ✅ | Codeberg slug hyphenated (NM-03). |
| GUI-01 | ✅ | imports no Qt at module level — the references are scaffolding strings / a docstring, not imports (GUI-01). |
| GUI-02 | N/A | no GUI (non-GUI library/CLI). |
| GUI-03 | N/A | no GUI (non-GUI library/CLI). |
| GUI-04 | N/A | no GUI (non-GUI library/CLI). |
| GUI-05 | N/A | no GUI (non-GUI library/CLI). |
| GUI-06 | N/A | no GUI (non-GUI library/CLI). |
| GUI-07 | N/A | no GUI (non-GUI library/CLI). |
| GUI-08 | N/A | no GUI (non-GUI library/CLI). |
| GUI-09 | N/A | no GUI (non-GUI library/CLI). |
| GUI-10 | N/A | no GUI (non-GUI library/CLI). |
| REL-10 | ✅ | federation member; participates in cohort-walk releases on a mgf-common pin break. |
| REL-11 | ✅ | released via the Phase A/B cohort-release flow. |
| REL-12 | N/A | binds the cohort Phase-A *agent's* pytest-denial handling, not a released sibling's code. |
| REL-13 | ✅ | releases pass the federation consistency gate (`mgf-fed registry --check`). |
| REL-14 | ✅ | Released via the cohort/tag flow; releasing (not re-tagging) clears any main-vs-tag drift. | New MUST, corpus v3.3.0 (DP-3/CIR-17/PAPER-130). Release-currency enforced by the fleet currency check. |
| FB-05 | ✅ | cross-repo feedback flows through the `pending-feedback/<target>.md` outbox + the supervisor relay (`mgf-fed feedback`), never a direct edit (FB-05). |


---

## AG-20 — owned-infrastructure discipline (standards v2.26)

✅ **Accounted 2026-06-29.** Review-enforced agent conduct (like AG-04 / AG-05 /
AG-15 — no single checkable artifact). Before declaring an action **blocked /
human-gated / impossible**, an agent consults
[`MGF_INFRA.md`](https://codeberg.org/magogi-admin/mgf-standard/src/branch/main/MGF_INFRA.md)
(the fleet infrastructure / access registry) and attempts the self-owned recovery
path — an auth/access failure on Magogi-owned infra (expired token, 401, stopped
service) is a solvable sub-problem, not a terminal wall. Recorded "blocked" /
"gated" notes carry an unblock-path + as-of date and are re-derived against current
capabilities. Added with the v2.26 corpus bump (AG-20 + the MGF_INFRA registry).

### §Z.seeded — pending assessment

Rows added because the corpus declared these MUSTs and this ledger had no
entry for them. **⏳ means not yet assessed — it is not a conformance
claim.** Replace each with a real verdict and evidence as it is reviewed.

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| AG-21 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| AG-22 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-01 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-02 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-03 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-04 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-05 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-06 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-07 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-08 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-09 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-10 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-11 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| CRT-12 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-01 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-02 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-03 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-04 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-05 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-06 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-07 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SEAT-08 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-01 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-05 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-06 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-07 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-08 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-09 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-10 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-11 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-12 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| SHP-13 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
| TS-29 | ⏳ | — | seeded by `mgf-fed ledger-seed`; not yet assessed |
