7 Nov 2026 · live Citi Bike feed#data-incidents
watcher › run #1: 2,520 stations 47 report a last update in 1970 → INC-001 @remediator please propose a remediation

Signoff

AI agents catch bad data in the team chat. A person signs off on the fix. Nothing downstream acts on data nobody trusts.

Flip the Switch Hackathon · Track 01 · Best Business Workflow · Paras Adlakha & Harshita Adlakha

The workflow

Detect → propose → sign off → verify → gate.

Two Switch rooms in Mattermost, four agents and two people. Agents never call each other: every hand-off, approval and refusal goes through the room, where people can see it.

Agent · @monitor
Watcher runs a 12-rule contract on the live feed every minute and opens one thread per incident, with evidence.
Agent · @remediator
Fixer proposes a remediation, previews exactly what changes, and asks the data owner.
Person · data owner
@fixer approve INC-001. Anyone else is refused by Switch.
Agent · @recorder
Watcher verifies on the next run and closes; scribe writes the postmortem document.
Agent · @dispatch-analyst
Analyst reads data-status before every dispatch answer.
Untrusted: "🛑 I won't send a truck on this data", with the reasons.
Caveated: the answer, with every open incident named.
Trusted: the answer, every station cited [n].
Live, on real data

Three real incidents on the first run.

On 7 November 2026 the live Citi Bike feed had 47 stations reporting a last update in 1970, 6–9 reporting more bikes than docks, and 27 silent for a day. The frozen feed later in the demo is a simulation, and it's labelled as one.

Demo · 2½ minutes · narrated
#data-incidents · the fixer's proposal
The fixer's proposal for INC-001 in Mattermost
#rebalancing-desk · a caveated answer
A caveated answer from the analyst
The gate · Switch refuses for the fixer
Switch refuses an approval from someone who isn't the owner
Frozen feed · the analyst refuses
The analyst refuses to answer on untrusted data
Why Switch is central

Take Switch away and there's no hand-off, no sign-off, no gate.

rooms → mattermost
create_room(people, agents, instructions, roles, links)
roles, exclusive
send_targeted_message( target_roles=["remediator"])
the sign-off gate
fixer.addressing = "owner_and_owner_agents"
shared state
room documents: data-status · incident-log postmortem-INC-00x
threads · links
one incident = one thread desk ⇄ incidents, labelled
agent protocol, no SDK
WebSocket events, ping/pong, resume · HTTP operations
Why it matters

Bad data is expensive, and invisible to the people deciding.

Revenue
31%
affected by data quality issues on average; ~15 h per incident
Monte Carlo, 2023
Data cascades
92%
of high-stakes AI projects hit compounding downstream harm
Sambasivan et al., CHI 2021
Agentic AI
40%+
of agentic AI projects expected to be cancelled by 2027, partly for weak risk controls
Gartner, 2025

Read the market brief →

Run it yourself · Docker + Node 22

Five commands. No workspace, no key.

terminal~/signoff
git clone https://github.com/ParasAdlakha/signoff && cd signoff npm run init-env # random secrets npm run switch:up # Switch 0.31 + Postgres + Mattermost npm run bootstrap # agents, addressing, rooms, roles, links npm start # four agents → open http://localhost:8065