Repository navigation
Description
Part of the testnet readiness umbrella (#166).
Why
Item 7 of the pre-testnet requirements research on discussion No. 132, raised again in the Sep 18, 2026 Testnet-Ready session: list in advance what can go wrong during and after launch, and plan the response, so we protect uptime and reputation.
Nothing in the repo covers what happens during an incident. The "public status page" in Developer/issues/validator-operations.md is a different thing: it exists to show validators the network isn't empty before they join.
Scope
A written, rehearsed runbook plus a way to tell external participants what is going on mid-incident. The Security Alliance web3 incident response template is the reference starting point.
- Incident catalogue. DIN-specific failure modes, each with severity, detection signal and first response. Starting list:
- Smart contract bug or exploit in platform contracts (
DinCoordinator,DinToken,DinValidatorStake,DinModelRegistry, treasury/fee/emission contracts) or task contracts - A GI stuck in a phase with no way forward. This has already happened: Model_0 GI 2 has sat in
DINaggregatorsRegistrationStartedsince July (see discussion No. 150) - Wrong or unexpected slashing
- Key compromise: DIN-Representative, proxy admin, model owner or validator
- Malicious or broken service code in a model manifest running on validator nodes
- Poisoned model updates getting through aggregation
- IPFS provider or pinning outage, or RPC outage
- Faucet or test-token drain
- Smart contract bug or exploit in platform contracts (
- Emergency levers. What we can actually do on-chain today. None of the contracts in
foundry/src/has a pause function, so the only lever is a proxy upgrade viaUpgradePlatform.s.sol. Decide whether testnet needs a pause/guardian mechanism, or record that we accept not having one. - Roles and contact. Who is on call, who can sign which transactions, and how the team reaches each other fast. The on-call/backup rota itself lives in the internal incident log (item 7).
- Participant communication. Where validators, clients and model owners hear about an incident (e.g. the validator Signal group, a status page) and message templates for "investigating / mitigated / resolved".
- Post-incident. A short post-mortem template, and how fixes feed back into the DevNet release cycle.
- Rehearsal. At least one tabletop run-through with the team before the first external cohort joins.
- Internal incident log and maintainer rota. Use discussion No. 170 as the model: it already does this for red or missing
developCI runs. It names backup maintainers, sets an escalation threshold (about 6 hours unaddressed, with more commits on top), opens one thread per incident with the commit hash, run URL and cause, and closes each thread with the fix and a green run, so the discussion doubles as the log. Testnet incidents need the same thing, with one difference: it must be internal, not public.- Why not public GitHub: an exploit, key compromise, faucet drain or wrong slashing must not be disclosed before it is mitigated. Discussion No. 170 is fine in public because a red CI run on
developexposes nothing an attacker can use. - What it needs: one record per incident (severity, what was detected and when, affected contracts/models/addresses or tx hashes, who is handling it, timeline, resolution, link to the post-mortem). It also needs a named primary and backup maintainer with an escalation rule: who steps in, after how long.
- Platform (to decide):
- (a) a private repo in the org, e.g.
InfiniteZeroFoundation/incidents, with one issue per incident. Same tooling as today, with access control, labels for severity, and a searchable history. - (b) a private Slack channel for real-time coordination, paired with (a) or a doc as the durable log.
- (c) a private shared doc or tracker (Notion, Google Doc) with a fixed per-incident template.
- (d) Monitor-driven incident response. OpenZeppelin Monitor (self-hosted, open source) watches DIN contracts for catalogue signals (stuck GI phase, unexpected slashing, faucet drain, proxy admin changes, upgrades) and raises incidents in PagerDuty (free tier, up to 5 users). PagerDuty holds the on-call schedule (primary and backup), the escalation policy and the per-incident record and timeline. Post-mortems are linked from each incident. Contract vulnerabilities are fixed through GitHub private security advisories. SEAL 911 is listed as the external escalation for live exploits. Revisit Hypernative if DIN moves to mainnet with real value at risk.
- For contract vulnerabilities specifically, also consider GitHub's private security advisories on this repo, which keep the fix and disclosure private until it ships.
- (a) a private repo in the org, e.g.
- Public side: once an incident is mitigated, only a sanitized summary goes out through the participant channel (item 4). The internal record stays internal.
- Why not public GitHub: an exploit, key compromise, faucet drain or wrong slashing must not be disclosed before it is mitigated. Discussion No. 170 is fine in public because a red CI run on
Acceptance criteria
- Runbook doc merged in the repo (location to be decided:
Documentation/public/for the participant-facing part,Documentation/technical/for the internal procedures) - Incident catalogue covers at least the list above, each with a first response
- Pause/guardian decision recorded
- Participant communication channel set up and linked from onboarding docs
- Internal incident log platform chosen and set up (access limited to the team), with primary and backup maintainers named and the escalation rule written down
- One tabletop rehearsal done, with findings recorded
Timing
Long-running. It must be done before the first external cohort joins testnet, and should be revised after each DevNet release.
Activity
abrahamnash commentedon Oct 26, 2026
First draft of the incident-response runbook, for review. @umeradl could you check the "Emergency levers" table and the "Gaps found while drafting" section for accuracy? Names in "Roles and contacts" still need filling in. Once we agree the content, I'll add it to the repo.
InfiniteZero Testnet Incident-Response Runbook
Draft for review, 25 October 2026.
Purpose and scope
This runbook tells the InfiniteZero team what to do, in what order, when something goes wrong on the public testnet. It is a draft for issue #167, to be refined by the core team before launch.
An incident is anything that puts participants' funds, data, trust or ability to take part at risk, for example:
dinclirelease, or an infrastructure outage (RPC, IPFS);Testnet tokens have no real-money value, but treat every incident as rehearsal for mainnet: the same contracts, keys and habits carry over.
Roles and contacts
Every incident has one named incident lead who makes the calls; everyone else supports them. Fill in names and backups before launch.
One person can hold more than one role during testnet, but the incident lead and the key holder should be different people where possible, so no single person acts alone on an admin key.
Open question: what response time can the team realistically commit to outside working hours? Set this before writing the severity targets below into anything public.
Severity levels
Set the severity in the first 15 minutes; raise or lower it as you learn more. When unsure, pick the higher level.
dinclirelease; RPC or IPFS outage blocking participation; a vulnerability reported privatelyResponse times are proposals; adjust them to what the team can commit to (see Roles and contacts).
The first 30 minutes
Whoever spots a problem starts here, even if they are not the incident lead.
Playbooks
Each playbook follows the same order: contain, fix, communicate. The lever names refer to the Emergency levers table.
1. Admin key leaked or misused (SEV1)
The deployer key owns every platform contract and all seven ProxyAdmins, so it can change settings and upgrade contract code.
develop, publish the new addresses, and updatedincli/config/din_info.jsonand the docs. Announce the old addresses as compromised.retireFaucetin a panic: it is one-way and also locks the mint-cap setting.2. Smart-contract bug being exploited (SEV1)
No contract has a global pause, so containment means switching off the specific path being abused.
DinCoordinator.removeSlasherContract.disableModel(note: its live task contracts keep running until the Three dormant/no-op mechanisms awaiting a product decision: disableModel kill-switch, rejectModel fee handling, S6 slashing (M-2, L-4, BL-31) #224 kill-switch is built).3. Honest validators slashed or jailed (SEV1 at scale, SEV3 for one)
reactivate.4. Training round stuck (SEV2)
Until #222 is built, a stuck round cannot be recovered on-chain, and its rewards and validators' registration slots stay locked.
5. Broken
dinclirelease (SEV2)develop, test, publish a new release, then announce it.6. Infrastructure outage: RPC, IPFS, OP Sepolia (SEV2)
dinclisupports several IPFS providers and an opt-in gateway fallback).7. A participant's key is leaked (SEV3, SEV2 if many)
blacklistValidator: nobody can then stake or unstake with it, so an attacker can't withdraw the stake. It's reversible withunblacklistValidatoronce the owner has a safe new key.8. Scams and impersonation (SEV3, SEV2 if spreading)
Another project already uses the name and ticker "DIN", so expect confusion and fake airdrops.
Emergency levers
These are the on-chain actions the team can take today on
develop's contracts. There is no global pause, so every response uses one of these targeted levers. All exceptreactivateneed the platform owner key (the deployer, today); task-contract settings need the model owner's key.DinCoordinator.setMintCap(set to current total minted)DinCoordinator.retireFaucetDinCoordinator.removeSlasherContractDINModelRegistry.disableModelenableModelDinValidatorStake.blacklistValidatorunblacklistValidatorDinValidatorStake.setS5GlobalParams,setS5RecidivismParams,setMinStake,setUnbondingPeriodsetS5GlobalParams(0, 0)switches the cross-model escalation offDinEmission.setEmissionParamsDINTaskAuditor.setRewardSplit(model owner)transferOwnershipon each contract and ProxyAdminDinValidatorStake.reactivate(the validator)Practise each lever on the DevNet 3.0 rehearsal before launch, so nobody uses one for the first time during an incident.
Communication
The comms lead posts in the Telegram community (main channel) and a pinned GitHub Discussion, with Signal as a mirror. Say what you know, what you don't, and when the next update comes. Never post exploit details until the issue is fixed.
1. Initial notice (SEV1/SEV2)
2. Update
3. Resolved
4. Scam warning
After an incident
Within 5 working days of a SEV1 or SEV2, the incident lead publishes a short, blameless post-mortem as a GitHub Discussion, and opens an issue for every follow-up action. Blameless means it describes what happened and why the system allowed it, not who to blame.
Review this runbook after every SEV1 or SEV2, and update it with anything the incident taught you.
Before launch
Tick these off before the public testnet opens; together they make this runbook usable on day one.
Gaps found while drafting
Writing this runbook against
develop(commit 55c4b52) surfaced limits in what the team can do during an incident. Each is a decision for the team; raise the ones you agree with as issues.