Testing by people, on your terms.
BetaTools find a lot, and people still find what tools miss. An engagement is one round of testing by people: a purple-team exercise where your own team tries ATT&CK techniques and checks what TillShield saw, a red-team run, or a pentest by an outside firm. TillShield keeps the plan and its rules of engagement, the owner’s authorisation, the window, what was tried and found, and the report, so the next round and the auditor both start from a record.
Plan an engagement
Under Shield → Engagements, choose New engagement. Give it a name, a kind (purple, red or pentest) and who tests: your own people, or an outside firm. Then write it down the way a statement of work would:
- What it is for, and the rules of engagement, as plain text.
- The assets in scope and out of scope, each with an optional note, up to 50 of each.
- The networks testing comes from, as addresses or CIDR ranges. They must be public and no wider than a /16 for IPv4 or a /32 for IPv6. An outside tester needs at least one.
- The window it may run in, up to 90 days.
- A stop contact: who testers call to stop, or to report something critical at once.
Each engagement gets a number, E-1, E-2 and so on, per workspace. A workspace can have 20 open at once. Only owners and admins see engagements. From the CLI:
tilldev shield engagements plan --name "Q4 pentest" --kind pentest --tester external --firm "Northwind Security" \
--in-scope api.acme.com,app.acme.com --out-of-scope billing.acme.com --sources 81.2.69.0/24 \
--starts 2026-11-02T08:00:00Z --ends 2026-11-13T18:00:00Z --stop-contact "+44 20 7946 0000, Sam on call" \
--rules-file roe.md
tilldev shield engagements authorise 4 --ref "SOW-2026-118" # owners only; asks for an approval
tilldev shield engagements testers add 4 "Northwind team" # prints the private link once
tilldev shield engagements # open engagements
tilldev shield engagements show 4
tilldev shield engagements findings move 4 2 open # confirm; later: retest, fixed
tilldev shield engagements report 4 > E-4.mdStates and the window
| State | Means | Can move to |
|---|---|---|
| Planned | Being written and authorised; no testing | Active (by hand or when the window opens), Cancelled |
| Active | Testing may happen | Paused, Reporting, Cancelled |
| Paused | Testers stop until the team resumes | Active, Reporting, Cancelled |
| Reporting | Testing has ended; findings are written up and retested | Closed |
| Closed | Done; the report stays | None |
| Cancelled | Called off, or the window passed before it started | None |
An authorised engagement starts by itself when its window opens, and testing ends by itself when the window closes, paused or not. A plan whose window passes before it starts is cancelled. The team can start, pause, resume, end, close or cancel by hand at any time the table allows; a pause can carry a reason the testers see, and a cancellation one for the record. Closing needs every new finding triaged.
Runbook: a purple-team exercise
- Plan a purple engagement with your own people as testers and the networks they will test from.
- Add the ATT&CK techniques you want to try as plays, by id (
T1078.004), up to 200. Start with the gaps on the coverage map. - Have an owner authorise it. It starts when the window opens.
- Run each technique and log when it ran. TillShield then lists the TillTell findings that came from the tester networks for that technique, from 15 minutes before the run to 24 hours after, and suggests Detected when there are some.
- Judge each play. The outcome is always the team’s call:
| Outcome | Means |
|---|---|
| Detected | TillTell or another control raised it; this proves the technique on the coverage map |
| Partial | Something was seen, but not enough to act on |
| Missed | It ran and nothing noticed |
| Blocked | A control stopped it from working |
| Not run | Not tried yet, or it could not be tried. A play with a run time and no verdict yet shows as not judged. |
A detected play proves its technique on the coverage map for 90 days, like a TillDrill defense drill. A missed one is a rule to write. The engagement shows how many of the plays that ran were detected or blocked.
Runbook: an external pentest
- Agree the scope and dates with the firm, then plan a pentest engagement with them as the tester.
- Paste the rules of engagement. A template to start from is below.
- List the networks the firm tests from, so their traffic is told apart from an attack.
- Have an owner authorise it, with the statement of work as the reference.
- Give each tester a private link. Through it they read the rules, report findings, log runs and talk to you.
- Triage findings as they come in: confirm or reject each one. Confirmed findings go into the inventory with a fix-by date.
- Fix, then ask for a retest. The tester confirms the fix, or sends it back.
- Close the engagement and export the report.
Objective
Find what an outside attacker could reach from the internet in api.acme.com and app.acme.com.
In scope
api.acme.com and app.acme.com, and the accounts we create for you on them.
Out of scope
billing.acme.com, our staff, our offices, and any third party, including our payment provider.
Not allowed
Denial of service or load beyond 10 requests a second.
Social engineering or phishing.
Reading, changing or deleting other customers' data. Stop and report if you reach any.
Keeping access after the window ends.
Testing comes from
81.2.69.0/24 only. Traffic from anywhere else is not you.
Stopping
If we ask you to stop, stop at once. To ask us to stop, or to report something critical, call the stop contact.
Data
Keep what you see to what proves a finding. Delete copies 30 days after the report.Runbook: a red-team run
A red-team run tests whether the team notices, so fewer people know about it. Plan it with the red team’s networks, keep the stop contact to someone who knows, and have an owner authorise it. Add the techniques as plays: at the end, the plays show what was detected against what was missed, and the timeline shows when the team paused it, if it did. Tell the rest of the team afterwards with the report.
Findings and retests
| State | Means | Next |
|---|---|---|
| New | Reported by a tester, not yet triaged | The team confirms it (Open) or rejects it (Invalid) |
| Open | Confirmed; in the vulnerability inventory | The team asks for a retest once it is fixed |
| Retest | Fixed by the team, waiting for the tester to check | The tester or the team: Fixed, or back to Open |
| Fixed | The retest passed | None |
| Invalid | Not a finding, or out of scope | The team can put it back to New |
A finding has a title, a level (or a CVSS 3.1 base vector that sets it), the asset, an optional ATT&CK technique, and what was found, how to reproduce it, its impact and how to fix it. Every finding starts New, including ones the team records itself. Each finding has its own thread; a note can be shared with the testers or kept to the team.
Open and retest findings are in the vulnerability inventory as Pentest items, numbered E-4 F-2, with an owner, a fix-by date and accepted risk like any other item. They close as fixed once the retest passes.
Tester links
A tester link is made for one named tester and shown once. Its secret sits after the #, so it never reaches a server log or another site as a referrer. The tester needs no TillDev account. An engagement can have 10 live links, and a link stops working when it is revoked or the engagement is closed or cancelled.
Through the link a tester sees the state and window, the stop contact, the rules, the scope and the techniques. They can log when they ran a technique, report findings, confirm or reject fixes on retest, and write on the shared thread. They see the findings testers reported and the notes the team shared, never the team’s verdicts on plays, its private notes or findings it recorded itself. Runs are logged while testing is on; findings are taken while it is on or paused and after it ends.
The report
Export the engagement as Markdown at any time: the window, who authorised it and with what reference, the scope and rules, the techniques with their outcomes and detections, and the findings worst first, without rejected ones. Exporting is in the audit log.
Alerts
The workspace’s security alerts hear when testing starts, pauses, ends or is cancelled, and when a tester reports findings: email, Slack or the signed webhook set under Playbooks & security alerts. An alert carries the engagement and finding numbers, the level and the asset, and a link. What a finding says is never sent. The webhook body:
{
"type": "tillshield.engagement.findings",
"delivery_id": "9c1d4e7a-…",
"findings": [
{ "engagement_id": "3f2a…", "engagement": 4, "number": 2, "level": "high", "asset": "api.acme.com" }
],
"total": 1,
"checked_at": "2026-11-04T14:02:00.000Z",
"link": "https://tilldev.dev/acme/shield/engagements?id=3f2a…"
}A state change has the type tillshield.engagement.state and a changes list, each with the engagement’s id, number, name, new state and any reason.
How engagements are kept
Finding titles and contents and every note are sealed with AES-256-GCM under a key derived from your workspace’s data key for that engagement and that field. A tester link is found by a hash of its secret. Rotating the workspace data key re-seals them; the cryptography inventory lists this use. The plan, the levels and assets are kept in the clear so the list and the inventory can show them.
Limits
| What | Limit |
|---|---|
| Open engagements | 20 a workspace |
| Window | up to 90 days |
| Scope | 50 assets in and 50 out |
| Tester networks | 32, each at most /16 (IPv4) or /32 (IPv6) |
| Plays | 200 an engagement |
| Findings | 500 an engagement; each section up to 32,768 characters |
| Rules of engagement | 20,000 characters |
| Tester links | 10 live an engagement |
| Tester calls | 600 an hour from one network; 60 findings an hour from one link |
The API is under /api/v1/shield/engagements for the team and /api/v1/engage for testers, in the API reference.