DamageBDD: Turn Acceptance Criteria into Evidence You Can Share

Make the acceptance conversation executable

β€œIt worked on my machine” leaves the next person with an investigation. A useful acceptance record tells them what was requested, what was observed, which version ran and where to inspect the result.

DamageBDD connects a readable behaviour specification to an execution and its report. This is a practical entry point for API teams, integration developers, service operators and contractors agreeing on a delivery boundary. The first adoption goal can be small: turn one recurring support issue into a scenario that another person can run and understand.

Begin with an observable contract

The following is an illustrative scenario using sentence patterns implemented in steps_http.erl. The reserved example host and response are placeholders; replace them with an authorised test service. This example was not executed during the review.

Feature: Service readiness is visible to clients

  Scenario: The readiness endpoint reports a healthy service
    Given I am using server "https://service.example"
    When I make a GET request to "/health"
    Then the response status must be "200"
    And the json at path "$.status" must be "ok"

The supported vocabulary gives the example its meaning. Add scenarios for the failures your users actually experience: a refused request, a missing dependency or an incorrect response field. New sentences require matching step implementations; ordinary prose alone is not executable coverage.

A report can travel with the discussion

In the reviewed runner, the report directory is published through IPFS after run metadata is written. The returned record includes feature_hash, report_hash, release information and encrypted-context references. This gives a handoff a stable content reference instead of relying on a screenshot or a mutable copy of a log.

That distinction is useful when a customer and supplier disagree about a regression. They can refer to the same scenario and report, then compare a later run against it. Content addressing detects changed bytes; continued availability still depends on retention, pinning and the serving infrastructure. The observations remain those of the executing environment.

A failed run may also have a report hash. The HTTP execution code handles explicit failure fields before the ordinary report-hash success branch. Integrations should inspect the result and failing step, and should distinguish dry-run output from an executed check. Saving a report is not itself success.

Keep checking the behaviour that matters

The scheduling code stores a feature reference with account, schedule and concurrency information, registers execution through the schedule index, and records execution state. That supports a useful progression: prove a scenario manually, then run it on a schedule to detect a recurrence.

Configuration, account state and downstream services are part of that operational path. A pilot should include restart recovery, one expected failure and a check that the reported schedule corresponds to the intended feature. It should also establish resource use before raising concurrency. The source review provides no throughput measurement or planetary-scale capacity result.

A first pilot with a clear finish

Pick a customer-facing API behaviour with a known failure mode. Write a passing scenario and a negative case. Preserve the feature, release identity, execution result and report references. Ask a colleague to reproduce the result from those records, then repeat through the scheduler.

The pilot succeeds when both people can explain the same outcome from the same evidence, and a deliberately failing case remains visible as a failure. Only after that should you extend the workflow into custody, payments or cross-node verification. Those paths need their own acceptance evidence.

Source basis and next steps

Reviewed source: apps/damage/src/damage.erl (execution and report assembly), damage_http.erl (result handling), steps_http.erl (scenario vocabulary), damage_schedule.erl, damage_schedule_index.erl and damage_release_nft.erl. Tests for HTTP context and release discovery are present in apps/damage/test/; they were not run in this review.