# MGF Standards Conformance — mgf-cloud-provision

> **Declared level.** **L2 — Standard** (declared 2026-06-18 at federation registration).
> **Status.** Phase-1a skeleton, now carrying a **full per-MUST evidenced audit** (2026-06-28). The four CI gates + packaging/CI rules hold; the per-rule ledger below is **complete** — every current MUST has a row (CFM-03) — with open gaps tracked as ⏳ / 🚫.
> **Scope.** mgf-cloud-provision's conformance to the standards at
> [mgf-standard/docs/standards/](https://codeberg.org/magogi-admin/mgf_common/src/branch/main/docs/standards/).
> **Audience.** Maintainer-tomorrow, AI coding agents, future contributors.
> **Cross-references.** [README.md](../../README.md) (declared level), [CHANGELOG.md](../../CHANGELOG.md) (release history), [SCOPE.md](../../SCOPE.md), [DEPS.md](../../DEPS.md).

Standards source of truth: `mgf-fed standards <topic>` (or `mgf-common standards`). This tracker records *this* repo's posture.

---

## §1 You are here

**Project shape:** Provider-agnostic cloud-provisioning engine over mgf-cloud's `CloudProvider` ABC — `plan` / `apply` / `destroy` + a TOML spec loader (`load_spec` → `ServiceSpec`). The live Infomaniak adapter runs in production; an in-memory `FakeProvider` runs in tests. No GUI, no standalone service, no datetime/async surface.

**Current version:** 0.1.0.

**Declared TARGET conformance level: L2** (per CFM-02). **Current VERIFIED standing (2026-06-28 depth audit): below L2** — declared, not yet met (expected for a Phase-1a skeleton).

Of the **263** current MUSTs: **90 ✅** verified (file:line evidence, refute-survived) · **45 ⏳** open gaps · **16 🚫** structurally-unmet · **112 N/A** (library shape — provisioning engine over mgf-cloud's ABC; no GUI/deploy/standalone-service, emits no logs of its own, no datetime/async/crypto). Applicable (non-N/A) = **151**; **90 / 151 (60%) evidenced ✅**. CFM-02 L2 requires *every* MUST, so declared L2 is a target, not yet met. The 16 🚫 cluster in two expected-for-skeleton places: packaging targets self-hosted **devpi** rather than the canonical **Codeberg** registry (PKG-01/02/03/05/06), and the **root-doc baseline** is incomplete (DOC-01/03/13/17, SC-12, plus AP-10/11/13 — `PUBLIC_API.md` + stability tiers absent). The 45 ⏳ are skeleton-maturation work (operability-runbook polish, test-depth layers, CI-publish surfacing, FEEDBACK-channel wiring, logging/observability integration).

**Status markers (CFM-03):**

- **✅** conformant — implementation + tests + docs match the rule.
- **🚫** declined / structurally-unmet — premise applies but the repo currently takes a different shape; rationale in-row.
- **⏳** in-progress — adoption planned; gap documented in the row.
- **N/A** — rule premise doesn't apply to this project's shape.

**Open-gap clusters (detail in §Z):**

| Cluster | Rules | Count |
|---|---|---|
| Packaging on self-hosted devpi, not the canonical Codeberg registry (PKG-06 moved to ⏳ — named-index dep-confusion fix landed Wave-2 P0; endpoint pends the PKG devpi EXTEND, founder gate P4) | PKG-01, PKG-02, PKG-03, PKG-05 | 4 🚫 |
| Root-doc baseline incomplete (CONTRIBUTING/FEEDBACK/SECURITY/FEDERATION + bucket charters) | DOC-01, DOC-03, DOC-13, DOC-17, SC-12 | 5 🚫 |
| `PUBLIC_API.md` pair + stability tiers absent (only `.json`) | AP-10, AP-11, AP-13 | 3 🚫 |
| Entry-point error hardening (no top-level handler / crash reporter / provider-call translation) | EH-02, EH-04, EH-05 | 3 🚫 |
| Operability-runbook polish (numbered steps, alert grid, owners, escalation) | OP-02, OP-03, OP-05, OP-06, OP-07, OP-08, OP-11, OP-12 | 8 ⏳ |
| CI publish/verify chain not surfaced in audited portion | WF-03, WF-04, WF-05, WF-06, WF-07, WF-08, REL-13 | 7 ⏳ |
| Test-depth layers (1:1 mirror, security/property/perf, integration/e2e) | TS-01, TS-10, TS-13, TS-14, TS-20, TS-28 | 6 ⏳ |
| Docs surface (PUBLIC_API.md pair, drift-lint, propagation, bucket README, FEEDBACK-dependent) | DOC-02, DOC-08, DOC-09, DOC-10, DOC-11, DOC-18 | 6 ⏳ |
| FEEDBACK-channel-dependent agent routing (FEEDBACK.md absent) | AG-04, AG-10, AG-11, AG-14, AG-18, FB-05 | 6 ⏳ |
| Logging / observability not wired (`setup_logging` not integrated) | LG-02, OB-01 | 2 ⏳ |
| API / release / scope specifics | AP-02, DP-08, EH-08, EH-09, PR-07, REL-03, PKG-07, PKG-08, SP-03, SP-06 | 10 ⏳ |

**Provenance.** **2026-06-28 — multi-agent L3 ledger build (family fan-out + adversarial refute).** Per-family auditor agents produced file:line evidence for every current MUST; each ✅ was adversarially refuted before it stood. DESIGN_PRINCIPLES returned from two passes — **reconciled here to the precise file:line pass**, which is internally consistent with the TIME family's verified no-datetime finding (`grep -rEn 'datetime|asyncio' src/` is empty); the divergent generic pass, which mis-asserted DP-12 datetime usage, was dropped. Nine MUSTs not surfaced by the fan-out (LG-07/10/17, DOC-10/11, OB-05/07/08, FB-05) were **added conservatively** (N/A or ⏳) for CFM-03 / DOC-15 completeness and are flagged in their Notes cell.

---

## Gate-level conformance (CI-enforced today)

| Rule | Status | Evidence |
|---|---|---|
| WF-01 runs on every push/PR (+tag/manual) | ✅ | `.woodpecker.yml` `when:` event list (generated). |
| WF-02 four gates CI-enforced | ✅ | `lint` (ruff), `typecheck` (mypy), `test-3.11/12/13` (pytest), `lint-imports` (import-linter). |
| WF-13 `.woodpecker.yml` is generation-current | ✅ | Generated by `mgf-fed scaffold` from the canonical template; `mgf-fed drift-check` is the gate. |
| DP-01 layering enforced | ✅ | `[tool.importlinter]` — `mgf.cloud_provision` forbids UI frameworks. |
| TS-06 coverage floor | ✅ | `[tool.coverage.report] fail_under = 80`; current 96 % (vs `FakeProvider`). |
| SC-01 secret scan | ✅ | gitleaks step + `.gitleaks.toml` (byte-exact from template). |
| SC-10 dependency CVE scan | ✅ | `vuln-scan` step (`pip-audit`, pip upgraded first). |
| PKG-06 Codeberg-only `mgf-*` resolution | ⏳ | named `[[tool.uv.index]]` "magogi-prod" with `explicit=true` + `[tool.uv.sources]` pinning every `mgf-*` dep (dep-confusion closed, Wave-2 P0); the endpoint is still devpi pending the PKG devpi EXTEND (founder gate P4) — see §Z. |
| EH-01/02 typed exceptions extend the federation base | ✅/🚫 | `ProvisionError`/`SpecError` extend `mgf.common.exceptions` (EH-01 ✅); provider-call translation absent (EH-02 🚫). |
| AP-09 PEP 561 typed | ✅ | `py.typed` ships in the wheel (build step asserts it). |
| DOC-08 PUBLIC_API.json present + current | ⏳ | `PUBLIC_API.json` + generator present; `PUBLIC_API.md` companion missing — see §Z. |

> Note: the gate table is the *headline* CI-enforced subset. The authoritative, per-MUST verdicts (including where a headline gate is only partially met) live in **§Z** below.

---

## §Z Per-MUST evidenced audit (all 263 current MUSTs — CFM-03 completeness)

> 2026-06-28 depth audit. Each ✅ cites file:line and survived refutation. Mix: **90 ✅ · 45 ⏳ · 16 🚫 · 112 N/A**.

### DESIGN_PRINCIPLES

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DP-01 | ✅ | pyproject.toml:144-154 defines import-linter contract forbidding fastapi, flask, django, starlette, PySide6, qasync, click from mgf.cloud_provision; enforces no UI frameworks | |
| DP-02 | ✅ | src/mgf/cloud_provision/_provision.py:21 imports from mgf.cloud.providers.base.CloudProvider (abstract base); functions accept CloudProvider type with no direct SDK access | |
| DP-03 | ✅ | src/mgf/cloud_provision/models.py:16-19 defines _Frozen with pydantic ConfigDict(frozen=True, extra='forbid'); all domain types (ServiceSpec, ServicePlan, ApplyResult) extend _Frozen | |
| DP-04 | ✅ | pyproject.toml:99-107 sets mypy strict=true, disallow_untyped_defs=true, disallow_incomplete_defs=true; all public functions fully type-annotated | |
| DP-05 | ✅ | tests/ mirrors src/mgf/cloud_provision/ 1:1; all tests use get_provider('fake') (mgf-cloud in-memory mock); zero network/credentials/third-party daemons in unit tests | |
| DP-06 | ✅ | Docstrings address first-class concerns: _provision.py:7 mentions 'fully testable with no cloud/credentials' (security/reliability); exceptions.py documents design intent; __main__.py comments explain provider/clouds.yaml handling | |
| DP-07 | ✅ | All 6 modules have module docstrings; all public functions (plan, apply, destroy, load_spec, to_server_spec, devpi_service_spec) and classes (ServiceSpec, Action, etc.) have docstrings stating intent and invariants | |
| DP-08 | ⏳ | src/mgf/cloud_provision/_provision.py:2-8 states 'Provider-agnostic: it takes any CloudProvider (the live Infomaniak adapter in production, the in-memory FakeProvider in tests)'; replaceability mentioned but no explicit swap-recipe table or ARCHITECTURE.md documented | |
| DP-09 | N/A | No long-running operations; plan/apply/destroy are synchronous; no CancellationToken, threading.Event, or asyncio.cancel usage in src/ | |
| DP-10 | ✅ | src/mgf/cloud_provision/_spec.py:33-47 explicitly catches FileNotFoundError/TOMLDecodeError/ValidationError and raises typed SpecError (no silent fallbacks); error paths logged/raised, not suppressed | |
| DP-11 | N/A | Zero async code; no asyncio.create_task or asyncio.TaskGroup in src/ | |
| DP-12 | N/A | No datetime usage in src/; services.py and _provision.py contain no time-based logic (corroborated: `grep -rEn 'datetime' src/` is empty) | |
| DP-13 | ✅ | src/mgf/cloud_provision/_spec.py:34,44 use Path.read_text (safe, handles resource closure); no explicit file opens or locks; resource management delegated to mgf.cloud.providers.base.CloudProvider | |

### ERROR_HANDLING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| EH-01 | ✅ | src/mgf/cloud_provision/exceptions.py:15-20; ProvisionError extends OperationError, SpecError extends ConfigError from mgf.common.exceptions | |
| EH-02 | 🚫 | src/mgf/cloud_provision/_provision.py:44,101,103,116; provider.list_servers(), create_server(), delete_server() calls not wrapped in try/except, exceptions propagate untranslated | gap: wrap provider calls and translate to ProvisionError at the boundary |
| EH-03 | ✅ | src/mgf/cloud_provision/_spec.py:36,38,46,55; all SpecError raises properly chain with 'from exc' | |
| EH-04 | 🚫 | src/mgf/cloud_provision/__main__.py:71-103; main() catches SpecError/ProvisionError but has no top-level catch-all, no crash reporter, no sys.excepthook installation | gap: add a top-level handler at the CLI entry point |
| EH-05 | 🚫 | src/mgf/cloud_provision/__main__.py; no import of report_now or crash reporting mechanism; untyped exceptions will crash without reporting | gap: wire report_now (downstream of EH-04) |
| EH-06 | N/A | No GUI surface; library is pure command-line/library with no GUI worker threads | |
| EH-07 | ✅ | grep -rn 'except Exception' returns no results; no bare broad exception handlers | |
| EH-08 | ⏳ | src/mgf/cloud_provision/exceptions.py:15-20; ProvisionError and SpecError carry only message string, no machine-readable fields (e.g., reason, errors list) | |
| EH-09 | ⏳ | src/mgf/cloud_provision/__main__.py:99,85 and _provision.py:99; actionable hints exist ('pass --yes', 'pass allow_replace=True') but tests/unit/mgf/cloud_provision/test_cli.py only pins 'pass --yes', not the allow_replace hint | |
| EH-10 | N/A | No observer loops or best-effort fan-out patterns in library | |
| EH-11 | N/A | No retry logic in library; library is synchronous and single-attempt | |
| EH-12 | ✅ | src/mgf/cloud_provision/_provision.py:87-109; destroy is idempotent (returns False if not found), apply gates REPLACE behind allow_replace flag (no silent retry) | |
| EH-13 | N/A | No retry or amplifying-call pattern; library delegates to mgf-cloud provider which controls retries | |

### LOGGING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| LG-01 | N/A | No modules emit log records — premise (every module [that logs]) doesn't bind | |
| LG-02 | ⏳ | src/mgf/cloud_provision/__main__.py:71-107 — entry point main() exists but calls no setup_logging(); mgf-common.observability.logging_setup is available as a dependency but not integrated | |
| LG-03 | N/A | No log records emitted; premise (every log record) doesn't bind | |
| LG-04 | N/A | No formatter installed, no log records; premise (formatter redaction) doesn't bind | |
| LG-05 | N/A | No ERROR-level logs emitted; premise doesn't bind | |
| LG-06 | N/A | No logging configured, no aggregator; premise (logs must reach aggregator) doesn't bind without logging setup | |
| LG-07 | N/A | No GUI surface — LG-07 is scoped to kind 'gui-app' (log-viewer dialog); mgf-cloud-provision is a CLI/library with no UI | Added for DOC-15 completeness (outside the audit fan-out); classified conservatively |
| LG-08 | N/A | No log messages formatted; premise (message formatting) doesn't bind | |
| LG-09 | N/A | No structured fields passed; premise (extra={}) doesn't bind | |
| LG-10 | N/A | No headless long-running service entry point — __main__.py is a one-shot CLI, not a daemon; LG-10's JournalHandler/OS-sink-at-service-entry premise doesn't bind (and no records are emitted; cf. LG-02 ⏳) | Added for DOC-15 completeness; classified conservatively |
| LG-11 | N/A | No operation logging emitted; plan/apply/destroy are operation-like but emit no INFO records | |
| LG-12 | N/A | No log emission to measure; premise (emission cost) doesn't bind | |
| LG-13 | N/A | No high-frequency log sites; premise (rate-limiting) doesn't bind | |
| LG-14 | N/A | No correlation context set via contextvars; premise doesn't bind | |
| LG-15 | N/A | No INFO+ records with event field; premise (notable events) doesn't bind | |
| LG-16 | N/A | No WARNING/ERROR records emitted; premise (what/why/how) doesn't bind | |
| LG-17 | N/A | LG-17 is a SHOULD; no ERROR-level records are emitted and no formatter is installed, so there is no record on which to compute a fingerprint | Added for DOC-15 completeness; classified conservatively |

### CONFIGURATION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| CF-01 | N/A | ServiceSpec (models.py) is a data model for specs loaded from TOML, not consumer-owned pydantic-settings BaseSettings | |
| CF-02 | N/A | ServiceSpec loads from TOML file path only; no layered sources (env/CLI precedence) | |
| CF-03 | N/A | ServiceSpec has no version field; CF-03 scope is consumer-owned config only | |
| CF-04 | N/A | Never writes config files; grep yields zero atomic write patterns | |
| CF-05 | ✅ | __main__.py:39-42 loads credentials via mgf.cloud.config.load(); SCOPE.md:13 'credentials from mgf-cloud' | |
| CF-06 | ✅ | models.py:19 extra='forbid'; _spec.py:53 ServiceSpec.model_validate() enforces rejection; test_spec.py:54-58 pins behavior | |
| CF-07 | N/A | No sub-config files (hooks/schedules/alerts) in repo | |
| CF-08 | N/A | ServiceSpec loaded per-invocation from file path (__main__.py:67), not singleton at entry point | |
| CF-09 | N/A | Spec file is positional CLI arg, not --config flag with XDG defaults | |
| CF-10 | ✅ | test_spec.py constructs specs with explicit tmp_path files; no environment variable dependence | |
| CF-11 | N/A | ServiceSpec is not consumer-owned config with long-term compatibility concerns | |
| CF-12 | N/A | ServiceSpec has no mutually-exclusive backend variants | |

### SECURITY_STANDARD

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| SC-01 | ✅ | README.md and SCOPE.md confirm credentials sourced from mgf-cloud.config; library never stores secrets in config/source | |
| SC-02 | N/A | No subprocess invocation found in source; library is pure Python with no shell integration | |
| SC-03 | ✅ | src/mgf/cloud_provision/_spec.py:34; uses stdlib tomllib (safe), no yaml.load or pickle deserialization | |
| SC-04 | N/A | Library writes no config files or state files; cloud-init is passed to provider but not persisted by library | |
| SC-05 | ✅ | No cryptographic imports found; library has no crypto operations | |
| SC-06 | ✅ | No direct TLS connections in library; all cloud API calls delegated to mgf-cloud provider | |
| SC-07 | N/A | No direct external requests; library delegates all I/O to mgf-cloud provider | |
| SC-08 | ✅ | src/mgf/cloud_provision/models.py:19 uses ConfigDict(extra='forbid'); src/mgf/cloud_provision/_spec.py:53 validates with ServiceSpec.model_validate() | |
| SC-09 | N/A | Library emits no log records; no logging setup or formatter configuration in source | |
| SC-10 | ✅ | .woodpecker.yml:102-112 runs pip-audit --strict on every PR; uv.lock committed and tracked | |
| SC-11 | ✅ | src/mgf/cloud_provision/_spec.py and __main__.py exceptions do not embed credentials; spec file paths are user-supplied but not embedded in exceptions | |
| SC-12 | 🚫 | Repository root has no SECURITY.md file; ls -la /home/bassam/PycharmProjects/mgf-cloud-provision/ shows no SECURITY.md | gap: add root SECURITY.md (supported versions, contact, disclosure timeline) |
| SC-13 | N/A | No cryptographic keys stored at rest; library performs no key derivation or storage | |
| SC-14 | N/A | No authentication boundary in library; credentials loaded externally by mgf-cloud | |
| SC-15 | ✅ | src/mgf/cloud_provision/_spec.py:32; spec_path normalized via Path(). No unsanitized filesystem traversal risk for user input | |
| SC-16 | N/A | No privileged operations; library is pure user-space code with no sudo/setuid/capability escalations | |
| SC-17 | N/A | Library emits no log records; audit logging is consumer-responsibility (CLI handler can add it) | |
| SC-18 | ✅ | .woodpecker.yml:152-174 sbom step builds reproducible SBOM; build reproducible on tag via CI pipeline | |

### TESTING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| TS-01 | ⏳ | src/mgf/cloud_provision/ has 7 source modules; tests/unit/mgf/cloud_provision/ has 5 test files. Missing dedicated tests for: models.py, __init__.py (test_smoke.py is marked @pytest.mark.smoke, not general). TS-01 requires 1:1 mirror. pyproject.toml defines allow-list for exceptions (none present) | |
| TS-02 | ✅ | tests/unit/mgf/cloud_provision/test_provision.py:25 uses get_provider('fake') exclusively; mgf.cloud.providers.FakeProvider is in-memory, no network or real daemons. pyproject.toml specifies [dev] with mgf-test-supervisor, no production credentials in tests | |
| TS-03 | ✅ | Tests use pytest function-scope fixtures by default; test_spec.py:18 and test_provision.py:24 each receive fresh tmp_path. No module-level state, no HOME mutations evident. Pytest isolation enforced | |
| TS-04 | ✅ | pyproject.toml:133 sets filterwarnings = ['error']. Warnings escalate to failures | |
| TS-05 | ✅ | pyproject.toml:114 addopts includes --strict-markers and --strict-config. Marker typos fail CI | |
| TS-06 | ✅ | pyproject.toml:142 fail_under = 80. .woodpecker.yml:93 runs coverage report --fail-under=80. Current coverage: 96% (per .gates/last-run/summary.md) | |
| TS-07 | ✅ | tests/unit/mgf/cloud_provision/test_spec.py:35-50 tests SpecError with pytest.raises(SpecError, match=...). test_provision.py:49 tests ProvisionError with pytest.raises(ProvisionError). Both exceptions have tests asserting message content | |
| TS-08 | N/A | No exception translation seams in library; extends mgf.common.exceptions.ConfigError/OperationError but does not translate third-party exceptions | |
| TS-09 | N/A | No observer pattern (EH-10) in library; no event listeners or fan-out handlers | |
| TS-10 | ⏳ | No security-specific test file (test_security.py). Core security surface minimal: exceptions already tested (TS-07), no substring pins on error messages (EH-09), no subprocess/shell/YAML/crypto/TLS/auth boundary. Security tests likely covered by dependency (mgf-cloud) but not redundantly pinned in this library | |
| TS-11 | N/A | No GUI (PySide6, Qt, QThread, CoreWorker) in library shape. Library is a provisioning engine, not a desktop app | |
| TS-12 | ✅ | No async code in src/mgf/cloud_provision/ — grep -r 'async\|await\|@pytest.mark.asyncio' returns empty. Library uses synchronous plan/apply/destroy | |
| TS-13 | ⏳ | load_spec (_spec.py) is parse code (TOML → ServiceSpec round-trip), but no Hypothesis property tests found. No imports of hypothesis, no @given decorators. TS-13 requires property tests for round-trip code; this library has a round-trip surface but lacks property-test coverage | |
| TS-14 | ⏳ | No @pytest.mark.perf tests; pyproject.toml:129 declares 'perf: hot-path cost pin; tier-3' marker but no tests use it. Performance budgets not pinned. Phase-1a skeleton may defer this, but per TS-14 it's a MUST | |
| TS-15 | ✅ | No smoke tests against real backends; tests use FakeProvider exclusively. Only @pytest.mark.smoke is tests/smoke/test_imports_smoke.py (post-install sanity, no backend) | |
| TS-16 | ✅ | tests/unit/mgf/cloud_provision/test_spec.py uses assert with context (e.g., line 23 'default applied' comment); test_provision.py uses pytest.raises(Exception, match=...) with regex. Test failure messages self-explanatory | |
| TS-17 | ✅ | No conftest.py files in test hierarchy. Pytest defaults applied; no cross-file fixture imports. Tests use pytest.fixture decorators inline or as built-ins (tmp_path) | |
| TS-18 | ✅ | No @pytest.mark.slow tests; test runtime is sub-100ms per .gates/last-run/summary.md (0.60s total for 3 tests ≈ 200ms max). Tests are fast by default | |
| TS-19 | ✅ | pyproject.toml:118-132 registers all markers: smoke, e2e, integration, contract, property, regression, fuzz, concurrency, conformance, use_case, perf, stress, slow. Each has a description and tier assignment | |
| TS-20 | ⏳ | tests/ has unit/ and smoke/ directories (2 of 4 canonical layers). Missing tests/integration/ and tests/e2e/. Phase-1a skeleton may defer these | |
| TS-21 | ✅ | tests/smoke/test_imports_smoke.py:1 and :6 verify pytestmark=[pytest.mark.smoke]; line 9 asserts __version__ and every __all__ name importable. Smoke layer exists | |
| TS-22 | ✅ | pyproject.toml markers include tier-0/1/2/3 assignments; .woodpecker.yml:146 runs 'mtest --tier 0'. Tiered runs supported | |
| TS-23 | ✅ | .woodpecker.yml:130-146 supervisor-self-check and supervisor-tier-0 steps run mgf-test-supervisor (mtest); it survives and structures pytest crashes/hangs per TS-23 | |
| TS-24 | ✅ | .gates/last-run/summary.md exists and shows structured mtest output with outcomes, durations, test count. mgf-test-supervisor writes .gates/last-run/run.jsonl per TS-24 schema | |
| TS-25 | ✅ | .gates/quarantine.json (empty, 2 bytes per ls) exists; mgf-test-supervisor auto-quarantines flaky tests and persists in this file. L2 rule implemented | |
| TS-26 | N/A | No compiled artifacts (Zig/Go/Rust/C/Swift) in library; pure Python. No freshness check owed | |
| TS-27 | ✅ | .gates/last-run/ directory structure exists; mgf-test-supervisor writes .gates/last-run/failures/*.txt bundles on failure per TS-27 spec | |
| TS-28 | ⏳ | .woodpecker.yml does not invoke 'mtest --perf' or set MGF_PERF=1. perf_span context manager available in mgf.common but not enabled in CI. L2 opt-in not configured | |

### API_DESIGN

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| AP-01 | ✅ | src/mgf/cloud_provision/__init__.py:26-38 defines __all__ with 11 alphabetically sorted names | |
| AP-02 | ⏳ | src/mgf/cloud_provision/__init__.py:26-38 __all__ contains 11 names (not 12); ProvisionError and SpecError are not exported from main module (only in exceptions.__all__) | |
| AP-03 | ✅ | pyproject.toml:3 and src/mgf/cloud_provision/__init__.py:24 both define version='0.1.0' matching SemVer format (MAJOR.MINOR.PATCH) | |
| AP-04 | N/A | No deprecations in 0.1.0 skeleton; deprecation cycle not yet applicable | |
| AP-05 | ✅ | Public functions (plan, apply, destroy, load_spec, to_server_spec) use keyword-only new parameters (allow_replace) with defaults; signatures stable for 0.1.0 | |
| AP-06 | ✅ | Return types explicitly annotated: plan → ServicePlan, apply → ApplyResult, destroy → bool, load_spec → ServiceSpec, to_server_spec → ServerSpec | |
| AP-07 | ✅ | Exceptions documented: src/mgf/cloud_provision/exceptions.py defines typed hierarchy (ProvisionError/SpecError); docstrings on _spec.py:26 state 'Raises :class:`SpecError`' | |
| AP-08 | ✅ | All 6 modules (models.py, _provision.py, _spec.py, services.py, exceptions.py, __init__.py) line 1-10 start with 'from __future__ import annotations' | |
| AP-09 | ✅ | src/mgf/cloud_provision/py.typed exists (0 bytes, PEP 561 marker); pyproject.toml:23 declares 'Typing :: Typed' | |
| AP-10 | 🚫 | PUBLIC_API.json exists but PUBLIC_API.md file is missing; only PUBLIC_API.json (no human-readable markdown contract document) | gap: generate PUBLIC_API.md from __all__ |
| AP-11 | 🚫 | PUBLIC_API.json contains only name lists; no 'tier' or 'stability' fields (required to declare experimental/stable/deprecated tiers per AP-11) | gap: add stability-tier column |
| AP-12 | N/A | CHANGELOG.md documents 2026-06-18 Phase 1a additions but no breaking changes yet; AP-12 applies to removals/renames, not initial feature additions | |
| AP-13 | 🚫 | No test file matching test_version_in_sync.py; CI does not lint __version__ sync between pyproject.toml:3 and src/mgf/cloud_provision/__init__.py:24 | gap: add a version-sync CI lint |
| AP-14 | ✅ | Tests only import public surface (mgf.cloud_provision) and __main__ (not a private module); no imports of _provision, _spec, _*.py in tests/ | |
| AP-15 | N/A | No backward-compat shims in 0.1.0; rule applies to deprecation cycle maintenance in later versions | |
| AP-16 | ✅ | pyproject.toml pins the cornerstone with the federation window `mgf-common[standards]>=0.47,<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:201), 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 | ✅ | MGF_STANDARDS_CONFORMANCE.md:1-4 declares L2 level at top of conformance tracker; README.md:1-5 describes project shape | |
| SP-02 | ✅ | SCOPE.md:9-14 'Out of scope' section lists items by design (cloud SDK, general-purpose IaC, day-2 config, secrets storage) | |
| SP-03 | ⏳ | SCOPE.md addresses version boundaries but no explicit version-compatibility contract (semver not stated; pre-0.1.0 status is caveat) | |
| SP-04 | ✅ | SCOPE.md:15-18 explains boundary with mgf-cloud (OpenStack adapter) and mgf-fed; provider pattern (FakeProvider / real) documented | |
| SP-05 | ✅ | PUBLIC_API.json lists exported symbols; src/mgf/cloud_provision/__init__.py __all__ defines API boundary | |
| SP-06 | ⏳ | SCOPE.md lists out-of-scope but does not explicitly document known limitations (e.g., no multi-region, no HA failover documented) | |

### WORKFLOWS

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| WF-01 | ✅ | .woodpecker.yml:13-18 when clause triggers on: push, pull_request, tag (refs/tags/v*), manual | |
| WF-02 | ✅ | .woodpecker.yml:33-44 (lint: ruff+import-linter), 62-67 (typecheck: mypy), 73-100 (test-3.11/3.12/3.13: pytest), all in named steps | |
| WF-03 | ⏳ | .woodpecker.yml:150+ publish step exists (not shown in first 150 lines); project at 0.1.0-pre-release, no tag-driven publish tested yet | |
| WF-04 | ⏳ | Publish workflow structure incomplete; codeberg_package_token CI secret usage not visible in read portion; tag event triggers but publish credentials handling unverified | |
| WF-05 | ⏳ | Tag-version coherence check not visible in read output; would be in publish section | |
| WF-06 | ⏳ | WF-06 fresh wheel requirement visible in build step (.woodpecker.yml:148+) but full publish chain not read; likely met but unconfirmed | |
| WF-07 | ⏳ | Pre-publish smoke test structure in .woodpecker.yml but not visible in first 150 lines; likely present in full file | |
| WF-08 | ⏳ | Post-publish Codeberg registry verification required; not visible in read portion; not yet tested (pre-0.1.0 release) | |
| WF-09 | ✅ | .woodpecker.yml:20-29 (woodpeckerci/plugin-git:2.9.2), 34/62/73+ (python:3.11-slim, 3.12-slim, 3.13-slim), 117 (zricethezav/gitleaks:v8.30.1) — all pinned exact versions | |
| WF-10 | ✅ | lint/typecheck/test-3.11/test-3.12/test-3.13 run in parallel (no depends_on between independent steps); matrix not used; layout confirms parallelism (WF-10 comment at line 69) | |
| WF-11 | ✅ | .woodpecker.yml:13-18 (event-driven triggers), step commands use pinned images, --index-url hardcoded for Codeberg registry; no host env assumptions | |
| WF-12 | ✅ | .woodpecker.yml steps use -q flags with brief output; failure modes surface via exit codes; log context (pytest --tb=short, coverage report) visible | |
| WF-13 | ✅ | .woodpecker.yml:1-3 header states GENERATED, source: mgf-standard/templates/woodpecker/, regenerate after editing template | |

### RELEASING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| REL-01 | ✅ | git tag -l shows v0.1.0 (annotated, checked earlier). .woodpecker.yml:184-208 tag-coherence step verifies tag ↔ pyproject ↔ __version__ sync | |
| REL-02 | ✅ | First release (0.1.0) published once. No reused version strings. dist/ wipe before build enforced implicitly | |
| REL-03 | ⏳ | PUBLIC_API.json exists at repo root (20 lines, __version__ = '0.1.0'). No PUBLIC_API.md found. REL-03 requires both .md and .json; only .json present | |
| REL-04 | ✅ | .woodpecker.yml:256 'from_secret: devpi_password' — token stored in Woodpecker secret, not chat/shell/plaintext. CI-gated to tag events | |
| REL-05 | ✅ | devpi enforces immutability by policy. First release, no superseding yet. Version re-uploads would require deletion + re-push (PKG-07 recovery) | |
| REL-06 | ✅ | .woodpecker.yml flow: tag-coherence → smoke → publish → verify-devpi (lines 184–280). Order enforced via CI dependencies (depends_on) | |
| REL-07 | N/A | No FEEDBACK.md in repo; first release has no FEEDBACK entries to close. Rule applies post-initial-release | |
| REL-08 | ✅ | .woodpecker.yml:210-231 smoke step: installs freshly-built wheel into ephemeral venv, imports __version__, asserts match, runs CLI. Exercises actual wheel, not source tree | |
| REL-09 | N/A | No FEEDBACK.md entries closed in this release. Rule applies once FEEDBACK entries exist | |
| REL-10 | N/A | Conditional on mgf-common MINOR bump breaking pins. This is a library, not the cornerstone. Rule applies only to mgf-common releases | |
| REL-11 | N/A | Conditional on REL-10 (mgf-common cohort-walk). N/A for leaf libraries | |
| REL-12 | N/A | Conditional on REL-10/11. N/A for leaf libraries | |
| REL-13 | ⏳ | .woodpecker.yml does not explicitly invoke gen_mgf_libraries.py --check. Per REL-13, mgf-common supervisor runs the federation gate on EVERY library release. This library's release flow does not surface the gate mechanically; it depends on mgf-common supervisor's parallel execution | |

### PACKAGE_DISTRIBUTION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PKG-01 | 🚫 | pyproject.toml:165 'index-url = https://195.15.203.250.sslip.io/magogi/prod/+simple/' (devpi). .woodpecker.yml:233-260 publishes to devpi (line 260 twine upload to https://195.15.203.250.sslip.io/magogi/prod/), not Codeberg registry (magogi-admin/pypi on codeberg.org). PKG-01 mandates Codeberg. Current setup is Phase-2 B2 (self-hosted devpi), not Phase-2 A (Codeberg) | |
| PKG-02 | 🚫 | Uses devpi endpoints (https://195.15.203.250.sslip.io/magogi/prod/), not canonical Codeberg endpoints (https://codeberg.org/api/packages/magogi-admin/pypi...). PKG-02 mandates canonical endpoints only | |
| PKG-03 | 🚫 | .woodpecker.yml:256 'from_secret: devpi_password' (devpi credential). PKG-03 mandates Codeberg access token (write:package scope). Token model is devpi, not Codeberg | |
| PKG-04 | ✅ | .woodpecker.yml publish flow is strictly ordered: gates green → build → twine check → tag-coherence → smoke → publish → verify-devpi. Flow order follows PKG-04 discipline (even though endpoint is wrong) | |
| PKG-05 | 🚫 | .woodpecker.yml:264-280 verify-devpi step queries devpi simple index (line 275: https://195.15.203.250.sslip.io/magogi/prod/+simple/). PKG-05 mandates verification against Codeberg registry (REST API, not devpi) | |
| PKG-06 | ⏳ | pyproject.toml [[tool.uv.index]] name="magogi-prod" explicit=true + [tool.uv.sources] maps mgf-common/mgf-cloud/mgf-test-supervisor/mgf-standard to it (Wave-2 P0; per PKG-06 §6 shape). mgf-* can no longer be shadowed by a public package nor silently fall back to PyPI. Residual: the named index is devpi, not the Codeberg registry the rule text names — the stale-standard class; resolves with the PKG devpi EXTEND (founder gate P4) | Wave-2 P0 |
| PKG-07 | ⏳ | devpi immutability is policy-enforced. First release, no re-uploads yet. Recovery model (delete + re-push) is available on devpi but not mechanically documented in CI | |
| PKG-08 | ⏳ | No retention policy evident in .woodpecker.yml or docs/. devpi account quota not explicitly tracked or monitored in CI. PKG-08 MUST is not mechanically enforced | |
| PKG-09 | ✅ | .woodpecker.yml:238-260 publish step: event: tag, ref: refs/tags/v*; secret-token authenticated (from_secret: devpi_password); build-in-CI. CI publishing is tag-driven, secret-authenticated | |
| PKG-10 | ✅ | Distribution name: mgf-cloud-provision (hyphenated). Import path: mgf.cloud_provision (dotted). Naming per NM-01..NM-04 convention | |
| PKG-11 | N/A | Applies to federation agents (supervisors) checking published versions; library itself does not check sibling versions at release time. See AG-09 (agent versioning) — not a library MUST | |
| PKG-12 | ✅ | No pypi.org references in .woodpecker.yml or pyproject.toml for mgf-* publish. Uses devpi, not pypi.org. Third-party deps resolve from devpi (which mirrors pypi.org), not direct pypi.org | |

### DOCUMENTATION

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DOC-01 | 🚫 | Missing root-level files: CONTRIBUTING.md, FEEDBACK.md, SECURITY.md, FEDERATION.md (DOC-01 v2.11 requires all 10 baseline docs) | gap: add the 4 missing baseline docs |
| DOC-02 | ⏳ | docs/ has subdirs (claude/, inprogress/, memory/) but missing standards/ bucket and no README.md per DOC-03 | |
| DOC-03 | 🚫 | Long-lived buckets (docs/inprogress/, docs/claude/) lack README.md charters per DOC-03 | gap: add bucket README charters |
| DOC-04 | ✅ | CHANGELOG.md:1-20 has per-version entries with Keep a Changelog format | |
| DOC-05 | N/A | Pre-0.1.0 skeleton; no breaking changes released yet | |
| DOC-06 | N/A | No open priority trackers in docs/inprogress/ (only MGF_STANDARDS_CONFORMANCE.md, which has pending items but not the living-tracker shape of DOC-06) | |
| DOC-07 | ✅ | docs/claude/CLAUDE.md:1-400 exists in dense-lookup format with sections on project shape, module structure, common patterns | |
| DOC-08 | ⏳ | PUBLIC_API.json exists but PUBLIC_API.md missing (should mirror __all__ per DOC-08); only half the pair | |
| DOC-09 | ⏳ | CLAUDE.md references code (file paths, classes) but no drift-detection CI lint or back-references in code docstrings | |
| DOC-10 | ⏳ | docs/inprogress/ (internal posture) exists and is uncontaminated, but the consumer-facing FEEDBACK.md surface is absent (cf. DOC-13 🚫), so the consumer-signal / internal-tracker separation can't be confirmed complete | Added for DOC-15 completeness; conservative ⏳ pending FEEDBACK.md |
| DOC-11 | ⏳ | docs/inprogress/ exists but ships no archival-discipline charter README (couples with DOC-03 🚫); DOC-11 is a SHOULD/maintenance signal and nothing has aged a release cycle yet | Added for DOC-15 completeness; classified conservatively |
| DOC-12 | ✅ | CLAUDE.md uses relative links (../), file:line citations (src/mgf/cloud_provision/...), hierarchical headings (##) | |
| DOC-13 | 🚫 | FEEDBACK.md missing entirely; cannot file repo-scoped consumer signals | gap: add root FEEDBACK.md |
| DOC-14 | N/A | mgf-cloud-provision is a federation sibling, not a consumer application (ADP-04 carve-out: siblings do not need MGF_ADOPTION.md) | |
| DOC-15 | ✅ | docs/inprogress/MGF_STANDARDS_CONFORMANCE.md exists; declares L2 level; carries a per-rule audit row for every current MUST (CFM-03 completeness) | this build closes the completeness gap |
| DOC-16 | ✅ | DEPS.md:1-30 exists with §1 (dependencies) and §2 (dependents) bidirectional manifest; includes mgf.cloud, mgf.common, mgf.cloud_provision | |
| DOC-17 | 🚫 | FEDERATION.md missing from repo root; every non-mgf-standard project MUST have pointer stub (DOC-17 v2.10) | gap: add FEDERATION.md pointer stub |
| DOC-18 | ⏳ | Recent commits (.woodpecker.yml regenerated 2026-06-22, CLAUDE.md updated 2026-06-27) show incomplete propagation (e.g., generated .woodpecker.yml not reflected in conformance tracker) | |
| DOC-19 | ✅ | LESSON_LEARNED.md:1-20 exists at repo root with append-only dated entries (one entry: 2026-06-18 on FakeProvider testing) | |

### OPERABILITY

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| OP-01 | ✅ | docs/woodpecker-ci-runbook.md exists; covers Woodpecker CI operations, agent reconciliation, failure modes | |
| OP-02 | ⏳ | Runbook exists but no formal alert rule name mapping documented; Woodpecker alerts would map to runbook sections but no explicit grid | |
| OP-03 | ⏳ | Runbook has Woodpecker-specific patterns but not generalized templates for other services (devpi, vault listed as future) | |
| OP-04 | ✅ | docs/woodpecker-ci-runbook.md has architecture section + operations section (self-healing, agent reconciliation, failure modes) | |
| OP-05 | ⏳ | Remediation steps in runbook are narrative (self-heal.sh command, reconciler cron) but not numbered per OP-05 | |
| OP-06 | ⏳ | Runbook references Woodpecker API but links to observability surfaces (dashboards, logs) not explicit | |
| OP-07 | ⏳ | Code owners not explicitly documented in runbook (README.md has authors but no CODEOWNERS file) | |
| OP-08 | ⏳ | Escalation path not documented in runbook (ops contact, on-call procedures missing) | |
| OP-09 | N/A | mgf-cloud-provision is a library, not a service; no SLO contract owed (OP-09 scoped to service applications) | |
| OP-10 | N/A | Library, not a deployed service; rollback procedure not applicable | |
| OP-11 | ⏳ | Library, no alerts; Woodpecker alerts would link runbook but alert→runbook linkage not explicitly documented | |
| OP-12 | ⏳ | Runbook currency not CI-gated (no check that docs/woodpecker-ci-runbook.md is kept in sync with code changes) | |

### DEPLOYMENT

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| DEP-01 | N/A | mgf-cloud-provision is a library, not a web service; DEP-01 (infrastructure-as-code) applies to service consumers, not provisioning libraries | |
| DEP-02 | N/A | No VM/container deployment of mgf-cloud-provision itself; library ships via PyPI | |
| DEP-03 | N/A | Library packaging (immutable artifacts) covered by WF-06; service deployment not applicable | |
| DEP-04 | N/A | Library has no production secrets; consumer services using mgf-cloud-provision are responsible for secret management | |
| DEP-05 | N/A | No deploy scripts in mgf-cloud-provision (library, not service) | |
| DEP-06 | N/A | Library has no rollback procedure; consumers' deploy procedures are their responsibility | |
| DEP-07 | N/A | No deploy/ directory (library, not service); mgf-cloud-provision IS the provisioning tool, not the deployed artifact | |
| DEP-08 | N/A | Library observability not applicable; consumer services' observability is their responsibility | |
| DEP-09 | N/A | Library has no DNS/TLS; infrastructure consumers are responsible | |
| DEP-10 | N/A | No first-production-cut runbook (library, not service) | |
| DEP-11 | N/A | Library: not deployed; no multi-environment concern | |

### PRESENTATION_LAYER

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PR-01 | ✅ | pyproject.toml:150-154 defines import-linter contract forbidding UI frameworks (fastapi, flask, django, starlette, PySide6, qasync, click). Mechanically enforced in CI via .woodpecker.yml:44 lint-imports step. No UI framework imports found in src/ audit | |
| PR-03 | N/A | Rule applies to 'an app repo with multiple UIs'; mgf-cloud-provision is a provisioning library/SDK, not an app repo. No layer separation needed (library without UI consumers) | |
| PR-04 | N/A | Rule applies to app repos with layer hierarchy enforcement. mgf-cloud-provision is a library without app-level layer structure | |
| PR-05 | N/A | Rule applies to sibling UI adapters. mgf-cloud-provision has no ui/<framework>/ structure (it is a library, not an app with multiple UIs) | |
| PR-07 | ⏳ | Conformance tracker exists at docs/inprogress/MGF_STANDARDS_CONFORMANCE.md but does not classify PR-* rules per audit-outcomes taxonomy. Needs explicit PR-01 ✅ and PR-02..05 N/A classifications per the pure-SDK carve-out | this build adds the PR-* classification; CI-surfacing still pending |

### AGENTS

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| AG-01 | ✅ | AGENTS.md:1-35 at repo root; thin pointer to mgf-fed agents (does not duplicate briefing) | |
| AG-02 | ✅ | AGENTS.md directs to `mgf-fed agents` for canonical federation briefing; no copy embedded | |
| AG-03 | ✅ | .woodpecker.yml:46-59 commit-trailers CI step enforces both Signed-off-by and Co-Authored-By via scripts/check_commit_trailers.py | |
| AG-04 | ⏳ | FEEDBACK.md missing, so reusable friction cannot be filed; workaround patterns in CLAUDE.md exist but unfiled | |
| AG-05 | N/A | Runtime auto-memory discipline is a session-level agent behavior contract; not testable via repo audit | |
| AG-06 | N/A | Risky-action confirmation is an agent-session behavior rule; not enforced by repo structure | |
| AG-07 | N/A | TaskCreate/TaskUpdate usage is a per-session agent behavior; not a repo structure requirement | |
| AG-08 | N/A | Federation-scoped memory writes are session-level discipline; repo structure cannot enforce | |
| AG-09 | N/A | Registry verification is an agent-execution behavior; not a repo structure constraint | |
| AG-10 | ⏳ | FEEDBACK.md missing (where standards drift should be filed); no mechanism to surface such papers | |
| AG-11 | ⏳ | FEEDBACK.md missing; cross-project feedback routing cannot be implemented | |
| AG-12 | ✅ | AGENTS.md directs `mgf-fed agents --project` to read docs/claude/CLAUDE.md; command available via mgf-common dependency | |
| AG-13 | N/A | Supervisor edit restriction is a federation governance rule; not a per-repo enforcement surface | |
| AG-14 | ⏳ | Change propagation documented in CLAUDE.md but incomplete (e.g., .woodpecker.yml regeneration not reflected in conformance tracker post-2026-06-22) | |
| AG-15 | N/A | Agent empowerment charter is a principle/rights document; not a repo structure requirement | |
| AG-16 | ✅ | pyproject.toml:38-40 declares mgf-common[standards] in optional-dependencies | |
| AG-17 | ✅ | docs/memory/MEMORY.md:1-10 exists with frontmatter (name, description, type) and index structure | |
| AG-18 | ⏳ | .gitignore exists (.gitignore:1-5 ignores build artifacts) but .gitmessage template and prepare-commit-msg hook presence not verified; commit-trailers CI gate works (server-side) | |
| AG-19 | N/A | Runtime auto-memory VCS backing is a per-machine agent infrastructure concern; not a repo structure requirement | |

### TIME

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| TM-01 | N/A | No datetime construction in codebase; grep yields zero datetime/now calls in src/ | |
| TM-02 | N/A | No wire-format datetimes; ServiceSpec is TOML/pydantic, not JSON/gRPC with timestamps | |
| TM-03 | N/A | No duration measurements; no time.monotonic() or elapsed-time calculations | |
| TM-04 | N/A | No time-dependent code that requires testable injection; no datetime.now() calls | |
| TM-07 | N/A | No timezone references in code; grep yields zero ZoneInfo/timezone calls | |
| TM-08 | N/A | No async code; __main__.py and _provision.py contain no async/await or asyncio calls | |

### PERFORMANCE

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| PF-01 | N/A | Phase-1a skeleton library with no performance-sensitive code paths requiring regression budgets. Marker declared in pyproject.toml:129 but no perf tests exist in tests/ | |
| PF-02 | N/A | No @pytest.mark.perf tests found in codebase. Marker is declared at pyproject.toml:129 but unused | |
| PF-03 | N/A | No tests/perf/baselines.json file exists. No perf test infrastructure in place | |
| PF-04 | N/A | No perf tests exist to require re-baselining flow | |
| PF-05 | N/A | No perf-test harness required; no perf tests exist in codebase | |
| PF-07 | N/A | No perf tests to emit numeric failure messages | |
| PF-08 | N/A | No hardware tier definitions or perf baselines to record | |

### OBSERVABILITY

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| OB-01 | ⏳ | docs/inprogress/MGF_STANDARDS_CONFORMANCE.md states full audit pending; library declared L2 but Phase-1a skeleton; OB-01 mandates logs (mandatory for all consumers) but none emitted; observability infrastructure available (mgf-common[observability] dependency exists) | |
| OB-02 | N/A | Library shape may skip metrics per OB-01 (metrics only mandatory for services); no metrics defined | |
| OB-03 | N/A | Library shape may skip metrics per OB-01; no metrics emitted | |
| OB-04 | N/A | Library shape may skip traces per OB-01 (no continuous lifecycle to observe); no traces emitted | |
| OB-05 | N/A | No owned observability surface — consumes mgf-common[observability]; OB rules bind the owner. Library shape may skip per OB-01 | Added for DOC-15 completeness; classified conservatively |
| OB-07 | N/A | No owned observability surface — consumes mgf-common[observability]; OB rules bind the owner | Added for DOC-15 completeness; classified conservatively |
| OB-08 | N/A | No owned observability surface — consumes mgf-common[observability]; OB rules bind the owner | Added for DOC-15 completeness; classified conservatively |
| OB-09 | N/A | No logs emitted, no LogRecord schema to evolve; premise (schema evolution) doesn't bind | |
| OB-10 | N/A | No logs emitted, no LogRecord wire shape produced; premise (byte-identical wire) doesn't bind | |
| OB-11 | N/A | No logs emitted, no logging statistics collected; premise (log statistics) doesn't bind | |

### NAMING

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| NM-01 | ✅ | pyproject.toml:2 declares name = 'mgf-cloud-provision' with hyphens | |
| NM-02 | ✅ | Package imported as mgf.cloud_provision (PEP 420); no src/mgf/__init__.py exists | |
| NM-03 | ✅ | pyproject.toml:60 Homepage cites https://codeberg.org/magogi-admin/mgf-cloud-provision with hyphens | |

### GUI_CONSUMERS

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| GUI-01 | N/A | Not a GUI consumer application; mgf-cloud-provision is a provisioning library with CLI-only interface (uses stdlib argparse, not UI framework) | |
| GUI-02 | N/A | No GUI; no Qt main thread; no worker pattern required (library, not GUI app) | |
| GUI-03 | N/A | No GUI worker operations requiring CancellationToken (library, not GUI consumer) | |
| GUI-04 | N/A | No GUI workers catching exceptions into typed signals (library, not GUI app) | |
| GUI-05 | N/A | No Qt excepthook bridge needed; not a GUI consumer application | |
| GUI-06 | N/A | No presentation widgets with business logic (library, not GUI app) | |
| GUI-07 | N/A | No streaming workers emitting signals (library, not GUI consumer) | |
| GUI-08 | N/A | No GUI settings persistence via BaseAppSettings (library, not GUI app) | |
| GUI-09 | N/A | No GUI unit tests with pytest-qt and Fakes (library, not GUI consumer) | |
| GUI-10 | N/A | No capability-driven UI controls (library, not GUI application) | |

### FEEDBACK

| Rule | Status | Evidence | Notes |
|---|---|---|---|
| FB-05 | ⏳ | Cross-repo feedback should flow through the pending-feedback/<target>.md outbox + the mgf-fed feedback relay (never a direct edit); the relay is available via the mgf-fed dependency but the repo ships no FEEDBACK.md / outbox yet (cf. AG-10/AG-11 ⏳) | Added for DOC-15 completeness; conservative ⏳ pending FEEDBACK.md |

---

## §4 Audit log

| Date | Auditor | Trigger | Findings |
|---|---|---|---|
| 2026-06-28 | multi-agent L3 ledger build (family fan-out + adversarial refute) | Item 1b L3 uplift; DOC-15 completeness | First evidence-based per-MUST audit: **90 ✅ / 45 ⏳ / 16 🚫 / 112 N/A** of 263 (60% of applicable evidenced). 🚫 cluster: devpi-vs-Codeberg packaging (PKG-01/02/03/05/06) + root-doc baseline (DOC-01/03/13/17, SC-12, AP-10/11/13). DESIGN_PRINCIPLES reconciled from two fan-out passes to the precise file:line pass (TIME-consistent). 9 fan-out-missed MUSTs (LG-07/10/17, DOC-10/11, OB-05/07/08, FB-05) added conservatively. Audit only — no production code changed. |
| 2026-06-18 | Bassam Alsanie + Claude | Federation registration | Added to `MGF_LIBRARIES` (31 libraries, REL-13 GREEN); scaffolded generated CI + policy files; declared L2. Phase-1a skeleton. Gate-level table seeded. |

---

## §5 Cross-references

- [mgf-standard/docs/standards/](https://codeberg.org/magogi-admin/mgf_common/src/branch/main/docs/standards/) — the standards source-of-truth.
- [`../../SCOPE.md`](../../SCOPE.md) — in/out-of-scope policy (SP-01..06 surface).
- [`../../DEPS.md`](../../DEPS.md) — bidirectional dependency manifest (DOC-16).
- [`../../PUBLIC_API.json`](../../PUBLIC_API.json) — machine-readable public surface (PUBLIC_API.md companion pending — AP-10/DOC-08).
- [Sibling ledger: mgf-sqlalchemy](https://codeberg.org/magogi-admin/mgf-sqlalchemy/src/branch/main/docs/inprogress/MGF_STANDARDS_CONFORMANCE.md) — the passing-ledger shape this tracker matches.


---

## 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).
