Signal template
Copy templates/signal-bot/ into the implementation repo. Fill in decide(). Run the fixtures.
Files
templates/signal-bot/
README.md
bot.ts
config.schema.json
default.config.json
input.fixture.json
expected.output.json
tests.spec.ts
Bot interface bound
This template implements Bot<RawClobUpdate, MarketSnapshot>. The contract is the canonical bot interface.
The only function you write
async decide(input: RawClobUpdate, ctx: BotContext): Promise<MarketSnapshot> {
const observedAt = ctx.now();
return {
schemaVersion: "1.0.0",
marketId: input.conditionId,
conditionTokens: input.tokens,
resolution: { status: input.status },
prices: { yes: input.yesPusd, no: input.noPusd },
liquidityPusd: input.liquidityPusd,
source: "clob_v2",
observedAt,
freshnessMs: observedAt - input.exchangeTimestampMs,
provenance: hash(input.raw),
};
}
What's already wired for you
init(),validateInput(),explain(),emit(),health(),setMode().- ReportEnvelope construction with correlation IDs, builderCode, killSwitchState.
- The full test harness — unit, integration, property, failure-injection.
- Config schema validation; the bot crashes on init if its config violates a hard threshold.
Promotion checklist
- Implement
decide(). - Run
npm test— all four test classes must pass. - Open a PR with the bot's spec page linked in the description.
- Promote through the modes ladder:
stub → shadow → advisory → enforced.