The work item, walked¶
A review artefact. The full field list across five different paths, so the set can be checked rather than trusted.
Scenarios¶
| Path | Exercises | Status | |
|---|---|---|---|
| A | Routine, drafted and sent | The happy path | Written |
| B | Flagged, still drafted and sent | attention_reason alongside sent_by_us |
Written |
| C | Cannot determine, acknowledgement only | closed_by_human, acknowledgements, no model call at step 2 |
Written |
| D | The human replied first | closed_manual, reconciliation |
Written |
| E | Nothing needed | closed_no_action, shortest path |
Written |
| F | Draft edited before approval | final_payload_hash, the commonest human action |
Written |
| G | Close confirmed under review | close_review: required, a confirm rather than an approve |
Written |
| H | Job created with gaps filled | create_job, the prefilled form |
Written |
| I | Multi-turn conversation | brain_calls climbing, category revision, job re-resolution |
Not yet |
| J | Multi-category | secondary_categories, currently unjustified |
Not yet |
| K | No draft possible (parse_failure) |
The human writes from scratch with nothing | Not yet |
| L | Reopened after closing | first_closed_at, reopen_count, versions restamped |
Not yet |
| M | Draft regenerated by staleness | brain_calls climbing, a superseded approval record |
Not yet |
| N | mailbox approval surface |
A different approval surface | Not yet |
| O | System failure | Item stuck in new, never reaches the client |
Not yet |
All twelve are now writable. Everything they exercise is decided, so the remaining seven are writing rather than design.
M raises a question nothing has answered: when a draft is regenerated, the first approval record is superseded and a new one is pending. Only one is ever pending, so "which is live" is unambiguous, but the walkthrough should show both rows to make that visible.
What to look for:
| Question | How to spot it |
|---|---|
| Is a field ever actually used? | A row that stays null in every path is redundant |
| Is a field ambiguous? | A row where two paths disagree about what a value means |
| Is something missing? | A path where you cannot tell what happened from the fields alone |
| Is a field set too early or too late? | A value that arrives before the thing it describes is known |
A. Routine, drafted and sent¶
"Hi, we're after a price on upgrading the board at our Preston warehouse. Fairly urgent, our insurer is asking."
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
sent_by_us |
sent_by_us |
current_stage |
captured |
decided |
awaiting_human |
reconciled |
completed |
brain_calls |
0 | 1 | 2 | 2 | 3 |
model_calls |
0 | 1 | 2 | 2 | 3 |
config_version |
null | 12 | 12 | 12 | 12 |
catalogue_version |
null | 3 | 3 | 3 | 3 |
category |
null | quote_request |
|||
secondary_categories |
null | [] |
|||
priority |
null | high |
|||
customer_id |
null | cust_00412 |
|||
job_id |
null | null | |||
job_link_basis |
null | null | |||
job_link_certain |
null | null | |||
attention_reason |
null | null | |||
attention_detail |
null | null | |||
closed_at |
null | null | null | null | set |
priority: high came from a rule (mentions an insurer), not the model. job_id stays null because a quote request has no job yet, which is correct rather than a failure.
B. Flagged, still drafted and sent¶
"Your invoice on job 4471 is wrong and I've spoken to my solicitor."
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
sent_by_us |
sent_by_us |
current_stage |
captured |
decided |
awaiting_human |
reconciled |
completed |
brain_calls |
0 | 1 | 2 | 2 | 3 |
model_calls |
0 | 1 | 2 | 2 | 3 |
config_version |
null | 12 | 12 | 12 | 12 |
catalogue_version |
null | 3 | 3 | 3 | 3 |
category |
null | invoice_query |
|||
secondary_categories |
null | [] |
|||
priority |
null | urgent |
|||
customer_id |
null | cust_00218 |
|||
job_id |
null | job_04471 |
|||
job_link_basis |
null | quoted_reference |
|||
job_link_certain |
null | true |
|||
attention_reason |
null | legal_risk |
stays set | stays set | |
attention_detail |
null | "Refers to speaking with their solicitor" | |||
closed_at |
null | null | null | null | set |
This is the path that forced attention_reason out of status. The item was flagged and still ended sent_by_us. If the flag lived in status, this row would have to lie about one or the other.
C. Cannot determine, acknowledgement only¶
"Following up on the thing we discussed."
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
closed_by_human |
closed_by_human |
current_stage |
captured |
decided |
awaiting_human |
reconciled |
completed |
brain_calls |
0 | 1 | 1 | 1 | 2 |
model_calls |
0 | 1 | 1 | 1 | 2 |
config_version |
null | 12 | 12 | 12 | 12 |
catalogue_version |
null | 3 | 3 | 3 | 3 |
category |
null | unclear |
|||
secondary_categories |
null | [] |
|||
priority |
null | normal |
|||
customer_id |
null | cust_00733 |
|||
job_id |
null | null | |||
job_link_basis |
null | null | |||
job_link_certain |
null | null | |||
attention_reason |
null | unclear_category |
stays set | stays set | |
attention_detail |
null | "Cannot tell what is being asked" | |||
closed_at |
null | null | null | null | set |
An acknowledgement went out, then the human wrote the real answer themselves, so the outcome is closed_by_human rather than sent_by_us.
Neither counter moves at step 2. An acknowledgement is a template render, so there is no second brain call and no model call. Compare with path A, where drafting cost both.
D. The human replied first¶
A quote request, but someone answered from their phone while it sat waiting.
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
closed_manual |
closed_manual |
current_stage |
captured |
decided |
awaiting_human |
reconciled |
completed |
brain_calls |
0 | 1 | 2 | 2 | 3 |
model_calls |
0 | 1 | 2 | 2 | 3 |
config_version |
null | 12 | 12 | 12 | 12 |
catalogue_version |
null | 3 | 3 | 3 | 3 |
category |
null | quote_request |
|||
secondary_categories |
null | [] |
|||
priority |
null | normal |
|||
customer_id |
null | cust_00901 |
|||
job_id |
null | null | |||
attention_reason |
null | null | |||
attention_detail |
null | null | |||
closed_at |
null | null | null | null | set |
We paid for a draft nobody used. That is what the closed_manual rate measures, and why a high rate means too slow rather than inaccurate.
Worth checking
Nothing on the item records what the human actually sent. The reconcile
step found their reply, so we have it. Should there be a pointer, or is the
outbound message row enough?
E. Nothing needed¶
A supplier newsletter.
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
closed_no_action |
n/a | n/a |
current_stage |
captured |
decided |
completed |
||
brain_calls |
0 | 1 | 1 | ||
model_calls |
0 | 1 | 1 | ||
config_version |
null | 12 | 12 | ||
catalogue_version |
null | 3 | 3 | ||
category |
null | marketing |
|||
secondary_categories |
null | [] |
|||
priority |
null | low |
|||
customer_id |
null | null | |||
job_id |
null | null | |||
attention_reason |
null | null | |||
attention_detail |
null | null | |||
closed_at |
null | null | set |
The shortest path. One brain call, one model call, no draft, no human. If close_item is in actions_requiring_approval during onboarding, this path gains a review step and ends closed_no_action after approval instead.
F. Draft edited before approval¶
Same email as path A, but the approver rewrites two sentences before approving.
Identical to A on the work item. The difference is entirely on the approval row.
approval field |
Value |
|---|---|
action_name |
draft_reply |
payload_hash |
Hash of what we proposed |
final_payload_hash |
Hash of what the human sent |
status |
approved |
decided_by |
sarah@greenhills.com.au |
Both hashes are kept. The first proves what we generated, the second proves what went out. Keeping only one loses either the evidence or the accountability.
The diff between them is the training signal. Consistent rewording in the same direction says the prompt or the voice config is wrong, and it feeds the generation feedback store rather than the triage one.
In reporting this counts toward edit rate, not approval rate. A high approval rate with a high edit rate means people are fixing the output rather than trusting it.
G. Close confirmed under review¶
A supplier newsletter, but the tenant is on
close_review: requiredduring onboarding.
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve |
|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
closed_no_action |
current_stage |
captured |
decided |
awaiting_human |
completed |
brain_calls |
0 | 1 | 1 | 1 |
model_calls |
0 | 1 | 1 | 1 |
category |
null | marketing |
||
priority |
null | low |
||
attention_reason |
null | null | ||
closed_at |
null | null | null | set |
Compare with path E, the same email under close_review: none. There it closed at step 2 with no human involved. Here it waits.
No second brain call. Closing needs no generation, so the counters stay at 1 throughout.
If the human corrects it rather than confirming, the item does not close: the category is corrected and it goes back for a draft. That correction is a labelled example for the eval set, which is the real argument for running this mode during onboarding.
H. Job created with gaps filled¶
"Can you get someone out to look at the switchboard at our Coburg site?"
| Field | 1.1 Capture | 1.2 Brain | 2 Execute | 3 Approve | 4 Loop |
|---|---|---|---|---|---|
status |
new |
assessing |
awaiting_approval |
sent_by_us |
sent_by_us |
current_stage |
captured |
decided |
awaiting_human |
reconciled |
completed |
brain_calls |
0 | 1 | 2 | 2 | 3 |
model_calls |
0 | 1 | 2 | 2 | 3 |
category |
null | job_request |
|||
priority |
null | normal |
|||
customer_id |
null | cust_00412 |
|||
job_id |
null | null | set on creation | ||
attention_reason |
null | null |
The approval record carries the proposed job, with gaps:
| Field | Proposed | After the human |
|---|---|---|
| Customer | cust_00412 |
unchanged |
| Description | From the email | unchanged |
| Site address | missing | 14 Gaffney St, Coburg |
| Job type | missing | Switchboard inspection |
final_payload_hash differs from payload_hash, exactly as with an edited draft, because the human changed what we proposed.
job_id is set at creation, not at 1.2.2. Resolve found no existing job, correctly, because this one did not exist until the human approved it.
What the paths show¶
| Field | Used in | Verdict |
|---|---|---|
status |
All | Earning its place |
current_stage |
All | |
brain_calls |
All | |
model_calls |
All | Diverges from brain_calls only on retries and idempotency hits. Not visible in these eight |
config_version, catalogue_version |
All | |
category |
All | |
secondary_categories |
None | Still unjustified. Needs scenario J |
priority |
All | |
customer_id |
A, B, C, D, H | Null in E, correctly |
job_id |
B and H only | Thin, and correct: most emails have no job |
job_link_basis, job_link_certain |
B only | Same |
attention_reason |
B, C | |
attention_detail |
B, C | |
closed_at |
All | |
approval.payload_hash |
A, B, C, F, G, H | |
approval.final_payload_hash |
F and H only | Only when a human changed something |
Questions this raises¶
secondary_categories is still unused in every written path. Scenario J would justify it. Until then, an empty array on every routine item is a column doing nothing.
job_link_basis and job_link_certain only appear alongside job_id. Three fields that are all null or all set. Worth asking whether that is one nested value rather than three columns.
model_calls never differs from brain_calls in any written path. It diverges only on a parse retry or an idempotency hit, neither of which is a normal path. Still worth having, and worth knowing it is invisible most of the time.
Nothing records what a human sent when they wrote it themselves (C) or replied first (D). The outbound message row has it, so the question is whether the work item needs a pointer.
final_payload_hash appears in two of eight paths, and both are the cases where evidence matters most: a human changed what we proposed. Worth confirming it is nullable rather than always written.