Good First Issue
Add a new scenario heartbeat-timeout. The TIMEOUT_NO_HEARTBEAT detection rule
has no scenario covering it, so nothing in the corpus would catch a regression in
it.
What to do
- Create
packages/toolkit/src/scenarios/__scenarios__/heartbeat-timeout.ts
- Build a synthetic trace where the station boots and then never sends a
Heartbeat:
BootNotification at 2026-01-15T06:00:00.000Z
- Its
CallResult with interval: 300
StatusNotification (connector 1, status Available) at
2026-01-15T06:12:00.000Z, and its CallResult
- No
Heartbeat anywhere in the trace
- Set
expectedFailures: ['TIMEOUT_NO_HEARTBEAT']
- Add an assertion, for example
{ type: 'failure_severity', params: { code: 'TIMEOUT_NO_HEARTBEAT', severity: 'warning' } }
- Import and register in
packages/toolkit/src/scenarios/index.ts
- Update the scenario count and name list, see "Files to modify"
- Add a changeset with
pnpm changeset, minor bump for @ocpp-debugkit/toolkit
Why those timestamps
The rule reads interval from the BootNotification response and sets a threshold
at twice that interval after the boot, so 300 gives a threshold at
06:10:00.000Z. It deliberately stays silent when the trace simply ends before a
heartbeat is due, so the trace needs at least one event after the threshold. The
StatusNotification at 06:12:00.000Z is what makes the rule fire.
Files to modify
packages/toolkit/src/scenarios/__scenarios__/heartbeat-timeout.ts (new)
packages/toolkit/src/scenarios/index.ts (register, and add to scenarioNames)
packages/toolkit/src/scenarios/index.test.ts (count, name order, getScenario)
tests/external-fixture/test.mjs (count)
README.md (count)
packages/toolkit/README.md (count)
.changeset/ (new changeset file)
Guidelines
- All data must be synthetic. This scenario reserves station ID
CS-SYNTHETIC-018, so please use that one.
- Follow the pattern in an existing scenario file,
unresponsive-csms.ts is a
close match in shape.
- Verify with
ocpp-debugkit scenario run heartbeat-timeout that
TIMEOUT_NO_HEARTBEAT is the only failure reported. If another rule fires,
adjust the trace rather than adding the extra code to expectedFailures.
- Then run the full local check from
Verify Locally.
ocpp-debugkit ci covers neither formatting nor lint nor types, and CI stops at
the first failure.
- The scenario count depends on what has merged ahead of you. Run the suite and
use the number it reports rather than assuming.
How to claim
Comment "I'd like to work on this" and it will be assigned to you.
Please hold one open claim at a time. Once the pull request for it is merged,
say which issue you want next and it will be assigned. That keeps issues from
sitting claimed while another is still in review, so other newcomers can see
what is genuinely free.
Good First Issue
Add a new scenario
heartbeat-timeout. TheTIMEOUT_NO_HEARTBEATdetection rulehas no scenario covering it, so nothing in the corpus would catch a regression in
it.
What to do
packages/toolkit/src/scenarios/__scenarios__/heartbeat-timeout.tsHeartbeat:
BootNotificationat2026-01-15T06:00:00.000ZCallResultwithinterval: 300StatusNotification(connector 1, statusAvailable) at2026-01-15T06:12:00.000Z, and itsCallResultHeartbeatanywhere in the traceexpectedFailures: ['TIMEOUT_NO_HEARTBEAT']{ type: 'failure_severity', params: { code: 'TIMEOUT_NO_HEARTBEAT', severity: 'warning' } }packages/toolkit/src/scenarios/index.tspnpm changeset, minor bump for@ocpp-debugkit/toolkitWhy those timestamps
The rule reads
intervalfrom the BootNotification response and sets a thresholdat twice that interval after the boot, so 300 gives a threshold at
06:10:00.000Z. It deliberately stays silent when the trace simply ends before aheartbeat is due, so the trace needs at least one event after the threshold. The
StatusNotificationat06:12:00.000Zis what makes the rule fire.Files to modify
packages/toolkit/src/scenarios/__scenarios__/heartbeat-timeout.ts(new)packages/toolkit/src/scenarios/index.ts(register, and add toscenarioNames)packages/toolkit/src/scenarios/index.test.ts(count, name order,getScenario)tests/external-fixture/test.mjs(count)README.md(count)packages/toolkit/README.md(count).changeset/(new changeset file)Guidelines
CS-SYNTHETIC-018, so please use that one.unresponsive-csms.tsis aclose match in shape.
ocpp-debugkit scenario run heartbeat-timeoutthatTIMEOUT_NO_HEARTBEATis the only failure reported. If another rule fires,adjust the trace rather than adding the extra code to
expectedFailures.Verify Locally.
ocpp-debugkit cicovers neither formatting nor lint nor types, and CI stops atthe first failure.
use the number it reports rather than assuming.
How to claim
Comment "I'd like to work on this" and it will be assigned to you.
Please hold one open claim at a time. Once the pull request for it is merged,
say which issue you want next and it will be assigned. That keeps issues from
sitting claimed while another is still in review, so other newcomers can see
what is genuinely free.