The right implementation is incremental.
If DIN tries to ship capability specs, selector logic, contract ABI changes, assignment acceptance, and daemon automation all at once, the migration risk is much higher than necessary.
The recommended order is:
- establish the metadata and local checking path;
- change batch creation so compatible subsets can actually be enforced;
- add acceptance and update slashing semantics;
- only then move matching into the daemon.
Make workload requirements machine-readable and available to every role through the existing manifest flow.
Documentation/technical/manifest.mdcache_model_0/manifest.json- optionally
Documentation/public/roles/model-owner.md,Documentation/public/roles/aggregators.md, andDocumentation/public/roles/auditors.md
- add a documented
capability_specblock to the manifest; - define role-specific requirement fields for clients, auditors, and aggregators;
- document which fields are hard requirements versus advisory estimates;
- update the reference manifest so there is one concrete example in the repo.
Do not overload requirements.txt for this purpose.
That key already describes Python dependency files. The capability schema should be its own first-class manifest block.
Make dincli able to decide whether the local machine should register for a role before sending a transaction.
dincli/services/capability.py- optionally
dincli/cli/capability.pyor an extension insidedincli/cli/system.py
dincli/services/runtime.pydincli/cli/utils.pydincli/cli/aggregator.pydincli/cli/auditor.py
- add helpers to load
capability_specfrom the manifest; - add local hardware detection for RAM, disk, CPU, GPU, and bandwidth when possible;
- add a normalized capability profile format;
- add a preflight matcher that compares local profile to role requirements;
- add operator-facing commands to inspect local capability data;
- gate
aggregator registerandauditor registerbehind preflight checks, with an explicit override flag for dev-only usage.
Without this step, the protocol has nowhere to source the capability information that later selection depends on.
Attach an auditable capability-profile reference to each on-chain role registration.
foundry/src/DINTaskCoordinator.solfoundry/src/DINTaskAuditor.solfoundry/src/DINShared.sol- mirrored files in
hardhat/contracts/
Add new versioned methods instead of breaking the old ones immediately.
Recommended methods:
registerDINaggregatorV2(uint gi, bytes32 capabilityProfileCID)registerDINAuditorV2(uint gi, bytes32 capabilityProfileCID)
Add:
- profile CID mappings per GI and validator;
- registration events that include the profile reference.
Update:
dincli/cli/aggregator.pydincli/cli/auditor.py
So that registration:
- builds a capability profile;
- optionally uploads it to IPFS;
- converts the CID to
bytes32; - calls the
V2registration method.
If a manifest does not declare capability_spec, the CLI can either:
- keep legacy registration available behind a
--legacy-selectionflag; or - refuse registration for production networks and only allow it on local devnet.
The stricter option is better once the feature stabilizes.
Replace blind shuffling across all registrants with shuffling across a compatible subset chosen off-chain.
foundry/src/DINTaskAuditor.solfoundry/src/DINTaskCoordinator.sol- mirrored
hardhat/contracts/copies
createAuditorsBatchesV2(uint gi, address[] calldata eligibleAuditors, bytes32 selectionReceiptCID)createTier1AndTier2V2(uint gi, address[] calldata eligibleTier1Aggregators, address[] calldata eligibleTier2Aggregators, bytes32 selectionReceiptCID)
The contract should verify that every supplied address:
- is registered for that GI;
- still has sufficient stake;
- is still active according to the validator stake contract.
The contract should not attempt to re-run capability matching.
Implement the first selector in the model-owner CLI because batch creation is already driven there.
Update:
dincli/cli/modelownerd/auditor_batches.pydincli/cli/modelownerd/aggregation.py- optionally shared selector helpers in
dincli/services/capability.py
- load the manifest capability spec;
- fetch the registered pool from the contracts;
- fetch each validator profile reference;
- resolve the profiles from local cache or IPFS;
- filter hard mismatches;
- build a selection receipt;
- upload the receipt to IPFS;
- call the
V2batch-creation method with the eligible subset and receipt CID.
Once the model owner decides the compatible subset off-chain, there needs to be a reviewable artifact explaining which validators were excluded and why.
Make acceptance, not assignment, the start of slashability.
foundry/src/DINTaskAuditor.solfoundry/src/DINTaskCoordinator.solfoundry/src/DINShared.sol
- acceptance and decline functions for auditor, T1, and T2 batches;
- per-batch acceptance mappings;
- accepted-count tracking or equivalent checks.
Do not add a large number of new GI states unless necessary.
A lower-risk path is:
- keep
AuditorsBatchesCreatedandT1nT2Bcreated; - allow acceptance during those states;
- make
startLMsubmissionsEvaluation()require accepted auditor quorum; - make
startT1Aggregation()require accepted T1 quorum; - make
startT2Aggregation()require accepted T2 quorum.
This keeps the lifecycle readable and reduces migration cost.
Update:
dincli/cli/auditor.pydincli/cli/aggregator.py
Add commands to:
- show acceptance status for assigned batches;
- accept a batch;
- decline a batch.
Update model-owner commands to detect when a batch lacks accepted quorum and either:
- rebuild the batch; or
- abort the phase transition with a clear error.
Align slashing with explicit accepted responsibility.
foundry/src/DINTaskCoordinator.solfoundry/src/DINTaskAuditor.sol- technical docs that currently describe slashing behavior
- slash aggregators only if they accepted the relevant T1 or T2 assignment;
- slash auditors only if they accepted the relevant audit batch;
- exclude declined or unaccepted validators from no-show penalties.
The first version does not need a separate slashing path for "false hardware advertisement."
Operationally, the accepted-assignment boundary is enough to fix the current unfairness.
Make the new model understandable and reproducible for contributors and model owners.
Documentation/technical/contracts/DINTaskCoordinator.mdDocumentation/technical/contracts/DINTaskAuditor.mdDocumentation/technical/manifest.mdDocumentation/public/roles/aggregators.mdDocumentation/public/roles/auditors.mdDocumentation/public/roles/model-owner.md
- document the new manifest fields;
- document the new registration flow;
- document the new batch-creation flow;
- document acceptance as the slashability boundary;
- add one complete end-to-end example using the reference manifest.
Add or expand tests under:
foundry/test/- optionally
hardhat/test/
Test cases should include:
- registration with and without capability profile reference;
- rejection when an eligible pool contains an unregistered validator;
- rejection when an eligible pool contains an inactive validator;
- successful batch creation from a filtered subset;
- acceptance gating before evaluation or aggregation starts;
- slashing only for accepted validators.
Add tests under tests/ for:
- manifest capability-spec parsing;
- local capability-profile normalization;
- matching logic for auditor and aggregator roles;
- selection-receipt generation;
- CLI registration gating behavior.
Add one end-to-end path that proves:
- a weak validator is prevented from entering the compatible subset;
- a strong validator is selected;
- the selected validator must accept before slashability exists.
- manifest schema
- local capability detection
- preflight commands
- docs and example manifest
This phase is low risk and should land first.
V2registration methods- profile references on-chain
- selection receipt generation
V2batch-creation methods
This is the first phase that actually changes assignment behavior.
- accept and decline methods
- phase-transition gating on accepted quorum
- slash-on-accept semantics
This is the phase that fixes the current accountability boundary.
- move selector logic from model-owner CLI into
dind - add availability tracking
- add reliability-aware ranking
This should come last because it builds on stable metadata and contract semantics.
Use feature detection rather than a flag day cutover.
Recommended approach:
- new manifests declare
capability_spec; - new contracts expose
V2methods; dinclichecks whether both are available;- if either side is missing, the CLI falls back to legacy behavior only on explicitly allowed networks.
That avoids breaking old devnet flows while still giving a clear upgrade path.
The implementation is complete when:
- model owners can publish a capability spec in the manifest;
- validators can generate a capability profile and register with its reference;
- model-owner tooling can produce a compatible subset and selection receipt;
- contracts can build batches only from that compatible subset;
- validators must accept assignments before they become slashable;
- tests cover both the happy path and the refusal path.