Files
proxmox/docs/04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md
defiQUG b3a8fe4496
Some checks failed
Deploy to Phoenix / deploy (push) Has been cancelled
chore: sync all changes to Gitea
- Config, docs, scripts, and backup manifests
- Submodule refs unchanged (m = modified content in submodules)

Made-with: Cursor
2026-03-02 11:37:34 -08:00

26 KiB
Raw Permalink Blame History

GRU M00 Diamond — Detailed Review: Gaps, Wire-Ins, and Recommendations

Purpose: Structured review of the GRU M00 Diamond (ERC-2535) Token Factory architecture against the current codebase and docs. Covers missing components, functional wire-ins to complete, naming/alignment gaps, and actionable recommendations.

References: GRU_M00_DIAMOND_FACET_MAP.md, gru-docs/contracts/README.md (GRU docs; same repo as GRU-Official-Docs-Monetary-Policies when cloned standalone), smom-dbis-138, VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md.


1. Executive Summary

Area Status Summary
Spec vs implementation Gap Facet Map describes M00 Diamond + GRUStorage + PolicyRouter + gates; repo has GRC-2535 Diamond (different facets) and standalone UniversalAssetRegistry/TokenFactory/VaultFactory — no single M00 Diamond yet.
Missing components Multiple Institutional spec doc, GRUStorage layout, PolicyRouter + four gates (on-chain), Token Factory facets (AssetRegistry, MarketFactory, MintBurn, InterestRate, BridgeWrap, DWIN), Standards facets (IPSAS, IFRS, ISO20022, i18n, GovernanceLevel), minimum ship stubs.
Wire-ins Incomplete No Diamond → Token Factory wiring; no PolicyRouter → gate calls; no governance level bitmask → enforcement; off-chain ComplianceGate (dbis_core) not mirrored on-chain.
Naming alignment Gap Spec grammar uses a<ISO>, d<ISO>; deployed/specified tokens use ac*, vdc*/sdc* — need explicit mapping or doc alignment.

2. Missing Components

2.1 Documentation

Item Description Recommendation
GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md Full §1§8 institutional architecture spec (Diamond topology, storage, facets, governance, markets, W rules, Pattern A/B, minimum checklist, token model A/B/C). Done: GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md created; token model A and Pattern A locked; GRC vs M00 evolution note added.
Token model decision Facet Map had “[ A | B | C ]”; locked choice was missing. Done: Institutional spec §8 locks Token model A; Facet Map updated to “A (locked).”
Pattern A vs B Target pattern was not stated. Done: Institutional spec §6 locks Target: Pattern A; Facet Map “Target pattern” line added.

2.2 Storage (GRUStorage)

Domain Facet Map / Spec Current State Gap
Governance & roles DAO/Council/Guardian, upgrade admin, timelock, policy controllers GRCStorage has Gov (timelock, quorum, proposals), Access (role bits), no DAO/Council/Guardian names. Add GRUStorage namespace constants and structs for governance; align or migrate from GRCStorage if M00 supersedes GRC.
Token Factory Registry assetId → (c,a,d) addresses; symbol → assetId; per-asset config UniversalAssetRegistry has token → UniversalAsset (type, compliance, metadata); no assetId, no c/a/d triple per asset. Define GRUStorage.TokenFactoryRegistry (or equivalent) with assetId, symbol→assetId, and c/a/d address triple; or document migration path from UniversalAssetRegistry.
Accounting / Ledger Journal entries, CoA, cost centers, reserve attestations, policy hashes Not in Diamond; OMNL/Fineract off-chain. No on-chain journal/CoA structs. Add GRUStorage.Accounting placeholder structs (journal entry, CoA slot, attestation hashes) for AccountingGateFacet stub.
Compliance & Identity KYC/AML allowlists, jurisdiction, sanctions, travel rule, audit roots ComplianceGuard (iso4217w) validates mint/reserve only; no allowlist/jurisdiction/sanctions in contracts. dbis_core has ComplianceGateService (sanctions/AML). Add GRUStorage.Compliance placeholder (allowlist/denylist, jurisdiction tags); wire ComplianceGate to it or to external oracle.
ISO-20022 Message Vault Schema registry, in/out logs, canonicalization hashes, correlation IDs SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY defines canonical struct; no on-chain vault or log storage. Add GRUStorage.ISO20022Vault (or event-only + off-chain index); implement MessagingGate.logISO20022.
i18n Registry Locale packs, translation keys, disclosure templates Not present in any contract. Add GRUStorage.i18n placeholder (locale keys, hash pointers); i18nFacet stub reads from it.
Expandable Standards Registry standardId → moduleConfig (enabled, version, validators, constraints, pointers) Not present. Add GRUStorage.StandardsRegistry; StandardsRegistryFacet activate/deactivate modules and enforce “required modules per governance level.”

2.3 Core Diamond Facets

Facet Spec Current State Gap
DiamondCutFacet Upgrade mechanism GrcDiamond has diamondCut inline; no separate facet. OK if M00 keeps cut in core; else extract to DiamondCutFacet.
DiamondLoupeFacet Introspection GrcDiamond has loupe inline. Same as above.
OwnershipFacet / GovernanceFacet Owner, timelock, upgrade approval GrcDiamond has owner; GovernanceFacet has proposeCut/queue/execute. Alias or merge into single “GovernanceFacet” for M00; ensure timelock and upgrade approval workflow documented.
PauseFacet Global and per-selector pause PauseFacet exists in gru-docs; GRCStorage has PauseState. Keep; ensure M00 uses same slot namespace if migrating from GRC.

2.4 Token Factory Facets (all missing as Diamond facets)

Facet Spec Current State Gap
AssetRegistryFacet Asset definitions, W semantics, assetId hash UniversalAssetRegistry (standalone) has asset types and metadata; iso4217w TokenFactory enforces <CCC>W. No deterministic assetId or c/a/d symbol grammar in one place. Implement as facet (or wrap UniversalAssetRegistry behind facet); add symbol→assetId and W-before/W-after parsing per Facet Map grammar.
MarketFactoryFacet Creates market per ISO; emits c/a/d token contracts VaultFactory creates vault + DepositToken + DebtToken per asset; TokenFactory138 is stub; CompliantUSDC/USDT and CompliantFiatToken are separate contracts. Either (1) MarketFactoryFacet deploys proxy/minimal clones for c/a/d, or (2) MarketFactoryFacet registers existing external c/a/d addresses in GRUStorage; document vs VaultFactory/TokenFactory138.
MintBurnFacet Mint/burn rules, reserve gating, supply caps, emergency locks ComplianceGuard validates mint; individual token contracts have mint/burn. No single MintBurnFacet. Implement MintBurnFacet calling ReserveGate and token contracts or internal ledger; centralize caps and emergency locks in storage.
InterestRateFacet Aave-style index math, rate models, accrual Not in gru-docs or smom-dbis-138 as a facet. DepositToken/DebtToken do not implement interest indices. Add InterestRateFacet (stub or full) with index storage and rate model hooks.
BridgeWrapFacet W-before-ISO (wrapped bridge), escrow, bridge operators Bridge contracts (GRUCCIPBridge, ISO4217WCCIPBridge, etc.) are standalone; no “BridgeWrapFacet” in Diamond. Add facet that delegates to bridge contracts or holds bridge operator config in GRUStorage.
DWINFacet W-after-T/C (D-WIN), denomination, windowing Not present. Add DWINFacet stub with storage for denomination/windowing rules.

2.5 Standards / Compliance Facets (all missing or stub-only)

Facet Spec Current State Gap
IPSASFacet GRU ledger ↔ IPSAS reporting, fund accounting OMNL has IPSAS in Fineract/off-chain journal matrix; no on-chain facet. Add IPSASFacet stub; document mapping from GRUStorage ledger to IPSAS classifications.
IFRSUSGAAPFacet Revenue recognition, lease/contract hooks, impairment Not present. Add stub; document future hooks.
ISO20022Facet pacs/camt builders, dictionary, settlement correlation Methodology doc and runbook exist; no on-chain message builder facet. Add ISO20022Facet stub; emit or store canonical message hashes/correlation IDs per MessagingGate.
i18nFacet Locale packs, translation keys, disclosure templates Not present. Add stub; read from GRUStorage.i18n.
GovernanceLevelFacet Policy levels 0..N, bitmask, routes enforcement Not present. GRCStorage has no policy level or bitmask. Add GovernanceLevelFacet; add GRUStorage policy level and bitmask; document “required modules per level.”

2.6 Policy Layer (Router + Gates)

Component Spec Current State Gap
PolicyRouterFacet Calls ComplianceGate, AccountingGate, MessagingGate, ReserveGate Not present in contracts. Implement PolicyRouterFacet: e.g. checkTransfer → ComplianceGate, postJournal → AccountingGate, logISO20022 → MessagingGate, checkBacking → ReserveGate; gate addresses from storage or facet.
ComplianceGate checkTransfer (KYC/AML, sanctions, jurisdiction) dbis_core ComplianceGateService (off-chain); ComplianceGuard (on-chain) only validates mint/reserve. Add ComplianceGateFacet (stub) with allowlist/denylist and jurisdiction placeholders; optionally call off-chain or oracle.
AccountingGate postJournal (ledger, CoA) No on-chain gate. Add AccountingGateFacet stub; write to GRUStorage.Accounting or emit events.
MessagingGate logISO20022 (message log, correlation IDs) No on-chain gate. Add MessagingGateFacet stub; write to GRUStorage.ISO20022Vault or emit events.
ReserveGate checkBacking (reserve proofs, attestations) ComplianceGuard validates reserve for mint; no generic “checkBacking” gate. Add ReserveGateFacet stub; delegate to existing reserve/oracle logic or attestation hashes in storage.

2.7 Minimum Ship List (Stubs)

Item Spec Current State Gap
AppStorage skeleton Module registry, policy bitmask, ledger/ISO20022/i18n structs GRCStorage has different namespaces; no GRUStorage. Define GRUStorage (or extend GRCStorage with reserved namespaces) with all 7 domains + policy bitmask + module registry.
GovernanceFacet RBAC, timelock, upgrade approval Exists in gru-docs (GovernanceFacet). Verify it fits M00; add “policy controllers per module” if required.
PolicyRouterFacet Empty gates callable, events Missing. Implement as above.
TokenFactoryFacet Register assets, deploy or ledger tokens TokenFactory138 is stub; no Diamond facet. Implement TokenFactoryFacet (or unify AssetRegistry + MarketFactory) to register assets and create/link c/a/d.
ComplianceGateFacet (stub) Allowlist, jurisdiction placeholders Missing. Add stub.
AccountingGateFacet (stub) Journal, CoA placeholders Missing. Add stub.
StandardsRegistryFacet Activate/deactivate modules, enforce required per level Missing. Add; wire to GRUStorage.StandardsRegistry and GovernanceLevelFacet.

3. Functional Wire-Ins to Complete

3.1 Diamond ↔ Token Factory

  • Current: No single Diamond owns token creation. VaultFactory, TokenFactory (iso4217w), CompliantFiatToken deployments are independent.
  • Target: M00 Diamond exposes AssetRegistryFacet + MarketFactoryFacet (or TokenFactoryFacet); all c/a/d registration and creation go through Diamond.
  • Wire-in: (1) Deploy M00 Diamond with GRUStorage; (2) Add AssetRegistryFacet + MarketFactoryFacet (or TokenFactoryFacet); (3) MarketFactoryFacet either deploys new c/a/d contracts or registers existing ones in GRUStorage; (4) All mint/burn/transfer that must be gated go through Diamond (or token contracts call back into Diamond for gate checks).

c GRU integration (implemented):* All c* (compliant) tokens are integrated with the GRU ERC-2535 facet path: (1) UniversalAssetRegistry — register each c* via registerGRUCompliantAsset() (AssetType.GRU, no timelock); (2) GRUCCIPBridge and PoolManager read the registry and accept GRU assets; (3) GRUAssetRegistryFacet delegates to UniversalAssetRegistry so the M00 Diamond can expose the same registry when the facet is attached. Run RegisterGRUCompliantTokens.s.sol after deploying c* tokens; run GRUCompliantTokensRegistryTest (integration tests) before deployments. See DEPLOYMENT_ORDER_OF_OPERATIONS § Phase 2.4.

3.2 PolicyRouter → Gates

  • Current: No PolicyRouter; no on-chain gates except ComplianceGuard (mint-only).
  • Target: Every transfer (or mint/burn) that is policy-sensitive calls PolicyRouter.checkTransfer (or equivalent); PolicyRouter reads GovernanceLevelFacet level and calls ComplianceGate, AccountingGate, MessagingGate, ReserveGate as required.
  • Wire-in: (1) Implement PolicyRouterFacet with checkTransfer, postJournal, logISO20022, checkBacking; (2) Implement each gate as facet or internal module; (3) Token contracts or Diamond entry points call PolicyRouter before state changes; (4) GovernanceLevelFacet exposes level/bitmask; PolicyRouter reads it and skips or enforces each gate.

3.3 Governance Level → Enforcement

  • Current: No governance level or bitmask in storage; no routing by level.
  • Target: Governance levels 05 (per Facet Map); level stored in GRUStorage; GovernanceLevelFacet and PolicyRouter use it to decide which gates to call and with what strictness.
  • Wire-in: (1) Add governanceLevel (and optional policyBitmask) to GRUStorage; (2) GovernanceLevelFacet get/set level (restricted); (3) PolicyRouter and gate stubs branch on level; (4) Document level semantics (05) in Facet Map and runbooks.

3.4 Off-Chain vs On-Chain Compliance

  • Current: dbis_core ComplianceGateService does sanctions/AML off-chain; on-chain ComplianceGuard only validates mint/reserve for ISO4217W.
  • Target: Clear split: which checks are on-chain (allowlist/denylist, jurisdiction tags) vs off-chain (full sanctions/AML); on-chain ComplianceGateFacet calls external adapter or stores results.
  • Wire-in: (1) Define interface for “compliance result” (allowed/denied + reason); (2) ComplianceGateFacet stub stores allowlist/denylist and jurisdiction in GRUStorage; (3) Optionally add “oracle” or relayer that posts off-chain ComplianceGateService result on-chain for PolicyRouter to read.

3.5 ISO-20022 and MessagingGate

  • Current: Canonical message format and methodology doc exist; no on-chain message log or correlation.
  • Target: MessagingGate.logISO20022 stores or emits message hash + correlation ID; ISO20022Facet can build/reference pacs/camt payloads.
  • Wire-in: (1) Add GRUStorage.ISO20022Vault (or event-only design); (2) MessagingGateFacet accepts canonical struct hash + correlationId; (3) Emit event and/or write to storage; (4) Link to SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY and MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.

3.6 Reserve and Attestation

  • Current: ComplianceGuard validates reserve for mint; PoR in GRCStorage (AuditPeriod); no generic “checkBacking” for all operations.
  • Target: ReserveGate.checkBacking(assetId, amount) used by PolicyRouter before mint/transfer where level requires; attestation hashes in GRUStorage.
  • Wire-in: (1) ReserveGateFacet stub checks GRUStorage or external oracle for reserve/attestation; (2) MintBurnFacet (or token contracts) call ReserveGate when level ≥ 2; (3) Document attestation format and who posts hashes.

4. Naming and Alignment Gaps

4.1 Symbol Grammar: a/d vs ac/vdc/sdc

  • Facet Map / institutional spec: Canonical grammar uses a<ISO><T|C> (asset) and d<ISO><T|C> (debt). Examples: aUSDC, dUSDC, aEURCT, dWUSDT.
  • TOKEN_SCOPE_GRU and deployment: Tokens are named ac* (e.g. acUSDC, acUSDT) and vdc*/sdc* (e.g. vdcUSDC, sdcUSDC). These are Aave-style “deposit” and “debt” tokens.
  • Gap: “a” and “d” in the spec are logical roles; “ac” and “vdc/sdc” are implementation names. Either (1) document that a = ac (asset/deposit) and d = vdc/sdc (debt) and keep both nomenclatures, or (2) rename in spec to ac/d for consistency with deployed tokens.
  • Recommendation: Add a short subsection in Facet Map or TOKEN_SCOPE_GRU: “Canonical grammar: a (asset) ↔ ac (DepositToken), d (debt) ↔ vdc / sdc (DebtToken). Symbol in registry may be aUSDC or acUSDC; both refer to same asset token type.”

4.2 GRC-2535 vs M00 Diamond

  • GRC-2535 (gru-docs): GrcDiamond + GRCStorage + Monetary, Triangulation, Index, Bond, Audit, Governance, Access, Pause, ComplianceFacet (stub), OracleAggregatorFacet (stub). No Token Factory, no PolicyRouter, no GRUStorage as in Facet Map.
  • M00 Diamond (Facet Map): Single Diamond with GRUStorage, Token Factory facets, Standards facets, PolicyRouter + gates.
  • Gap: Two different “Diamond” designs. Migration path or relationship is undefined.
  • Recommendation: Document in institutional spec or a “GRU Diamond Evolution” note: “GRC-2535 is the current GRU Diamond (monetary, bond, index, audit). M00 Diamond extends or replaces it with Token Factory + GRUStorage + policy gates. Decision: migrate GRC → M00 (same contract, new facets + storage) vs deploy M00 as new Diamond and deprecate GRC.”

4.3 UniversalAssetRegistry vs AssetRegistryFacet

  • UniversalAssetRegistry (smom-dbis-138): Central registry for asset types (GRU, ISO4217W, Commodity, etc.); used by bridges, PoolManager, GovernanceController, TokenlistGovernanceSync. Not a Diamond facet.
  • AssetRegistryFacet (spec): Asset definitions, W semantics, assetId, symbol→assetId inside M00 Diamond.
  • Gap: Duplication or migration path unclear.
  • Recommendation: (1) If M00 is new deployment: AssetRegistryFacet could wrap or replace UniversalAssetRegistry (Diamond holds registry state or delegates to external registry). (2) Document “UniversalAssetRegistry remains source of truth for bridges until M00 is deployed; then migrate or mirror to GRUStorage.TokenFactoryRegistry.”

5. Recommendations and Suggestions

5.1 High priority

  1. Create GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md — Paste the full §1§8 institutional spec; link from Facet Map. This is the single hand-off doc for Solidity engineers.
  2. Lock token model (A/B/C) — Document in spec or Facet Map which of (A) separate ERC-20, (B) internal ledger, (C) hybrid is the target; update Facet Map “Token model” line accordingly.
  3. Define GRUStorage layout — One Solidity library or doc with namespaced structs and slots for all 7 domains + policy bitmask + standards registry. Reserve namespaces for future facets to avoid collision.
  4. Implement minimum ship list — PolicyRouterFacet + four gate stubs (Compliance, Accounting, Messaging, Reserve), StandardsRegistryFacet, GovernanceLevelFacet (level + bitmask), and TokenFactoryFacet (or AssetRegistry + MarketFactory) that register assets and optionally deploy/link c/a/d. Start with stubs that revert or no-op with events.
  5. Wire PolicyRouter to governance level — PolicyRouter reads level from GovernanceLevelFacet; for each transfer/mint path, call only the gates required for that level; document in runbook.

5.2 Medium priority

  1. Align symbol grammar with TOKEN_SCOPE_GRU — Add a↔ac, d↔vdc/sdc mapping and keep single source of truth for “canonical symbol” (either Facet Map or TOKEN_SCOPE_GRU with cross-link).
  2. Document GRC-2535 → M00 path — One-page “Diamond evolution” or “M00 migration”: whether M00 is new Diamond or upgrade of GrcDiamond; which facets/storage are reused vs new.
  3. Reserve GRUStorage namespaces — Even if a domain is stub-only, reserve its slot (keccak256 namespace) so future facets can extend without migration.
  4. ISO-20022 on-chain footprint — Decide event-only vs storage for message log; implement MessagingGate.logISO20022 and optional ISO20022Facet stub.
  5. Off-chain ComplianceGate integration — Define how dbis_core ComplianceGateService result is consumed on-chain (relayer, oracle, or keep transfer checks off-chain and only log).

5.3 Lower priority / optional

  1. InterestRateFacet and DWINFacet — Stub with storage for rate indices and D-WIN rules; full implementation when a/d token behavior is finalized.
  2. IPSASFacet / IFRSUSGAAPFacet — Stub and mapping doc from GRU ledger codes to IPSAS/IFRS; full logic later.
  3. i18nFacet — Stub reading locale/key hashes from GRUStorage; UI/legal can consume from indexer or API.
  4. Pattern B (facet packs per asset) — Only if a flagship USD/EUR market needs dedicated rate/compliance/settlement logic; document when and how.

6. Checklist for “Spine” Completion

Use this as a quick gate for “deployable spine” per institutional spec §7.

# Item Done
1 AppStorage skeleton (module registry, policy bitmask, ledger/ISO20022/i18n structs)
2 GovernanceFacet (RBAC, timelock, upgrade approval) ☐ (exists in GRC; verify for M00)
3 PolicyRouterFacet (callable gates, events)
4 TokenFactoryFacet or AssetRegistry + MarketFactory (register assets, deploy or ledger c/a/d)
5 ComplianceGateFacet (stub: allowlist, jurisdiction)
6 AccountingGateFacet (stub: journal, CoA)
7 StandardsRegistryFacet (activate/deactivate, require per level)
8 GovernanceLevelFacet (level 0..N, bitmask)
9 GRUStorage namespaces defined and reserved
10 PolicyRouter wired to level and gates
11 Institutional spec doc created and linked ☑ (GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md)
12 Token model A/B/C locked and documented ☑ (Token model A, Pattern A in institutional spec §8, §6)
13 Testing and verification (post-deploy) ☐ — Run GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md §6 (loupe, governance level, PolicyRouter, storage layout, upgrade, events). Add Forge/Hardhat tests when spine is implemented.

7. Additional Recommendations, Suggestions, and Gaps

Beyond §2§6 and the spine checklist, the following are additional recommendations, suggestions, or gaps.

7.1 Runbooks and deployment

Item Gap Recommendation
M00 deployment runbook Institutional spec said “Document the chosen path in the deployment runbook”; no runbook existed. Done: GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md — Option A (new Diamond), Option B (migrate GRC→M00), target chain, CREATE2, initial facet order, testing §6.
Chain and CREATE2 M00 Diamond spec did not state target chain(s) or CREATE2. Done: Runbook §1 and institutional spec "Deployment target chain and CREATE2" state: primary chain 138, then mainnet/651940; CREATE2 when same-address parity required.

7.2 Cross-doc and repo alignment

Item Gap Recommendation
TOKEN_SCOPE_GRU ↔ Facet Map Facet Map §5.5 links to TOKEN_SCOPE_GRU; TOKEN_SCOPE_GRU did not link back. Done: TOKEN_SCOPE_GRU §8 has “Canonical symbol grammar” note with link to Facet Map §5.
VAULT_SYSTEM_MASTER_TECHNICAL_PLAN VAULT_SYSTEM mentioned M00 but did not link to M00 docs. Done: VAULT_SYSTEM §3 (GRU Assets) links to institutional spec and Facet Map.
REQUIRED_FIXES_UPDATES_GAPS Repo-wide gaps doc did not list GRU M00 Diamond spine. Done: §9 includes “GRU M00 Diamond spine (optional)” with links to institutional spec §7, Review §6 checklist, deployment runbook.

7.3 Defaults and interfaces

Item Gap Recommendation
Default governance level Facet Map defined levels 05 but did not state default at deployment. Done: Institutional spec “Deployment target chain and CREATE2” and runbook §2 state default level 0; Facet Map §4 references runbook and spec.
PolicyRouter and gate events Spec said gates “emit events” but no standard event names/signatures were defined. Done: Institutional spec Appendix: PolicyRouter and gate event signatures defines TransferChecked, JournalPosted, MessageLogged, BackingChecked, GovernanceLevelSet. Runbook §6 references the appendix.

7.4 Testing and verification

Item Gap Recommendation
M00 Diamond tests No tests or verification steps were documented for M00 Diamond. Done: Runbook §6 defines post-deploy checks (loupe, governance level, PolicyRouter, storage layout, upgrade, events). Spine checklist item 13 added; add Forge/Hardhat tests when spine is implemented.

7.5 UniversalAssetRegistry migration

Item Gap Recommendation
Explicit migration note Review §4.3 recommended documenting UniversalAssetRegistry as source of truth until M00. Done: Institutional spec “GRU Diamond evolution” includes “Existing registries”: UniversalAssetRegistry remains source of truth until M00; after M00, migrate or mirror to GRUStorage.TokenFactoryRegistry and document cutover.

See also §7 for additional recommendations (runbooks, cross-docs, defaults, events, testing, UniversalAssetRegistry migration).