{"registry_version":"1.0","vocabulary_version":"1.1","generated_at":"2026-11-04T22:39:32.627Z","contract":"One id from the system of record on every hop. Each hop woken by a named event. Read by id, never by name or phone after intake. An open exception with a named owner stops the chain. A write counts only when the system of record returns an id that reads back. Durable state lives on the shared record.","nodes":[{"slug":"after-hours-desk","name":"After-Hours Desk","office_task":"Answers the phone when we're closed, books one job per caller in our job system, and wakes the on-call only for a real emergency.","verticals":["trades-building"],"standards":["booked-after-hours"],"systems_of_record":["ServiceM8","Simpro"],"consumes":[{"event":"call.received","wake":"webhook"}],"emits":[{"event":"job.created","write":"one job in the job system per enquiry, with the resolved address, the fixed type (emergency, routine or quote) and the caller's words; a repeat call updates the open job and sets duplicate_of instead","readback":"the job system returns the job id (ServiceM8 job uuid, Simpro job ID) and the job is read back by that id before the call is reported as booked; no id that reads back means write_failed, an alert, and no job.created"}],"exceptions":{"raises":["unclassified","address_unresolved","out_of_scope_request","caller_distressed","price_requested","complaint","write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.duplicate_of","seam.call_id","seam.status","seam.exception_owner"]},"runtime":["office-voice-front-desk","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/after-hours-desk","bot":"https://x.ai/bot/jHNUAmOxWE9TvL1lS_8jL"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"After-Hours Front Desk","original_author":"John Shetler","share_link":"https://x.ai/bot/vPREznXsecJi_51MeJNRQ","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"booked-after-hours","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T10:56:21.554Z","run_id":"run-1793703381552","green":8,"red":0,"with_us":1,"evidence_required":0,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T10:58:07.300Z","run_id":"run-1793703487299","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"ageing-monday","name":"Ageing Monday","office_task":"Every Monday, publish the accounts receivable ageing report from the ledger, every figure with its definition, source and as-of time, and say so when one cannot be read.","verticals":["accounting-bookkeeping"],"standards":["recurring-report"],"systems_of_record":["the ledger (Xero or MYOB): aged receivables by due date","the job system (ServiceM8 or Simpro): completed jobs not yet invoiced","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"report.published","write":"one view of the week's ageing report per audience (owner, lender), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/ageing-monday","bot":"https://x.ai/bot/rBaHPQbCcxoLqb4ARo_oJ"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Send weekly AR ageing reports with Invoice Ninja, PDFMint and Gmail","original_author":"Florian Standhartinger","share_link":"https://n8n.io/workflows/19112","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:05:20.739Z","run_id":"run-1793711120737","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"agent-rules-desk","name":"Agent Rules Desk","office_task":"Answer our agents on the state agent rules we are licensed under, only from the rules we hold, citing the clause and edition, or hand the question to the licensee in charge.","verticals":["property"],"standards":["cited-answer"],"systems_of_record":["the mail system that issues the message_id an agent's question arrived on and the reply went out on (Gmail, Outlook)","the agency's own rule library: the state agent legislation and regulations for each state it is licensed in (NSW, QLD, VIC and the rest) and its compliance manual, held as clauses with editions, state or territory and effective dates, with its answer register","the exception desk the agency runs, which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"answer.sent","write":"a stored answer with its source cards (instrument, clause, edition, state or territory, effective date), sent as a reply on the agent's question thread only after the licensee in charge released it on the answer register","readback":"the mail system returns the reply's message_id, and reading that id back returns the thread it replies in and the answer register id; no id back means it was not sent, and cited.send_unconfirmed is raised to the licensee in charge"},{"event":"exception.raised","write":"an exception on the question's message naming the licensee in charge: no licence state given, nothing in the rule library covers it, a compliance finding, breach call or sign-off, a source conflict between two live instruments, or an instrument that moved and waits for a named person to accept it (listing every stored answer that relied on it)","readback":"the exception desk returns an exception_id, and reading that id back returns the message_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cited.no_jurisdiction","cited.not_in_library","cited.decision_for_person","cited.source_conflict","cited.change_pending","cited.acceptance_without_person","cited.release_refused","cited.release_without_person","cited.send_unconfirmed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["answer.message_id","answer.queue","answer.policy","answer.source_card_ids","answer.released_by","source_card.edition","source_card.jurisdiction","source_card.effective_from","change_delta.accepted_by","change_delta.accepted_on","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/agent-rules-desk","bot":"https://x.ai/bot/ZrtxdnaNg3ttz43z2bh05"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"CA Brokerage Compliance","original_author":"Joe Foxx","share_link":"https://x.ai/bot/OtCWbWeEWyNiFCV3qLxYU","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"cited-answer","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:12:03.949Z","run_id":"run-1793715123948","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"agreement-chase","name":"Agreement Chase","office_task":"Before a new commercial customer's first job, chase their signed service agreement and rate sheet, file each the day it comes back, and hand a no, a dispute or a silent customer to a named person.","verticals":["b2b-office"],"standards":["follow-up"],"systems_of_record":["the onboarding register, one open item per document owed on the new customer's first job (the job system such as ServiceM8 or Simpro, or a SharePoint list or Google Sheet kept beside it), which issues the job_id and the item id","the accounts mailbox (Outlook or Gmail) the signed agreement and rate sheet come back to, which issues the message_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the signed service agreement or signed rate sheet filed as evidence against its open item on the customer's first job, which marks the item arrived so the office can confirm the first job","readback":"reading the item back by its id returns status arrived with the arrival's evidence reference, which names the message_id of the email that carried the signed copy and the job_id it belongs to; no evidence reference back means it was not filed, and the item gets no touch until a person looks"},{"event":"exception.raised","write":"an escalation on the item naming the cadence's person: the customer said no, disputed the agreement or a rate, or asked us to stop, or the item reached its cap with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading that id back returns the item id, the job_id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.item_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/agreement-chase","bot":"https://x.ai/bot/TF6NTFFXkAsUaQSNt8xnb"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T12:15:01.376Z","run_id":"run-1793794501375","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"arrears-desk","name":"Arrears Desk","office_task":"Each day after the platform's own reminders, chase only tenants who are truly behind, quoting the paid-to date and exact balance, and hand the rest to a named person.","verticals":["property"],"standards":["rent-arrears"],"systems_of_record":["the property management system that issues the tenancy_id (PropertyMe, Console Cloud or similar): its tenancy ledger, rule store and message log"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"rent.overdue","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the day's arrears short list, written into the property system's task view: one row per tenancy_id with its paid-to date, days past it, exact balance, triage outcome, the dated rule applied and the next lawful date","readback":"the property system returns a report_id for the list, and reading that id back returns the same tenancy_ids with their paid-to dates; no id back means the list was not published and an exception is raised"},{"event":"exception.raised","write":"an exception on the tenancy naming the person who owns it: a failed or stale ledger read, a stop condition caught before a message, a drafted notice awaiting release, a fee held for a person, or a sequence that went unanswered","readback":"the exception desk returns an exception_id, and reading that id back returns the tenancy_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["rent.ledger_read_failed","rent.ledger_stale","rent.no_rule_for_state","rent.payment_received","rent.hardship_on_file","rent.arrangement_in_place","rent.paused_by_person","rent.on_formal_path","rent.notice_drafted_awaiting_release","rent.fee_held_for_person","rent.sequence_unanswered","rent.send_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.tenancy_id","seam.triage_outcome","seam.stop_check","seam.rule_version","seam.notice_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/arrears-desk","bot":"https://x.ai/bot/z0E70Q65K7N9H0DK4lpFv"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Rent Collections Desk","original_author":"Nymble Pay","share_link":"https://x.ai/bot/_cD7oH9VWZy8655M-wDfc","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rent-arrears","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:05:47.735Z","run_id":"run-1793711147734","green":5,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"arrival-brief","name":"Arrival Brief","office_task":"Each morning, send every tech a brief of their jobs that leads with the dog, key safe, hazards and access, quoting the job record each line came from, and saying what is missing.","verticals":["trades-building"],"standards":["job-brief"],"systems_of_record":["ServiceM8, Simpro, AroFlo or Fergus (the day's slots, the job, and the site's hazard, access, visit, note, parts, quote and asset records, read by the job's customer id)","the exception desk the business runs (a task list or a sheet)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one brief per tech per day on the channel that tech agreed to (email, SMS, Teams or Google Chat), and again only when one of their slots moves; every line cites the job system record and its date, and nothing is written to the job, slot, quote or note","readback":"the channel returns a message id as the report_id, which is stored on the delivery row for the tech and day with the slots key; no id back means no delivery is recorded and an exception is raised"},{"event":"exception.raised","write":"an exception naming the person who owns it: a tech with no agreed channel (nothing is sent), a slot whose job the job system does not return, or a brief that came back with no message id","readback":"the exception desk returns an exception_id, and reading that id back returns the tech_id or job_id, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["brief.no_agreed_channel","brief.job_not_found","brief.send_unconfirmed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.tech_id","seam.for_date","seam.slots_key","seam.report_id","seam.sent_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/arrival-brief","bot":"https://x.ai/bot/Ho_wvbMniBad-KncDcD0o"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"job-brief","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:24:07.791Z","run_id":"run-1793795047790","green":6,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"backflow-watch","name":"Backflow Watch","office_task":"Every morning, check our backflow device register against each state's rule, draft bookings for tests due soon, and put anything overdue or unclear in front of a named person.","verticals":["fire-electrical"],"standards":["compliance-calendar"],"systems_of_record":["the contractor's asset register of testable backflow prevention devices (its dated rule store per state, and the document store the signed test reports are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"the device's test obligation, classed Due Soon from the rule version in force for its state, with the test booking request drafted on it and held for a named person to release","readback":"reading the device back by its asset_id returns the derived due date, the rule version that produced it and the drafted booking awaiting release; no draft on the read means nothing was written and the run raises an exception"},{"event":"exception.raised","write":"an exception on the device naming the person who owns it: Critical Overdue, a last-test date nobody knows, no rule for the device's state, a test reported passed with no report attached, a site owner's dated refusal, a notice drafted and awaiting release, or a past due date its rule version can no longer explain","readback":"the exception desk returns an exception_id, and reading that id back returns the device's asset_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["backflow.critical_overdue","backflow.test_due_soon","backflow.anchor_unknown","backflow.no_rule_for_state","backflow.test_without_report","backflow.test_declined","backflow.notice_drafted_awaiting_release","backflow.release_refused","backflow.history_unexplained","backflow.report_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.rule_version","seam.anchor_status","seam.class","seam.evidence","seam.refused_at","seam.breached_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/backflow-watch","bot":"https://x.ai/bot/ED8j8tN_8248uYCmMquRb"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Triage backflow compliance notices with Google Sheets, Gmail, Slack, OpenAI, and a state API","original_author":"Swapnil Mandloi","share_link":"https://n8n.io/workflows/19760","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:14:32.716Z","run_id":"run-1793708072715","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"balance-proof","name":"Balance Proof","office_task":"Each month, tie every balance sheet account in Xero to the statement that supports it, by account id, and list every balance nobody can explain for a named person to clear.","verticals":["accounting-bookkeeping"],"standards":["two-records"],"systems_of_record":["Xero (the ledger that issues the account id and holds each balance sheet account's month-end balance)","the practice's support file for the month (bank, loan and hire purchase statements, the ATO integrated client account, payroll liabilities and super reports, the fixed asset register), each document tagged with the Xero account id it supports"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the month's balance sheet tie-out, written where the accountant opens it: the pair contract it ran under, the join key (the Xero account id), the master per field, and the counts tied, within tolerance, not tied, unexplained and corrected, published every month including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the account naming the person who owns it: a balance that does not tie, with the document's value, Xero's value and the master's value side by side; a Xero balance with no supporting document (a balance nobody can explain); a document naming an account Xero holds no balance on; a gap over the threshold amount; too many accounts not tied; or an accepted adjustment whose draft journal returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the account id, the reason, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two-records.contract_missing","two-records.difference_open","two-records.orphan_unsupported_balance","two-records.orphan_unmatched_document","two-records.over_threshold_amount","two-records.mismatch_rate_exceeded","two-records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.account_id","seam.period","seam.contract_id","seam.run_id","seam.difference_status","seam.value_document","seam.value_xero","seam.master_value","seam.accepted_by","seam.written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/balance-proof","bot":"https://x.ai/bot/Idncw8DvcxcYxp6uvhLeX"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:51:44.485Z","run_id":"run-1793793104484","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"bank-questions","name":"Bank Questions","office_task":"Each weekday, ask each client in plain words what their uncategorised bank transactions were, stop when they answer, and turn the answers into coding suggestions for the bookkeeper.","verticals":["accounting-bookkeeping"],"standards":["follow-up"],"systems_of_record":["the practice's register of what each client owes it, one open item per client per period on the client's bookkeeping job (a practice management system such as Xero Practice Manager or FYI, or a register kept beside it)","Xero, whose bank feed issues the id of each uncategorised bank line the questions are about (read only; nothing is coded or reconciled by this bot)","the practice's mail system, which issues the message_id of the client's reply carrying the answers"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the client's reply with their answers, filed as evidence against the open item on the client's bookkeeping job, with one coding suggestion per bank line beside it drafted from the practice's own rules for the bookkeeper to accept or change in Xero","readback":"reading the item back by its id returns status arrived with the evidence reference naming the message_id of the client's reply; no evidence reference back means it was not filed, and the item stays on the register untouched until a person looks"},{"event":"exception.raised","write":"an escalation on the item naming the cadence's bookkeeper: the client said no, disputed it or asked us to stop, or the item reached its cap with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading that id back returns the item id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.item_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/bank-questions","bot":"https://x.ai/bot/YEt7-byeqkRG4BgSHHbGm"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T11:48:04.164Z","run_id":"run-1793792884162","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"bill-check","name":"Bill Check","office_task":"Check every supplier bill that lands in the ledger against its purchase order before anyone books or pays it, and put each one in exactly one queue for a person.","verticals":["accounting-bookkeeping"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id and holds the purchase orders)","the document store where the written variation approvals live"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an exception record on the bill naming the person who owns it: the check that failed and the checks that never ran, the difference in dollars, the source document, and its queue (needs a decision, waiting on the supplier, or blocked: no purchase order, or scope with no written approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["bill.no_source_document","bill.no_purchase_order","bill.rate_mismatch","bill.quantity_over_complete","bill.unapproved_scope","bill.contract_sum_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.order_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/bill-check","bot":"https://x.ai/bot/u9v74KFqdieBXGHRLg89W"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:03:40.022Z","run_id":"run-1793703820021","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"billing-match","name":"Billing Match","office_task":"Every morning, check each customer's CRM billing details against Xero by account id, show each difference with both values and the owning system, and fix one only once a named person accepts it.","verticals":["b2b-office"],"standards":["two-records"],"systems_of_record":["the CRM (issues the customer account id; owns billing email, billing address and ABN)","Xero (the invoicing ledger; carries the CRM account id on the contact and owns the invoiced total, last invoice date and payment terms)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's reconciliation report where accounts open it: the field-ownership contract it ran under, the key it joined on (crm_account_id), the owner per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the customer account naming the person who owns it: an open difference with the CRM value, the Xero value and the owning system's value side by side awaiting acceptance, an orphan on one side, a gap over the threshold amount, a run over the mismatch rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the crm_account_id, the field, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["billing_match.contract_missing","billing_match.owner_missing","billing_match.difference_open","billing_match.orphan","billing_match.over_threshold","billing_match.mismatch_rate","billing_match.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.crm_account_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_crm","seam.value_xero","seam.owner_value","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/billing-match","bot":"https://x.ai/bot/EUX9Cka_qZuHPVVe5NgYt"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Reconcile CRM and invoicing owner fields with HTTPS APIs and Data Tables","original_author":"Kuliberda Labs","share_link":"https://n8n.io/workflows/19412","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:25:27.393Z","run_id":"run-1793712327391","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"branch-drift","name":"Branch Drift","office_task":"Every week, check each branch or franchise against our written operating standard, score its drift the same way for all, send each its own report, and put a slipping one in front of a named person.","verticals":["b2b-office"],"standards":["multi-site-conformance"],"systems_of_record":["the versioned key contract the business keeps (a SharePoint list or Google Sheet) that issues the contract version","Microsoft 365 or Google Workspace access groups, which decide which branch a record belongs to","each branch's own report location (a folder, channel or list) that issues the report_id","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one drift report per branch, published on schedule whether or not anything drifted, into that branch's own report location with the centre's copy at the same detail: each finding's kind (schema, gate bypass, shadow register, silence), the record it points to, the contract version it was scored against and the one score","readback":"the report location returns a report_id, and reading that id back returns the branch's segment_id, the period, the contract version and the findings list (empty on an all-clear); no id back means the report was not published and an exception is raised"},{"event":"exception.raised","write":"an exception naming one person: a branch past its threshold routed to its named owner, a branch owned only by a distribution list, a refused rename or second key that asks for a contract version bump, a record refused because a new branch's gates are not yet live, or a contract that could not be read as a versioned document","readback":"the exception desk returns an exception_id, and reading that id back returns the segment_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["multisite.threshold_crossed","multisite.no_named_owner","multisite.contract_change_requested","multisite.segment_not_ready","multisite.contract_unversioned"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.segment_id","seam.contract_version","seam.report_id","seam.drift_score","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/branch-drift","bot":"https://x.ai/bot/DBVMBlZ_rSb7Tw4hHrnZa"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"multi-site-conformance","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:06:03.302Z","run_id":"run-1793793963300","green":9,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"buy-desk","name":"Buy Desk","office_task":"Buy the materials for one job from stock first and the supplier's own prices, release only under the money rules, and check every delivery docket back.","verticals":["trades-building"],"standards":["material-order"],"systems_of_record":["the job system that issues the job_id and holds its material list and stock","the supplier portal or job-system purchasing that issues each order's external id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"order.sent","write":"one purchase order per job and supplier, released by the named rule under its threshold to an approved supplier (or by a named person), carrying the job_id, the catalogue edition and the release","readback":"the ordering system returns the order's external id, and reading the job's orders back by job_id returns that external id with the supplier, the lines and the release; no external id back is a failed write, raised to a person, and nothing is sent"},{"event":"delivery.recorded","write":"the delivery docket matched to its sent order line by line, with the quantity received and a reason (short, damaged, substituted) on any line that differs","readback":"reading the job's record back by job_id returns the delivery on the order's id with one line per ordered line; a docket naming no sent order is never recorded and is raised instead"},{"event":"exception.raised","write":"an exception on the job or the order naming the person who owns it: an order waiting for a named release (over the threshold, or to a supplier not on the approved list), a code no catalogue holds, an order write with no id back, a docket that matches no sent order, and every delivery variance (short, over, wrong item, changed price, unaccepted substitution)","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the order's external id where one exists, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["material.release_needed","material.not_in_catalogue","material.write_failed","material.no_order_for_docket","material.short","material.over","material.wrong_item","material.price_changed","material.substitution_unaccepted","material.changed_after_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.order_external_id","seam.supplier_id","seam.catalogue_edition","seam.released_by","seam.order_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/buy-desk","bot":"https://x.ai/bot/1W4EU_JwirerMm-cGcCaJ"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Home Remodel Job Desk","original_author":"Howie","share_link":"https://x.ai/bot/5hnU4GX1pgNj_VcmFcZQJ","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"material-order","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:00:00.717Z","run_id":"run-1793714400714","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"cash-ahead","name":"Cash Ahead","office_task":"Every Monday, publish our 13-week cash forecast from the open invoices, bills and payroll, with the assumption behind every line written down, and say so when a line cannot be read.","verticals":["b2b-office"],"standards":["recurring-report"],"systems_of_record":["the ledger (Xero or MYOB): open sales invoices, open bills and the operating bank balance","the payroll system (Xero Payroll, KeyPay or Employment Hero): the pay calendar and the last finalised pay run","the system the forecast is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"report.published","write":"one view of the week's 13-week cash forecast per audience (owner, lender): the opening bank balance and receipts, bill payments and payroll for each of the next thirteen weeks, each line carrying its definition id (which names its assumption), source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the week's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the line's owner or the threshold's person: a source that could not be read, a line with no definition (no named assumption) or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the week, the line, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/cash-ahead","bot":"https://x.ai/bot/GquElDLWh4YYKZ6TLQty8"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:50:45.453Z","run_id":"run-1793793045452","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"chase-book","name":"Chase Book","office_task":"Every morning, read who owes us from Xero, send one reminder per customer pitched to how late they are, log it on the invoice, and hand disputes and big accounts to a named person.","verticals":["accounting-bookkeeping"],"standards":["debtor-chasing"],"systems_of_record":["Xero (invoices, contacts and invoice history)","Gmail or Outlook (the reminder thread and the debtor's reply)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"poll"},{"event":"payment.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"A dated promise to pay on the invoice in Xero, taken from the debtor's reply: date (required), amount (may be empty), method if offered and the capture time, as a history note on each invoice it covers. It never overwrites a logged dispute, and the next reminder moves to the promised date.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID}/History returns the note with the promised date and capture time on the invoice_id it was written to. No note back means no promise was recorded: it raises debtor.promise_write_failed."},{"event":"exception.raised","write":"An exception on the invoice naming the person who owns it: a dispute, a relationship-sized balance lifted out of the run, a reply with no date, an override with no named approver, or a failed ledger read.","readback":"The exception desk returns an exception_id, and reading it back returns the invoice_id, the reason and the exception_owner. No id back means nothing was raised and the run stops."}],"exceptions":{"raises":["debtor.ledger_read_failed","debtor.dispute_open","debtor.relationship_account","debtor.no_date_given","debtor.promise_write_failed","debtor.override_refused","debtor.override_not_liftable"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.bucket","seam.last_reminder_at","seam.promise_date","seam.promise_captured_at","seam.status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/chase-book","bot":"https://x.ai/bot/2VpldrNd_E3Ho_zJi_Qd7"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Send tiered overdue invoice reminders with Xero, Gmail, Slack, and Google Sheets","original_author":"Intuz","share_link":"https://n8n.io/workflows/20015","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T12:31:54.240Z","run_id":"run-1793709114238","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:31:01.065Z","run_id":"run-1793709061063","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"chase-desk","name":"Chase Desk","office_task":"Every morning, rank who owes us by what is at risk, chase only those the rules allow, record each promise as a date, and hand disputes to a named person.","verticals":["accounting-bookkeeping"],"standards":["debtor-chasing"],"systems_of_record":["Xero (the ledger that issues the invoice_id, its contacts and its invoice history)","the job system named on the invoice (ServiceM8, Simpro), read by job_id only"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"webhook"},{"event":"payment.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"a dated promise to pay on the invoice in the ledger: the date (required), the amount (empty when none was said), the method if offered and when it was captured; the promised date becomes the invoice's follow-up date, and a logged dispute is never overwritten","readback":"the promise is read back from the ledger by invoice_id (Xero: GET /api.xro/2.0/Invoices/{InvoiceID} returns ExpectedPaymentDate, and GET .../Invoices/{InvoiceID}/History returns the promise note); no read-back means promise_write_failed is raised and no promise.recorded"},{"event":"exception.raised","write":"an exception on the invoice's record naming the person who owns it: a dispute named on a call or already logged, a relationship-sized balance, hardship stated, no date given, an override with no named approver, or a promise that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the invoice_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["debtor.dispute_open","debtor.relationship_account","debtor.hardship_stated","debtor.no_date_given","debtor.override_refused","debtor.promise_write_failed","debtor.job_unreadable"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.bucket","seam.promise_date","seam.promise_captured_at","seam.gate_reason","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/chase-desk","bot":"https://x.ai/bot/vqL9s8tvWD3dJDN1n52Hi"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Accounts Receivable","original_author":"Thomas Matteson","share_link":"https://x.ai/bot/OZn5dOvIhkqsG5CG-Ow2D","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T12:31:54.062Z","run_id":"run-1793709114060","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:31:01.894Z","run_id":"run-1793709061892","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"chase-list","name":"Chase List","office_task":"Each morning, rank who owes us money by what it is worth chasing, draft a friendly, firm or final reminder for each, and leave them for us to send.","verticals":["b2b-office"],"standards":["debtor-chasing"],"systems_of_record":["Xero","MYOB","the exception desk the business runs"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"A dated promise to pay, from a debtor's reply on a reminder thread that carries the invoice id: the date, the amount or none, and when it was captured, written onto the invoice in the ledger. The promised date becomes that customer's follow-up date. It never clears a logged dispute.","readback":"The invoice is read back by its id (Xero GET /api.xro/2.0/Invoices/{InvoiceID}/History, MYOB GET /accountright/{company_file_id}/Sale/Invoice/{UID}) and must show the promise with its date. No promise on the read-back is not a write: it raises debtor.promise_write_failed."},{"event":"exception.raised","write":"An exception naming exception_owner, the person the business set for receivables: a drafted reminder ready for that person to send (its tone, the invoice ids and the text), a relationship-sized balance or an open dispute lifted out of the run, hardship or a dispute named in a reply, a reply with no date, or a promise that did not write.","readback":"The exception desk returns an exception_id, and reading that id back returns the customer, the invoice ids, the reason and the exception_owner; no id back means nothing was raised and the run stops."}],"exceptions":{"raises":["debtor.reminder_ready_for_release","debtor.relationship_account","debtor.dispute_open","debtor.hardship","debtor.dispute_named","debtor.reply_without_date","debtor.reply_unmatched","debtor.promise_write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.chase_bucket","seam.chase_tone","seam.promise_date","seam.next_touch","seam.gate_hold_reason","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/chase-list","bot":"https://x.ai/bot/u5aNrJFF-HEvnif2BaO17"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Invoice Chaser","original_author":"Thuong P. Nguyen","share_link":"https://x.ai/bot/5ts0OJhTjZ7Ouse9xdMqr","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T12:32:13.973Z","run_id":"run-1793709133972","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:32:15.355Z","run_id":"run-1793709135354","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"claim-check","name":"Claim Check","office_task":"Check every subbie's claim, line by line, against the agreed contract rate before anyone pays it, keep the record, and put any mismatch in front of a named person.","verticals":["trades-building"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id and holds the subcontract or purchase order with its agreed rates)","the job system (Simpro, ServiceM8 or similar) for the quantity marked complete","the document store where the signed variation approvals live"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"a check note on the subcontractor's bill in the ledger: each of the four checks (rate, quantity, variation, contract sum) with what it compared, the subcontract it was read against and the tolerance in force with its date, and the bill placed in the done-and-reversible list for a named person to approve. Nothing is approved or paid","readback":"reading the bill by its bill_id from the ledger (Xero GET /api.xro/2.0/Invoices/{bill_id}/History, or the MYOB bill's journal memo) returns the check note with the four results and seam.queue = done_reversible; no note back means it was not written and the bill is raised as an exception instead"},{"event":"exception.raised","write":"an exception on the bill naming the person who owns it: the first check that failed and the checks that never ran, the difference in dollars, the cumulative position, the claim document, and its queue (needs a decision; waiting on the subbie for a missing claim document; or blocked: no subcontract named, or scope with no written approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["claim.no_source_document","claim.no_subcontract","claim.rate_mismatch","claim.quantity_over_complete","claim.unapproved_scope","claim.contract_sum_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.order_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/claim-check","bot":"https://x.ai/bot/G15C6rPvkuvk7qwHonhKi"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Check invoice contract price compliance with Google Sheets and Telegram alerts","original_author":"Abdullah Latif","share_link":"https://n8n.io/workflows/19445","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:27:05.817Z","run_id":"run-1793708825816","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"claim-clock","name":"Claim Clock","office_task":"When a subbie's payment claim comes in, work out when our payment schedule is due under that state's security of payment rule, remind the named person, and draft the schedule for them to serve.","verticals":["trades-building"],"standards":["compliance-calendar"],"systems_of_record":["the business's claims register (each subcontractor payment claim on its job, with the date it was served, the state the job is in, and the named person who owns it), the dated security of payment rule set per state, and the document store served payment schedules are filed in"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the served payment schedule attached to a Done reply, filed as evidence on the claim obligation the Done link names by obligation id, against the job; a reply with no obligation id is never matched on a subbie's name or phone number and is raised instead","readback":"the claim obligation is read back by its id and must return the same document reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and claim.evidence_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the claim naming the person who owns it, which the exception desk texts to them with the Done link: a schedule coming due with its derived date and rule version, a missed date, a Done with no schedule attached, a claim with no served date, no rule for the state the job is in, a past due date no retained rule version explains, a dated decision to serve no schedule, a drafted schedule awaiting a named release, a release with no named person, silence past the next chase date, or a reply with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the claim obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["claim.schedule_due","claim.schedule_overdue","claim.done_without_schedule","claim.evidence_not_read_back","claim.done_unmatched","claim.served_date_unknown","claim.no_rule_in_force","claim.history_unexplained","claim.no_schedule_decided","claim.schedule_drafted_awaiting_release","claim.release_refused","claim.chase_due"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/claim-clock","bot":"https://x.ai/bot/b4-zRupIAfDPSexOc3rlQ"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:41:37.845Z","run_id":"run-1793792497843","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"claim-match","name":"Claim Match","office_task":"Each morning, check every insurance repair job against the insurer's claim by claim number, show any missing or different scope, photo or report with both values, and fix only what a person accepts.","verticals":["trades-building"],"standards":["two-records"],"systems_of_record":["the job system (Simpro, ServiceM8 or similar: carries the insurer's claim number on the job; owns photos filed and reports lodged)","the insurer's claim record (the claim portal or its export: issues the claim number; owns the authorised scope, scope version, excess and claim status)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's claim reconciliation report where the insurance works coordinator opens it: the pair contract it ran under, the key it joined on (claim_number), the master per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the claim naming the person who owns it: an open difference with the job value, the insurer value and the master's value side by side awaiting acceptance, photos or a report on the job the insurer does not hold, a claim on one side only, a gap over the threshold amount, a run over the mismatch rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the claim_number, the field, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["claim_match.contract_missing","claim_match.master_missing","claim_match.difference_open","claim_match.orphan","claim_match.over_threshold","claim_match.mismatch_rate","claim_match.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.claim_number","seam.job_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_job","seam.value_insurer","seam.master_value","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/claim-match","bot":"https://x.ai/bot/rCitDRlYi59ntp5nZ37Zm"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:45:31.533Z","run_id":"run-1793796331531","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"client-review-watch","name":"Client Review Watch","office_task":"Work out when each client's AML/CTF review is next due from our program's dated rules, and list everyone due or overdue, with their last review, for our compliance officer.","verticals":["accounting-bookkeeping"],"standards":["compliance-calendar"],"systems_of_record":["the practice's client review register (its AML/CTF program's dated review rules by risk rating, each client's review obligation, and the document store signed review records are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"a signed client review record, attached to an email that names the review obligation id and the reviewer, filed as evidence of the completed review on that obligation; a 'reviewed' with no document or no named reviewer is never filed, and an email with no obligation id is never matched on a client name","readback":"the obligation is read back by its id and must return the same evidence reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and cdd_review.record_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the client's review obligation naming the compliance officer who owns it: a review coming due (with the rule version, due date and last review on file), an overdue review, a client with no review on file, no rule in force, a past date no retained rule version explains, a client who declined to update details, a change the client told us about, a drafted client information request awaiting a named release, a release with no named person, silence past the next chase date, or an email with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cdd_review.due","cdd_review.overdue","cdd_review.no_review_on_file","cdd_review.no_rule_in_force","cdd_review.history_unexplained","cdd_review.completed_without_record","cdd_review.reviewer_unnamed","cdd_review.record_not_read_back","cdd_review.client_declined","cdd_review.change_notified","cdd_review.request_drafted_awaiting_release","cdd_review.release_without_person","cdd_review.chase_due","cdd_review.email_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/client-review-watch","bot":"https://x.ai/bot/VrY7EEo8hDl7gkI_abgBb"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:54:39.568Z","run_id":"run-1793793279566","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"client-site-report","name":"Client Site Report","office_task":"Each month, publish each commercial client a report on their sites: jobs done, assets overdue, open defects and services due next, every line traced to its record, for their account manager to send.","verticals":["fire-electrical"],"standards":["recurring-report"],"systems_of_record":["the job system (such as Simpro) that holds each site's completed jobs and logged defects, issuing the job_id","the asset register that holds each site's fire and electrical assets with their AS 1851 or AS/NZS 3760 service dates, issuing the asset_id","the business's report store or client portal the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the month's report per audience: each client sees only its own sites, the service manager sees every site; each line carries its definition id, source and as-of time, and a correction is a new version superseding the old with the named person and the reason. Sending a client's view to the client stays with their account manager","readback":"reading the month's reports back from the report store returns each report_id with its version, audience, published_at and published_by; no id back means it was not published and an exception is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a line with no definition or two, a threshold that could not be compared, or an incomplete correction","readback":"the exception desk returns an exception_id, and reading that id back returns the month, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/client-site-report","bot":"https://x.ai/bot/0hNnd5kqu3w23WhYy3sRc"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:57:17.556Z","run_id":"run-1793797037554","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"close-check","name":"Close Check","office_task":"Each month, check whether a client's Xero file is ready to close and publish Ready or Not ready with the items to fix.","verticals":["accounting-bookkeeping"],"standards":["recurring-report"],"systems_of_record":["the ledger (Xero): bank statement lines, draft invoices and bills, the suspense account and tax rates for the month","the practice management system (such as Xero Practice Manager or Karbon): the client's month-end close job and its open steps","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"report.published","write":"one view of the month's close check per audience (practice, client owner): Ready to close or Not ready with the items to fix, each item carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the month's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, an item with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the month, the item, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/close-check","bot":"https://x.ai/bot/53l10SsN-eUBxMTuSpeNq"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Bookkeeping Ninja Month-End","original_author":"Tim Armstrong","share_link":"https://x.ai/bot/nhZHK5Xx-HqvK03fWw3iO","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:00:17.617Z","run_id":"run-1793714417615","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"comeback-list","name":"Comeback List","office_task":"Every weekday morning, pick the past customers from our job history who are due a check-up or have not used us in a year, say why each one, and draft a short text for me to send.","verticals":["trades-building"],"standards":["database-reactivation"],"systems_of_record":["the job system (ServiceM8, Simpro, Fergus, Tradify or AroFlo) that holds each customer, their completed jobs with the job_id, the last outcome and the do-not-contact flag","the place the owner opens each morning (job system tasks, a shared sheet or a morning email), which issues the report_id for each day's list"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the day's list for the owner: at most the cap they set, in rank order, each row with its play, the true reason that qualified it, the job_id of the customer's last completed job, a drafted text of at most 50 words naming the business with a way to opt out, and the last outcome. Drafts only: nothing is sent or dialled","readback":"the list store returns a report_id for the day's list, and reading that id back returns the same rows in the same order; no id back means no list was published and the run raises an exception"},{"event":"exception.raised","write":"a thing to sort out, on top of the list and naming the person who owns it: a customer missing name, mobile or site address, or a reply waiting that asks for a price, makes a complaint or asks something the play was not built for","readback":"the exception desk returns an exception_id, and reading that id back returns the customer, the typed reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["comeback.not_ready","comeback.price_question","comeback.complaint","comeback.reply_outside_play","comeback.list_not_published"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.job_id","seam.play","seam.trigger","seam.rank_reason","seam.last_outcome","seam.last_outcome_at","seam.sequence_started_at","seam.do_not_contact","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/comeback-list","bot":"https://x.ai/bot/dc62K7JKwjbjg-fH_Dwyo"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"database-reactivation","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:30:20.151Z","run_id":"run-1793795420148","green":8,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"comp-check","name":"Comp Check","office_task":"For each appraisal, check the price against comparable sales chosen by written rules, each sourced and dated, and hold the one-page evidence for the agent to approve.","verticals":["property"],"standards":["price-one-pager"],"systems_of_record":["the agency's listing system, which issues the listing_id for the appraisal and holds the subject property and the agent's appraisal","the recorded sales source the agency already licenses (for example a state valuer-general sales record)","the document store the approved one-pager and its record of what was shown are published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the exact one-pager version the agent approved, released to the vendor on the listing, with an append-only record of what was shown: the rules, every comparable with its source, sale date and read date, the range, the agent's estimate apart, who approved it, who it went to and the date","readback":"reading the listing's records back by listing_id and date returns each report_id with its version, released_on and approved_by, matching the approved version comparable for comparable; no id back means nothing was released and an exception is raised"},{"event":"exception.raised","write":"an exception on the listing naming the agent: a quoted figure below the evidence (held, with the sales above it), sales still stale after a re-read (held), too few comparables for a range, or a version the agent has not approved","readback":"the exception desk returns an exception_id, and reading that id back returns the listing_id, the version, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["price.underquote_held","price.sales_stale_held","price.too_few_comparables","price.awaiting_approval","price.release_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.listing_id","seam.version","seam.sales_read_on","seam.report_id","seam.approved_by","seam.released_on","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/comp-check","bot":"https://x.ai/bot/AREpVEWNfJqwtmxAXaLMi"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Listing Agent Desk LITE","original_author":"Balaci Claudiu","share_link":"https://x.ai/bot/8JiqD02tWEQRGcVqPsswi","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"price-one-pager","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T13:50:58.068Z","run_id":"run-1793713858066","green":9,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"comp-report","name":"Comp Report","office_task":"Every Monday, publish the multifamily comp report: availability, effective rents and the comp set, every figure linked to its source and read time.","verticals":["property"],"standards":["recurring-report"],"systems_of_record":["the property management system (rent roll and unit availability)","the comp survey the leasing team keeps","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the period's comp report per audience, each figure carrying its definition id, source and as-of time; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and an exception is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared, or an incomplete correction","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/comp-report","bot":"https://x.ai/bot/2klmOvDYaA_opn3EOIUfq"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Multifamily Comp Desk","original_author":"Matthew Dickson","share_link":"https://x.ai/bot/F_s7sno8HC2xZlii-ACzg","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:09:13.455Z","run_id":"run-1793704153454","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"company-review-watch","name":"Company Review Watch","office_task":"Keep each client company's ASIC annual review and officeholder change dates worked out from dated rules, draft the client reminder before late fees start, and file the proof.","verticals":["accounting-bookkeeping"],"standards":["compliance-calendar"],"systems_of_record":["the practice's obligation register (its client company calendar, dated rule set and the document store ASIC confirmations and fee receipts are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"an ASIC confirmation (a paid annual review fee receipt or a lodged officeholder change) attached to an email, filed as evidence of completion on the client obligation it names by obligation id; an email with no obligation id is never matched on a company name or ACN text and is raised instead","readback":"the obligation is read back by its id and must return the same evidence reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and review.evidence_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the client obligation naming the person who owns it: an unknown review or change date, no rule in force, a past date no retained rule version explains, a 'paid' or 'lodged' email with no document, a director's dated refusal, a breach, a drafted client reminder awaiting a named release, a release with no named person, silence past the next chase date, or an email with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["review.anchor_unknown","review.no_rule_in_force","review.history_unexplained","review.completion_without_evidence","review.evidence_not_read_back","review.refusal_recorded","review.breached","review.reminder_drafted_awaiting_release","review.release_refused","review.chase_due","review.email_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/company-review-watch","bot":"https://x.ai/bot/09i-xrApNP6F9Y-zZfnK3"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:56:10.105Z","run_id":"run-1793793370104","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"consultant-hours","name":"Consultant Hours","office_task":"Total each consultant's onsite, remote and unplaced hours from their PDF timesheets, put the odd ones in front of a named person, and send nothing to payroll until someone releases it.","verticals":["b2b-office"],"standards":["timesheet-check"],"systems_of_record":["the document store that issues the document_id for each PDF timesheet (SharePoint or Google Drive); entries are keyed <document_id>#<row>","the job system that issues the job_id and holds the allocations and the roster","the payroll system that takes one export per period and returns its id (Xero Payroll, Employment Hero or MYOB)","the workbook or report store the payroll officer opens, which returns a report_id","the exception desk the business runs, for the anomaly queue"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the period report appended to the hours workbook: hours by consultant and day with totals that list the entry ids they sum, onsite, remote and unknown hours per consultant (a row the sheet does not place stays unknown, never guessed), anomalies found and resolved, the award edition on each card, who released the period or that nobody has, and the payroll export id once one exists. Published every run, a clean period included","readback":"the report store returns a report_id, and reading that id back returns the period id, the totals with their entry ids and the release field; the payroll export is read back by period with readExport before any write, and a null external id is reported as a failed export, never a success"},{"event":"exception.raised","write":"an anomaly on the timesheet entry, from the closed list (over_hours, overlap, missing_break, not_rostered, not_allocated, rule_unclear), naming the person who owns it: the consultant's supervisor, whoever keeps the roster, the job's owner, or whoever answers for the award","readback":"the exception desk returns an exception_id, and reading the period's queue back returns that id with the entry id, the kind and the owner; one anomaly per entry and kind, so a retried wake raises none twice"}],"exceptions":{"raises":["over_hours","overlap","missing_break","not_rostered","not_allocated","rule_unclear"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["anomaly.kind","anomaly.owner","anomaly.resolution","card.rule_id","card.edition","period.released_by","period.export_external_id"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/consultant-hours","bot":"https://x.ai/bot/QKzqqDJ8wJbvqYBaI7wAC"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Extract consultant hours from PDF timesheets with Azure OpenAI and Excel","original_author":"Christoph Dibbern","share_link":"https://n8n.io/workflows/20465","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"timesheet-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:44:42.825Z","run_id":"run-1793713482823","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"contract-billing","name":"Contract Billing","office_task":"When a maintenance contract's billing period closes, draft the client's service invoice in Xero at our schedule of rates, park what it cannot price, and hold it for a named person.","verticals":["fire-electrical"],"standards":["invoice-out"],"systems_of_record":["the job system that holds each maintenance contract and closes one billing-period record per contract per cycle on its billing date (Simpro, ServiceM8 or the fire maintenance system the business runs), issuing the period's id (carried as job_id)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per closed billing period, referenced job:<period id> (and the stage when the period sits under a building contract), every line a scheduled service, attendance or consumable the period carries, every rate read from the schedule of rates at draft time, and the client's signed variation attached for any asset added mid-term. A second close event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<period id>, and that id is stamped on the period as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The invoice leaves only after a release naming the accounts officer, or naming the rule they wrote down and showing the total is under its threshold; the release and the send time are recorded against the period. The bot never approves or emails in Xero itself.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the period read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the billing period: the reason from the standard's list (not_in_pricebook, unsigned_variation, write_failed) or over_threshold, the period id, the invoice id, the codes left unpriced or unsigned, and exception_owner set to the person the business named for contract billing.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/contract-billing","bot":"https://x.ai/bot/WDH1YSpg2lS4jo_p5I2BV"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T11:42:38.926Z","run_id":"run-1793792558924","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:42:21.037Z","run_id":"run-1793792541036","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"cost-desk","name":"Cost Desk","office_task":"Put each supplier bill on its job by the order number printed on it, so the job's cost is current, and list every bill with no clear job for a named person.","verticals":["trades-building"],"standards":["document-filing"],"systems_of_record":["the job system that issues the job_id and the purchase order (order_id) each bill is filed on, e.g. Simpro, ServiceM8, AroFlo or Fergus","Xero, for supplier contacts and statements"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"evidence.filed","write":"the original bill, docket or paperwork attached unaltered to the one purchase order or job its printed number names, with the bill number and total typed into blank fields only, and the job_id carried","readback":"the job system returns the attachment id on the order or job; reading the order back by its id returns the attachment, its fingerprint and the entered fields; no id back means it was not filed and an exception is raised"},{"event":"report.published","write":"the daily close: arrived, filed, on the list and duplicates, with the open exceptions oldest first, published on quiet days too","readback":"the system the close is published into returns a report_id, and reading it back returns the day and counts that add up"},{"event":"exception.raised","write":"one exception on the filing list for a document that cannot be filed with confidence, with its closed-list reason, the field, both values where they disagree, and the named owner","readback":"the exception desk returns an exception_id, and reading it back returns the arrival, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["filing.no_id","filing.two_matches","filing.no_match","filing.unreadable_field","filing.does_not_add_up","filing.conflicts_with_record","filing.unknown_kind"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.arrival_id","seam.file_hash","seam.order_id","seam.job_id","seam.filing_state","seam.exception_owner","seam.cleared_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/cost-desk","bot":"https://x.ai/bot/5_420YSaDAk10d72U9NBc"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"document-filing","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T11:44:24.812Z","run_id":"run-1793792664811","green":10,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"cover-check","name":"Cover Check","office_task":"File each contractor insurance certificate against their record, check it is current and right for the work, track its expiry, and clear no one with an item missing until a person releases it.","verticals":["property"],"standards":["rejected-pack"],"systems_of_record":["the mail system that issues the message_id (the agency's Gmail or Outlook mailbox the certificates arrive in)","the property management system's contractor record (PropertyMe, Console Cloud or PropertyTree) that each certificate is bound to","the document store that holds the filed original (SharePoint, OneDrive or Google Drive)","the exception desk the agency runs, holding each stopped pack with its named owner"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the certificate of insurance from the message, filed against the contractor's record by its id, with the extracted policy details (insurer, policy number, cover amount, expiry, insured name and ABN) as graph fields carrying their confidence, the pack's queue after the eight checks in order, every written not-applicable with its rule, the renewal request date derived from the dated rule, and the as-of date","readback":"reading the contractor record by its id from the property system returns the filed document with the message_id and seam.queue, seam.failed_check, seam.as_of and seam.renewal_due; no document back with that message_id means it was not filed and the run raises an exception instead"},{"event":"exception.raised","write":"an exception on the contractor's pack naming the person who owns it: the first check that failed (identity, an expired certificate or licence, no rule loaded, a missing item, cover under the minimum, or two ABNs in one pack), Yellow fields waiting for a person to confirm, or a pack waiting for a named release before it can be handed over","readback":"the exception desk returns an exception_id, and reading that id back returns the contractor record id, the message_id, the failed check with its reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cover.identity_failed","cover.certificate_expired","cover.no_rule_for_state","cover.item_missing","cover.below_minimum","cover.two_abns","cover.yellow_fields","cover.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.message_id","seam.contractor_ref","seam.queue","seam.failed_check","seam.rule_version","seam.renewal_due","seam.as_of","seam.accepted_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/cover-check","bot":"https://x.ai/bot/WdJ1ThTCpbYjLdc2-iK90"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Track vendor insurance COIs and renewals with Gmail, DeepSeek, Sheets, Discord, and Telegram","original_author":"Khaisa Studio","share_link":"https://n8n.io/workflows/18553","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:21:59.954Z","run_id":"run-1793712119953","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"crew-board","name":"Crew Board","office_task":"Put each lawn or field-service job on the right licensed crew member at a time that fits, tell the customer and the tech once, and hand anything it cannot place to the dispatcher.","verticals":["trades-building"],"standards":["dispatch-board"],"systems_of_record":["the job system that issues the job_id and holds its schedule (ServiceM8, Simpro or Jobber)","the tech licence register the business keeps"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"one slot on the job's schedule in the job system (tech, start, end, resolved address, who or which rule set it, what displaced it), updated in place on a change and never written twice","readback":"the job system returns the slot's external id, and reading the job's slot back by job_id returns that external id and the job version it was made for; no id back is a failed write, escalated as write_failed, and nothing is sent"},{"event":"exception.raised","write":"an escalation on the job naming its owner: an address that will not resolve, no tech with a current licence for the job, a window nobody can meet, no capacity, no consent to message the customer, a failed slot write, or a displaced job that could not be re-slotted","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.customer_message_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/crew-board","bot":"https://x.ai/bot/QZOerogu4n8jLILVXRQMy"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Dispatcher","original_author":"Brett Brownlee","share_link":"https://x.ai/bot/XO8uABzMu5WMtRJKwVHp7","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:49:40.886Z","run_id":"run-1793710180884","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"danger-tag-desk","name":"Danger Tag Desk","office_task":"When a tech tags an appliance Danger Do Not Use, note it on the job, draft the written notice to the owner or managing agent that day, and hand it to a named person to send and follow up.","verticals":["fire-electrical","trades-building"],"standards":["exception-desk"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, AroFlo or Fergus), where the tag and the notice are recorded","the ledger that issues the invoice_id (Xero), for items raised against an invoice","the exception desk the business runs (a sheet with Raise and Routing tabs, a SharePoint list, or Office Voice's queue), which issues the exception_id","Gmail or Outlook drafts, where the written notice waits for the named person"],"consumes":[{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"One item per job and type on the exception desk: a danger tag lands as type other with the danger_tag label kept in its reason, the tag photo as evidence, the owner and the same-day clock from the routing table, and the notice on the job record plus a drafted written notice to the property owner or managing agent for that owner to send. Raises from other surfaces are typed from the closed list the same way.","readback":"the exception desk returns an exception_id, and reading it back returns the job_id (or invoice_id), the type, the reason, the due time and the exception_owner; the job note reads back by its note id on the job. No id back means nothing was raised: the raiser is told and the run stops"},{"event":"report.published","write":"the morning summary, once a day at the set time and also when nothing is open: open items by type and by owner, the overdue ones, the labels that arrived as other, and the jobs with a danger tag still open","readback":"the place the office reads it (an email, a Teams channel or a sheet tab) returns a report_id for that day, and a second run that morning reads it back and publishes nothing"}],"exceptions":{"raises":["danger_tag","parts_shortfall","price_not_in_book","write_failed","address_unresolved","promise_broken","dispute","hardship","other"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.exception_id","seam.exception_type","seam.exception_owner","seam.due_at","seam.raise_count","seam.stop_chase","seam.escalated_at","seam.notice_note_id","seam.notice_draft_id"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/danger-tag-desk","bot":"https://x.ai/bot/igmUDz9aWUfbiaQIuN7-3"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"exception-desk","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:15:08.576Z","run_id":"run-1793794508575","green":6,"red":0,"with_us":1,"evidence_required":0,"total":9}]},{"slug":"day-desk","name":"Day Desk","office_task":"Answers our phone during the day, looks the caller up, tells an existing customer when we're coming off their job, and writes new work as one job.","verticals":["trades-building"],"standards":["client-desk"],"systems_of_record":["ServiceM8","Simpro"],"consumes":[{"event":"call.received","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"job.completed","wake":"webhook"}],"emits":[{"event":"job.created","write":"one job per new caller with no open job: the caller's own words and a type from the fixed list (emergency, routine, quote, unclassified)","readback":"the job system returns the job id (ServiceM8 job uuid, Simpro job ID) and the job is read back by that id before the caller is told they are booked; no id back means no booking, no job.created, and a callback task to the person on duty"},{"event":"job.updated","write":"a note on the job for every call (what the caller said and what they were told, by call id), and a drafted running-late, on-the-way or job-complete update waiting for a named person to release it; a released update is sent to the job's contact and noted on the job by the event that caused it","readback":"the note and the draft are read back on the job by its job id; a send counts only once the job shows the update_sent note with the change it was for"},{"event":"exception.raised","write":"a callback task owned by the person the roster names: a transfer nobody picked up, a job with no arrival time, a job write that came back with no id, or a caller on a job with an open exception","readback":"the task desk returns an exception_id, and reading it back returns the job_id (or the caller's number when no job was written), the owner and the due-by time; no id back means the caller is not told a callback is coming"}],"exceptions":{"raises":["transfer_unanswered","no_arrival_time_on_job","status_question_no_open_job","job_write_failed","job_readback_failed","caller_on_job_with_open_exception"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.call_id","seam.update_change_key","seam.update_released_by","seam.callback_owner","seam.exception_owner"]},"runtime":["office-voice-front-desk","node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/day-desk","bot":"https://x.ai/bot/O59EvAhQgNvLvcSE9wX7o"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"client-desk","edition":"2026-10-26","environment":"stub","ran_at":"2026-11-04T12:35:58.787Z","run_id":"run-1793795758785","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"deadline-desk","name":"Deadline Desk","office_task":"Keep every deadline from our clients' letters and lodgements on a calendar derived from dated rules, chase replies, and put anything late or unclear in front of a named person.","verticals":["accounting-bookkeeping"],"standards":["compliance-calendar"],"systems_of_record":["the practice's obligation register (its compliance calendar and the document store the forwarded letters and replies are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an exception on the obligation naming the person who owns it: an unknown anchor date, no rule in force, a reply claiming completion with no document, a client's dated refusal, a breach, a notice drafted and awaiting a named release, a past date its rule version can no longer explain, or a forwarded letter that carries no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["deadline.anchor_unknown","deadline.no_rule_for_obligation","deadline.history_unexplained","deadline.completion_without_evidence","deadline.refusal_recorded","deadline.breached","deadline.notice_drafted_awaiting_release","deadline.release_refused","deadline.letter_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/deadline-desk","bot":"https://x.ai/bot/yjqAI1LEAxUViH71CFWeL"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Paperwork Desk","original_author":"Daniel Masarsky","share_link":"https://x.ai/bot/Gv02Uedgl530XCpAqbUoU","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:03:57.095Z","run_id":"run-1793703837093","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"deal-match","name":"Deal Match","office_task":"Every morning, check each CRM deal against its Simpro quote by quote id, show each difference in value, stage, customer or contact with both values, and change one only once a person accepts it.","verticals":["b2b-office","trades-building"],"standards":["two-records"],"systems_of_record":["the CRM (holds each sales deal, carries the Simpro quote id, and owns the contact name and contact email)","Simpro (issues the quote id and owns the quote value ex GST, the quote stage and the Simpro customer id the quote is raised against)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the morning deal-to-quote report where sales administration opens it: the pair contract it ran under, the key it joined on (simpro_quote_id), the owner per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the quote naming the person who owns it: an open difference with the CRM value, the Simpro value and the owning system's value side by side awaiting acceptance, a deal or quote with no partner, a value gap over the threshold, a run over the mismatch rate, or an accepted change whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the simpro quote_id, the field, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["deal_match.contract_missing","deal_match.owner_missing","deal_match.difference_open","deal_match.orphan","deal_match.over_threshold","deal_match.mismatch_rate","deal_match.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.quote_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_crm","seam.value_simpro","seam.owner_value","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/deal-match","bot":"https://x.ai/bot/wOUxNeG6ZQ7UPkQNZq0D3"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:50:41.634Z","run_id":"run-1793796641633","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"defect-desk","name":"Defect Desk","office_task":"When a sprinkler inspection report lands in the inbox, file each deficiency against its tagged asset, send critical ones to a named person now, and queue the rest.","verticals":["fire-electrical"],"standards":["fire-service-pack-standard"],"systems_of_record":["the asset register that issues the asset_id (where the tags are already recorded)","Gmail or Outlook (the watched inbox that issues the message_id)","the exception desk the business runs (a sheet, a task list or a ticket queue)"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"Each deficiency line from the report email, filed as a service record on the one asset its tag resolves to, naming the obligation the visit discharges, the result and severity the technician recorded, the coded defect with its owner, and the email's attachments by message_id. A line with no tag photograph is filed into the unbound queue, never the pass count.","readback":"The asset register returns a service record id; reading that id back returns the asset_id, the obligation_id, the message_id and the queue (pass, defect or unbound). No id back is not a write: the line is raised as record.held and the run stops."},{"event":"exception.raised","write":"An exception on the asset naming the person who owns it: a critical defect or an isolation for the Fire Safety Advisor at once, or a line that could not be bound or recorded (unresolved tag, no obligation named, wrong evidence for the class, uncoded defect, electrical close with no certificate, lapsed isolation) for the Service Coordinator.","readback":"The exception desk returns an exception_id; reading it back returns the asset_id, the reason and the exception_owner. No id back means nothing was raised and the run stops."}],"exceptions":{"raises":["identity.unresolved","record.no_obligation","record.no_result","record.held","record.unbound","defect.no_severity","defect.critical","isolation.no_revisit_date","isolation.recorded","isolation.lapsed","close.refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.obligation_id","seam.message_id","seam.service_record_id","seam.queue","seam.defect_code","seam.severity","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/defect-desk","bot":"https://x.ai/bot/b5gwXQ0sdTI7s-lW74aZl"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Route fire sprinkler deficiencies with Gmail, OpenAI, Telegram and Sheets","original_author":"Swapnil Mandloi","share_link":"https://n8n.io/workflows/19181","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"fire-service-pack-standard","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:15:36.268Z","run_id":"run-1793708136266","green":11,"red":0,"with_us":1,"evidence_required":0,"total":12}]},{"slug":"defect-quote","name":"Defect Quote","office_task":"When a tech logs fire or life-safety defects on a site's inspection or fault job, draft one rectification quote on it from our own price list, or park it, and leave it for us to send.","verticals":["fire-electrical"],"standards":["quote-out"],"systems_of_record":["Simpro","ServiceM8","Xero (Items as the rectification price list, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"One draft rectification quote on the inspection or fault job the defects were logged on, one line per open defect, each line carrying the catalogue id and rate read from the price list at draft time (ex GST), the defect id and the asset id it rectifies. It is left in draft for the person who owns defect quotes to send to the site's owner or managing agent; this node has no way to send it.","readback":"The quote is read back by the id the system returned (Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked rectification quote as an exception on the job: the park reason from the standard's fixed list, the defects that did price with their catalogue ids, the defects that did not with their defect and asset ids, no total, and exception_owner set to the person the business named for defect quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/defect-quote","bot":"https://x.ai/bot/GDpDod-6VFqqKv3s1JtIM"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:34:45.829Z","run_id":"run-1793795685826","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:35:29.076Z","run_id":"run-1793795729074","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"delivery-billing","name":"Delivery Billing","office_task":"When a delivery job is marked done, put its draft invoice in Xero at our own item prices, park what it cannot price, and send only once our rule or accounts person releases it.","verticals":["trades-building"],"standards":["invoice-out"],"systems_of_record":["the job or dispatch system that issues the job_id (ServiceM8, Simpro, or a job sheet)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per completed delivery job, reference job:<id> (and the stage under a building contract), every line a job line at the Xero Items rate read at draft time, with the book edition, the accepted quote id where there is one, and any signed variation acceptance attached.","readback":"The invoice is read back from the ledger by the job id and must return the same invoice id and external id (Xero GET /api.xro/2.0/Invoices/{InvoiceID}). No id back is not a write: it raises invoice.write_failed to the named owner and the run stops."},{"event":"invoice.sent","write":"The release on the invoice record, naming the owner who closed the awaiting-release exception or the rule (with its threshold) that owner set, then the send from Xero. Nothing parked is ever released or sent.","readback":"The invoice read back by job id shows status sent, the sent time, and released_by or released_by_rule, with the release before the send."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the job: the reason (not_in_pricebook, unsigned_variation, no_stage, write_failed) or awaiting_release, the job id, the invoice id, the codes with no rate, and exception_owner set to the person the business named for invoices.","readback":"The invoice read back by job id shows status parked with its park reason, and the exception desk returns the exception against the job id with its exception_owner; the next run reads it there and stops."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.no_stage","invoice.write_failed","invoice.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/delivery-billing","bot":"https://x.ai/bot/YMDDyyzvqtPL2xq3hyzep"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Create a QuickBooks invoice on a new Onfleet Task creation","original_author":"James Li","share_link":"https://n8n.io/workflows/1546","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T13:16:02.977Z","run_id":"run-1793711762976","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:16:03.363Z","run_id":"run-1793711763361","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"deposit-match","name":"Deposit Match","office_task":"Every morning, match each customer deposit in the bank feed to the Xero invoice it paid, by the invoice id, and put every one that does not clearly match in front of the bookkeeper.","verticals":["accounting-bookkeeping"],"standards":["two-records"],"systems_of_record":["Xero (the ledger that issues the invoice_id and records the payment applied to each sales invoice)","the business's bank feed into Xero (customer deposits carrying the invoice_id in their reference)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"payment.received","write":"a deposit applied as a payment on the Xero sales invoice its reference names, written once and only after the bookkeeper accepted that correction, with the bank-feed value, the Xero value before the fix and the person who accepted kept in history","readback":"Xero returns a PaymentID, and GET /api.xro/2.0/Payments/{PaymentID} returns the payment with the Invoice.InvoiceID, amount and date; no PaymentID back means it was not written and the owner is told"},{"event":"report.published","write":"the run's reconciliation report where the bookkeeper opens it: the pair contract it ran under, the join key (invoice_id), the master per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the invoice naming the person who owns it: an open difference with the bank-feed value, the Xero value and the master's value side by side, an orphan (a deposit whose invoice id is not in Xero, or an invoice Xero shows paid with no deposit), a difference over the threshold amount, a mismatch rate over the declared rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the invoice_id, the reason, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two-records.contract_missing","two-records.difference_open","two-records.orphan_deposit","two-records.orphan_paid_invoice","two-records.over_threshold_amount","two-records.mismatch_rate_exceeded","two-records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.invoice_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_bank_feed","seam.value_xero","seam.master_value","seam.accepted_by","seam.written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/deposit-match","bot":"https://x.ai/bot/-ocv1J_OZZbrQAWmN83wj"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"InvoiceMatch Recon Bot","original_author":"Robert Schiff","share_link":"https://x.ai/bot/mK8oApOw3a0zG0m00Ec_h","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:26:19.036Z","run_id":"run-1793712379034","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"design-quote","name":"Design Quote","office_task":"When a customer accepts their solar or heat-pump design and it is on the job, draft the job's quote lines from our own price book, or park it with a reason, and leave it for us to send.","verticals":["fire-electrical"],"standards":["quote-out"],"systems_of_record":["Simpro","ServiceM8","Xero (Items as the price book, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the job the accepted design is attached to, ex GST, carrying the design's id. One line per equipment or install item on the accepted design: the catalogue id from the business's own price book, the whole-number count from the design, and that item's sell-rate as read at draft time. The amount is count times rate and nothing else; the design tool's own prices are never used, and no STC or rebate deduction is applied. It is left in draft, editable, for the person who owns quotes; this node has no way to send it.","readback":"The quote is read back by the id the system returned (Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote, or a job sent back for its design, as an exception on the job: the park reason from the standard's fixed list (or design_quantity_not_whole), the design id, the lines that did price with their catalogue ids, the items that did not, no total, and exception_owner set to the person the business named for quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.design_quantity_not_whole","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/design-quote","bot":"https://x.ai/bot/YVM7EW0kzQrzX2riYLw6a"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:53:25.980Z","run_id":"run-1793796805978","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:52:53.665Z","run_id":"run-1793796773663","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"docket-billing","name":"Docket Billing","office_task":"When a job is marked complete, turn its signed site dockets of hours, plant and materials into one draft Xero invoice at our rates, park what it can't bill, and hold it for a named person.","verticals":["trades-building"],"standards":["invoice-out"],"systems_of_record":["the job system that issues the job_id and holds the site dockets filed against it as job lines (ServiceM8, Simpro, or a job sheet)","Xero, which issues the invoice_id and holds the schedule of rates as Items"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per completed job, referenced job:<id> (and the stage under a building contract), every line a line off a site docket filed on the job with its docket number in the notes, every rate read from the schedule of rates at draft time, and each signed daywork docket attached as evidence. A second completion event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<id>, and that id is stamped on the job as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The invoice leaves only after a release naming the accounts person, or naming the rule they set and showing the total is under its threshold; the release and the send time are recorded against the job.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the job read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the job: the reason from the standard's fixed list (not_in_pricebook, unsigned_variation, write_failed) or over_threshold, the job id, the invoice id, the docket numbers and codes left unpriced, and exception_owner set to the person the business named for billing.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/docket-billing","bot":"https://x.ai/bot/0tnUkHb6UYxBKymeS-rS-"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T11:41:09.796Z","run_id":"run-1793792469793","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:41:09.168Z","run_id":"run-1793792469167","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"docs-due","name":"Docs Due","office_task":"Each weekday, chase clients for the documents the practice still needs from them, stop when each one arrives, and hand a no or a silent client to a named person.","verticals":["accounting-bookkeeping"],"standards":["follow-up"],"systems_of_record":["the practice's client document checklist, one open item per document owed on the client job (a practice management system such as Xero Practice Manager or FYI, or a register kept beside it)","the practice's document store, where a returned document is filed against the client job"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the returned document (a signed engagement letter, a tax return authority, a fund or bank certificate) filed as evidence against its open item on the client job, which marks the item arrived and lets the job move","readback":"reading the item back by its id returns status arrived with the arrival's evidence reference, which names the message_id of the client email that carried it (or the document_id where it landed in a watched folder); no evidence reference back means it was not filed, and the item stays on the chase with no touch until a person looks"},{"event":"exception.raised","write":"an escalation on the item naming the cadence's person: the client said no, disputed it or asked us to stop, or the item reached its cap with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading that id back returns the item id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.item_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/docs-due","bot":"https://x.ai/bot/iRqvney3UXOT694saTF-M"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T12:59:55.658Z","run_id":"run-1793710795657","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"draw-match","name":"Draw Match","office_task":"Each morning, match every payment the managing agent sent against what landed in the landlord's books, by payment id, and put each short-pay, wrong fee or missing payment to the bookkeeper.","verticals":["property"],"standards":["two-records"],"systems_of_record":["the managing agency's trust accounting system (PropertyMe, Console Cloud or similar), which issues the payment_id for each owner disbursement and its owner statement","the landlord's own ledger and bank feed (Xero or similar), where each agency deposit lands carrying that payment_id in the EFT reference"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's reconciliation report, written where the landlord's bookkeeper opens it: the pair contract it ran under, the join key (payment_id), the master per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the payment naming the person who owns it: an open difference with the books' value, the agency statement's value and the master's value side by side, an orphan (a deposit whose payment id is on no statement, or a statement line with no deposit), a difference over the threshold amount, a mismatch rate over the declared rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the payment_id, the reason, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two-records.contract_missing","two-records.difference_open","two-records.orphan_deposit","two-records.orphan_statement_line","two-records.over_threshold_amount","two-records.mismatch_rate_exceeded","two-records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.payment_id","seam.tenancy_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_books","seam.value_statement","seam.master_value","seam.accepted_by","seam.written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/draw-match","bot":"https://x.ai/bot/Sz3U4p7V-dPriKGwZWe5T"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Doorfolio","original_author":"Cameron Powell","share_link":"https://x.ai/bot/v_18B-B-J3sFAGkZ9aNDD","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:28:42.957Z","run_id":"run-1793712522956","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"drawing-register","name":"Drawing Register","office_task":"Keep every machine drawing on our drive on one register with an owner and its current revision, find the page an electrician needs, and tell the owner when a drawing changes.","verticals":["fire-electrical"],"standards":["knowledge-base"],"systems_of_record":["the shared drive that holds the drawings and issues the document_id (Google Drive or SharePoint), left where it is","the drawing register on that tenant (one Sheet or SharePoint list: a row per source, owner a person, kind, revision and checksum)","the task list the business runs (Google Tasks, Planner or a sheet), which issues the exception_id for each gap"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"a task on the business's task list naming the person who owns it, with a due date: a drawing revision the register expects and the drive does not hold, a file whose only owner is a team, two copies of one drawing waiting for a person to pick the canonical one, customer material waiting for someone to set who may read it and for how long, an instrument with no revision on its title block, or a registered file gone from the drive","readback":"the task list returns an exception_id, and reading that id back returns what is expected, the owner and the due date; no id back means nothing was raised, and the file stays off the index"}],"exceptions":{"raises":["kb.expected_edition_missing","kb.owner_not_a_person","kb.canonical_copy_undecided","kb.customer_access_undecided","kb.instrument_without_edition","kb.source_gone_from_drive"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["register.id","register.kind","register.owner","register.location","register.edition","register.checksum","register.retrieved_at","register.status","register.duplicate_of","register.access_list","register.expires_on","register.superseded_checksums"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/drawing-register","bot":"https://x.ai/bot/YsT-ko132YsP1fg-dBtQX"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Sparky","original_author":"Zack Edwards","share_link":"https://x.ai/bot/mpJi3Xiu2w4FAN7y5P5jd","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-base","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:17:22.994Z","run_id":"run-1793708242991","green":11,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"dropped-ball","name":"Follow-Up Sweep","office_task":"Every evening, find what customers and suppliers still owe us that nobody chased, send the next capped follow-up on a consented channel, and hand any no or dead end to a named person.","verticals":["b2b-office"],"standards":["follow-up"],"systems_of_record":["the register of open items on the business's own records (the job system's quotes and variations, or a sheet kept beside it), with its contact consents and written cadence"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an escalation on the open item naming the person who now owns it, for a no, a dispute, a stop-contacting-me, or the cadence cap reached with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading that id back returns the item id, the reason, the exception_owner and the touch history; no id back means nothing was raised and the item is not touched again that run"}],"exceptions":{"raises":["follow_up.declined","follow_up.disputed","follow_up.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["item.status","item.touches","item.outcome","item.arrival_evidence_ref","item.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/dropped-ball","bot":"https://x.ai/bot/GAeSZiQZqi09lIILsPIaz"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T11:04:06.468Z","run_id":"run-1793703846466","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"estimate-desk","name":"Estimate Desk","office_task":"When a price request from our website form is logged as a job, draft the estimate from our own price list, or park it with a reason, and tell me it is ready for me to send.","verticals":["b2b-office"],"standards":["quote-out"],"systems_of_record":["Xero (Items as the price list, Quotes)","ServiceM8","Simpro (parts only)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the job the form request was logged as, one line per unit of each service asked for, every line carrying its catalogue id and its rate as read from the price list at draft time, ex GST. The owner is alerted that it is ready; this node has no way to send it to the customer.","readback":"The quote is read back by the id the system returned (Xero GET /api.xro/2.0/Quotes/{QuoteID}, ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked estimate as an exception on the job: the park reason from the standard's fixed list, the services that did price with their catalogue ids, the ones that did not, no total, and exception_owner set to the person the business named for estimates.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/estimate-desk","bot":"https://x.ai/bot/9cul_ovLeKD-M8qEYm1sC"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Send instant price quotes from forms with Data Tables, Telegram and Gmail","original_author":"Tomasz Kaczyński","share_link":"https://n8n.io/workflows/21305","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:56:36.960Z","run_id":"run-1793714196959","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:58:20.185Z","run_id":"run-1793714300184","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"expense-check","name":"Expense Check","office_task":"Check each staff expense claim has its receipt, a proper tax invoice where the ATO needs one, and fits our expense policy, then queue it for the approver to approve or reject.","verticals":["b2b-office"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id for the claim, entered as a draft bill payable to the staff member, and holds the expense policy lines)","the document store where receipts and written pre-approvals are filed"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"the claim's draft bill marked as passing all four checks and queued for the approver, with each check record (policy cap, units supported, out-of-policy pre-approval, monthly allowance), the tolerances in force and the receipt; the bill stays a draft and nothing is reimbursed","readback":"reading the bill_id back from the ledger returns the bill still in draft with the seam fields seam.queue = done_reversible and seam.tolerance_version; a bill that does not read back as a draft means nothing was queued and the run raises an exception"},{"event":"exception.raised","write":"an exception record on the claim naming the person who owns it: the check that failed and the checks that never ran, the difference in dollars, the receipt, and its queue (needs a decision, waiting on the staff member for a receipt or tax invoice with a drafted request, or blocked: no policy line, or an out-of-policy item with no written pre-approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the receipt and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["expense.no_receipt","expense.not_a_tax_invoice","expense.no_policy_line","expense.over_policy_cap","expense.units_not_supported","expense.out_of_policy_no_preapproval","expense.over_monthly_allowance"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.policy_line","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/expense-check","bot":"https://x.ai/bot/aT5xYMgoP_pGvyk89bjJF"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:50:10.677Z","run_id":"run-1793793010675","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"fact-library","name":"Fact Library","office_task":"Keep one read-only company knowledge graph that every bot in the fleet asks, where nothing goes live until a named person accepts it and a replaced document takes its answers with it.","verticals":["b2b-office"],"standards":["knowledge-graph"],"systems_of_record":["the document store that issues the document_id for each source in the watched library folder (Drive, SharePoint)","the business's own graph store and library register, which hold sources with edition and checksum, nodes, edges, change deltas and the answers given (lists, Postgres or a graph database on the business's account)","the system of record that issues entity ids (the Xero contact, the CRM id, the ABN)","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the change delta for a source whose checksum moved, written into the library register the knowledge owner opens: the source's document_id, the old and new checksum, and the computed list of every node built from it, each moved to change_pending","readback":"the library register returns a report_id, and reading that id back returns the document_id, both checksums and the affected node ids; no id back means the delta was not written, kg.change_pending is raised to the named owner and no affected node answers"},{"event":"exception.raised","write":"an exception on the source or node naming the person who owns it: a source that is not an instrument, customer material offered as a source, an acceptance with no name or no locator, a type the key contract does not name, an entity with no system-of-record id and no accepted SAME_AS, two live nodes in conflict, a change pending acceptance, or a question no live node covers","readback":"the exception desk returns an exception_id, and reading that id back returns the document_id or node id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["kg.source_not_an_instrument","kg.customer_material_not_a_source","kg.acceptance_refused","kg.type_not_in_contract","kg.no_registered_source","kg.identity_unconfirmed","kg.conflict_needs_person","kg.promotion_refused","kg.change_pending","kg.not_covered"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.document_id","seam.contract_version","seam.source_checksum","seam.node_queue","seam.accepted_by","seam.delta_id","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/fact-library","bot":"https://x.ai/bot/85kvXFEwZTBu4fcjljL20"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Ops Knowledge Observer","original_author":"Stephen Ruhe","share_link":"https://x.ai/bot/CIgxhKdiPj7KflehWkaEr","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-graph","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:52:43.272Z","run_id":"run-1793713963270","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"fault-desk","name":"Fault Desk","office_task":"Before we send a tech, check each fault call, text or alarm against our written fault list, give only our own reset steps, and book one job with what was tried.","verticals":["trades-building"],"standards":["fault-triage"],"systems_of_record":["the job system that issues the job_id (ServiceM8 or Simpro, written over its API; on Tradify a person writes the job from the triage log)","the fault list the business writes, one sheet or SharePoint list with an edition per upload, read before every triage and never written by the bot","the asset register that issues the asset_id and names each customer's model","the office's message system (Gmail or Outlook), whose drafts folder holds every written reply for a named person to send","the task list the office runs (Google Tasks, Planner or a sheet), which issues the exception_id for each parked alarm or failed job write"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"call.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.created","write":"one job in the job system for a fault that cannot be fixed from a written procedure, or whose procedure the customer said did not work: emergency, routine or unclassified, carrying the fault matched, the outcome, the fault list edition, the steps tried and what the customer said, so the tech knows before they leave","readback":"the job system returns the job_id, and reading that id back returns the job with its triage block; no id back means nothing was written, and a named person is raised (and for an emergency, handed the call at once)"},{"event":"job.updated","write":"the triage added to the customer's job that is already open, marked as a duplicate of it, instead of a second job","readback":"reading the open job_id back returns the new triage note on it; no id back means nothing was written and a named person is raised"},{"event":"exception.raised","write":"a task naming the service coordinator: a monitoring alarm the fault list leaves to a person or cannot place, or a job write that returned no id","readback":"the task list returns an exception_id, and reading that id back returns the intake, the asset, the list edition and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["fault.alert_left_to_person","fault.alert_unplaced","fault.job_write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["triage.outcome","triage.matched_fault_id","triage.edition","triage.steps_tried","triage.customer_said","triage.duplicate_of","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/fault-desk","bot":"https://x.ai/bot/9K7-YHpnkOVOMHJqVKjMR"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"fault-triage","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T13:03:45.839Z","run_id":"run-1793797425838","green":5,"red":0,"with_us":1,"evidence_required":0,"total":10}]},{"slug":"feed-match","name":"Feed Match","office_task":"Every morning, match each bank-feed payment to the bill in Xero it paid, by the bill id, and put every one that does not clearly match in front of the bookkeeper.","verticals":["accounting-bookkeeping"],"standards":["two-records"],"systems_of_record":["Xero (the ledger that issues the bill_id and records each bill's payment)","the business's bank feed into Xero (statement lines carrying the bill_id in the payment reference)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's reconciliation report, written where the bookkeeper opens it: the pair contract it ran under, the join key (bill_id), the master per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the bill naming the person who owns it: an open difference with the bank-feed value, the Xero value and the master's value side by side, an orphan (a bank line whose bill id is not in Xero, or a paid bill with no bank line), a difference over the threshold amount, a mismatch rate over the declared rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the reason, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two-records.contract_missing","two-records.difference_open","two-records.orphan_bank_line","two-records.orphan_paid_bill","two-records.over_threshold_amount","two-records.mismatch_rate_exceeded","two-records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.bill_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_bank_feed","seam.value_xero","seam.master_value","seam.accepted_by","seam.written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/feed-match","bot":"https://x.ai/bot/4w73-zaaSvw6nOHTlwBBK"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Bookkeeping Ninja Bank Rec","original_author":"Tim Armstrong","share_link":"https://x.ai/bot/ISrPfEtK0OFbjbokNK9Xw","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:37:52.704Z","run_id":"run-1793709472702","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"fire-code-desk","name":"Fire Code Desk","office_task":"Answer our engineers' fire and electrical code questions from the Standards we hold, citing the clause and the edition the state adopted, or hand them to a named person.","verticals":["fire-electrical"],"standards":["cited-answer"],"systems_of_record":["the mail system that issues the message_id the question arrived on (Gmail, Outlook)","the office's own clause library of the NCC, the Australian Standards it calls up (AS 1851, AS 1670.1, AS 2118.1, AS 2419.1, AS/NZS 3000) and each state's adoption records, with its answer register","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"answer.sent","write":"a stored answer with its source cards (the clause, and the state adoption record that calls up its edition), sent as a reply on the question's thread only after a named person released it on the answer register","readback":"the mail system returns the reply's message_id, and reading that id back returns the thread it replies in and the answer register id; no id back means it was not sent, and cited.send_unconfirmed is raised to the named owner"},{"event":"exception.raised","write":"an exception on the question's message naming the person who owns it: no state given, nothing in the library covers it, no adoption record says which edition applies in that state, a compliance or certificate question for the licensed practitioner, a source conflict between two live instruments, or an instrument that moved and waits for a named person to accept it (listing every stored answer that relied on it)","readback":"the exception desk returns an exception_id, and reading that id back returns the message_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cited.no_jurisdiction","cited.not_in_library","cited.no_adoption_record","cited.certificate_question","cited.source_conflict","cited.change_pending","cited.acceptance_without_person","cited.release_refused","cited.release_without_person","cited.send_unconfirmed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["answer.message_id","answer.queue","answer.policy","answer.source_card_ids","answer.released_by","source_card.edition","source_card.jurisdiction","source_card.effective_from","adoption.calls_up_edition","change_delta.accepted_by","change_delta.accepted_on","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/fire-code-desk","bot":"https://x.ai/bot/VgkKM4dZ2_qkBIu_MSCh9"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"NFPA Research Assistant","original_author":"Michal Sullivan","share_link":"https://x.ai/bot/m80whfWBZ-sHVLjHbtBg1","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"cited-answer","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:16:01.512Z","run_id":"run-1793708161510","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"fire-round-watch","name":"Fire Round Watch","office_task":"Each morning, work out each site's next monthly, six-monthly and yearly fire service from its written schedule and last visit, draft bookings for a person to release, and flag anything overdue.","verticals":["fire-electrical"],"standards":["compliance-calendar"],"systems_of_record":["the fire protection contractor's asset register of fire systems on each site, with each site's written routine service schedule, its dated rule store per state, and the document store the signed service reports are filed in (Simpro, a job sheet or a register the business keeps)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"the system's routine (monthly, six-monthly or yearly), classed Booking drafted from the rule version in force for the site's state, with the visit booking drafted on it and held for a named person to release","readback":"reading the system back by its asset_id returns each routine's derived due date, the rule version that produced it and the drafted booking awaiting release; no draft on the read means nothing was written and the run raises an exception"},{"event":"evidence.filed","write":"the signed service report, filed as the completion evidence on the routine it was done for, and on the shorter routines the same report shows done on that visit to the same system","readback":"reading the routine back by its obligation id returns the evidence reference and the completion date; a report with no document is refused by the register, so no evidence reference on the read means nothing was filed and the run raises an exception"},{"event":"exception.raised","write":"an exception on the routine naming the person who owns it: Overdue, a last visit nobody knows, no rule for the routine in the site's state, a visit reported done with no report, a building owner's dated refusal, a booking or notice drafted and awaiting release, or a past due date its rule version can no longer explain","readback":"the exception desk returns an exception_id, and reading that id back returns the system's asset_id, the routine, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["fireround.routine_overdue","fireround.booking_drafted_awaiting_release","fireround.last_visit_unknown","fireround.no_rule_for_state","fireround.visit_without_report","fireround.visit_declined","fireround.notice_drafted_awaiting_release","fireround.release_refused","fireround.history_unexplained","fireround.report_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.rule_version","seam.anchor_status","seam.class","seam.evidence","seam.refused_at","seam.breached_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/fire-round-watch","bot":"https://x.ai/bot/EKTvhZRqlFR0Z7qjifjW5"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:38:55.847Z","run_id":"run-1793795935844","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"fix-book","name":"Fix Book","office_task":"Keep the fixes our techs find on site, and when a tech asks how we fixed a fault before, show them what was written on that job, or tell them we have no record.","verticals":["trades-building"],"standards":["knowledge-base"],"systems_of_record":["the job system that issues the job_id and names the tech on each job (ServiceM8, Simpro, Tradify, Fergus), whose id names each job's fix folder on the drive","the shared drive that holds the fix notes, voice memos, service manuals and procedures and issues the document_id (Google Drive or SharePoint), left where it is","the register on that tenant (one Sheet or SharePoint list: a row per source, owner a person, kind, edition and checksum)","the task list the office runs (Google Tasks, Planner or a sheet), which issues the exception_id for each open question"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the tech's fix, sent back after the job, filed as one fix note (fault, cause, fix, parts, tested) into Fixes/<job_id>/ on the drive by the job system's job_id, with the customer's name, phone and address left out; it is then registered with the tech as owner before any of it is searchable","readback":"the drive returns the note's file id, and reading that id back returns the note in the job_id's folder with the message_id it came from; no id back means nothing was filed and the tech's message is raised to the service manager"},{"event":"exception.raised","write":"a task on the office's task list naming the person who owns it, with a due date: a fix note or procedure whose only owner is a team, two copies of one fix note waiting for a person to pick the one to keep, a customer's material waiting for someone to set who may read it and for how long, a manual or fault code chart the office expects and the drive does not hold, a tech's message with no fault or no fix line, or a registered file gone from the drive","readback":"the task list returns an exception_id, and reading that id back returns what is expected, the owner and the due date; no id back means nothing was raised, and the file stays off the index"}],"exceptions":{"raises":["kb.owner_not_a_person","kb.canonical_copy_undecided","kb.customer_access_undecided","kb.expected_edition_missing","kb.fix_message_incomplete","kb.source_gone_from_drive"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["register.id","register.kind","register.owner","register.location","register.edition","register.checksum","register.retrieved_at","register.status","register.duplicate_of","register.access_list","register.expires_on","register.superseded_checksums"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/fix-book","bot":"https://x.ai/bot/2xmvzQycSsPvWe9dBXVe9"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-base","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:31:51.366Z","run_id":"run-1793795511365","green":11,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"folder-brief","name":"Folder Brief","office_task":"Put every file in our messy shared folder on one register with an owner, catch the week one changes, and give me a one-screen brief of what's current, stale, open and changed.","verticals":["b2b-office"],"standards":["knowledge-base"],"systems_of_record":["the shared drive that holds the folder and issues the document_id (Google Drive or SharePoint), left where it is","the register on that tenant (one Sheet or SharePoint list: a row per source, owner a person, kind, edition and checksum)","the task list the office runs (Google Tasks, Planner or a sheet), which issues the exception_id for each open question"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the one-screen brief, written as one Doc into the folder it covers after each run: current sources with owner and edition, stale ones (superseded editions, copies, files gone), the open questions as task ids with owners, and what changed this run, every line by register id and location and nothing composed from the files","readback":"the drive returns the brief's file id as the report_id, and reading that id back returns the Doc with the run time and the register ids it lists; no id back means no brief was published and the run raises an exception to the register keeper"},{"event":"exception.raised","write":"a task on the office's task list naming the person who owns it, with a due date: an edition the office expects and the folder does not hold, a file whose only owner is a team, two copies waiting for a person to pick the one the office works from, client material waiting for someone to set who may read it and for how long, an instrument with no edition printed, or a registered file gone from the folder","readback":"the task list returns an exception_id, and reading that id back returns what is expected, the owner and the due date; no id back means nothing was raised, and the file stays off the index"}],"exceptions":{"raises":["kb.expected_edition_missing","kb.owner_not_a_person","kb.canonical_copy_undecided","kb.customer_access_undecided","kb.instrument_without_edition","kb.source_gone_from_drive"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["register.id","register.kind","register.owner","register.location","register.edition","register.checksum","register.retrieved_at","register.status","register.duplicate_of","register.access_list","register.expires_on","register.superseded_checksums"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/folder-brief","bot":"https://x.ai/bot/d7qK0y-xthojq5KWvFyp7"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Drive Docs Memory","original_author":"Markus","share_link":"https://x.ai/bot/tH467e0VuoKeME1YdDD_m","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-base","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:49:26.672Z","run_id":"run-1793710166670","green":11,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"gas-tally","name":"Gas Tally","office_task":"Match the refrigerant log for every cylinder and van to the gas charged and recovered on each job, and list what does not reconcile for the licence holder before the reporting date.","verticals":["trades-building"],"standards":["two-records"],"systems_of_record":["Simpro (the job system that issues the job id and holds the refrigerant charged and recovered on each job, against the cylinder used)","the cylinder log (one line per cylinder per job, by van, as the technician weighed it on the van scale, keyed by the job id and the cylinder id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the refrigerant tally for the period, written where the licence holder opens it: the pair contract it ran under, the join key (job id and cylinder id), the master per field, and the counts reconciled, within tolerance, not reconciled, unaccounted for and corrected, published weekly and again ahead of the reporting date, the all-clear included","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the job and cylinder naming the person who owns it: kg charged, kg recovered or refrigerant type that does not reconcile, with the cylinder log's value, the job's value and the master's value side by side; gas on a cylinder line with no job record; gas on a job with no cylinder line; a gap over the threshold in kg; too many lines not reconciled; or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the job id, the cylinder id, the reason, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two-records.contract_missing","two-records.difference_open","two-records.orphan_log_line_without_job","two-records.orphan_job_gas_without_log_line","two-records.over_threshold_amount","two-records.mismatch_rate_exceeded","two-records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.job_id","seam.cylinder_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_log","seam.value_job","seam.master_value","seam.accepted_by","seam.written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/gas-tally","bot":"https://x.ai/bot/OEWoPQy_7UAEwJmSmPdCP"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:39:14.957Z","run_id":"run-1793795954956","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"goods-match","name":"Goods Match","office_task":"Hold every supplier invoice against its purchase order and what was actually received, catch duplicates, and tell finance which queue each one is in.","verticals":["b2b-office"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id for each supplier invoice)","the purchase order and goods-received register, keyed by order_id (Xero purchase orders, or a Google Sheets register)","the document store holding the invoice copies and written variation approvals (Google Drive, or the Gmail attachment)"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"a clean match stamped on the bill: the order_id it was matched to by the number the invoice names, the four check records with what each saw (rate, received quantity less earlier invoices, written variation approvals, cumulative position), the dated tolerances used, and queue done_reversible, waiting for a named person in finance to approve. Nothing is paid.","readback":"the bill read back from the ledger by its bill_id returns seam.order_ref, seam.queue = done_reversible and the four passed check records; no bill back by that id means nothing was stamped and the run stops"},{"event":"exception.raised","write":"an exception on the bill naming the person in finance who owns it: the check that failed and the checks that never ran, the difference in dollars, the cumulative position, the source document, and its queue (needs a decision; waiting on the supplier for a copy; or blocked: no purchase order, or scope with no written approval). Finance is told by a Gmail notice that links the exception.","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["bill.no_purchase_order","bill.no_source_document","bill.rate_mismatch","bill.quantity_not_received","bill.possible_duplicate","bill.unapproved_scope","bill.contract_sum_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.order_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/goods-match","bot":"https://x.ai/bot/5yeKTrz6yD1F08tDAfV4O"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Match vendor invoices with POs and GRNs in Google Sheets and notify Finance via Gmail","original_author":"Fahim Jilani","share_link":"https://n8n.io/workflows/19446","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:37:27.125Z","run_id":"run-1793709447124","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"handbook-desk","name":"Handbook Desk","office_task":"Answer staff and manager questions about our employee handbook, HR policies and work rules by quoting the clause and its edition, or hand the question to the HR owner.","verticals":["b2b-office"],"standards":["cited-answer"],"systems_of_record":["the mail system that issues the message_id the HR question arrived on and the reply went out on (Gmail, Outlook)","the business's own rules library: the employee handbook, HR policies and work rules, and any award or National Employment Standards extract it has loaded, held as clauses with an edition, an Australian state or territory (or AU) and an effective date, with its answer register","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"answer.sent","write":"a stored answer quoting the handbook, policy or work-rule clause it came from, with its source cards (instrument, clause, edition, state or territory, effective date), sent as a reply on the question's thread only after a named person released it on the answer register","readback":"the mail system returns the reply's message_id, and reading that id back returns the thread it replies in and the answer register id; no id back means it was not sent, and hr.send_unconfirmed is raised to the HR owner"},{"event":"exception.raised","write":"an exception on the question's message naming the HR owner: no state or territory of work given, nothing in the rules held covers it, a ruling on one person's entitlement, discipline or dismissal, a compliance statement, legal reading or safety call, a source conflict between two live instruments, or a rule that moved and waits for a named person to accept it (listing every stored answer that relied on it)","readback":"the exception desk returns an exception_id, and reading that id back returns the message_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["hr.no_work_state","hr.not_in_rules","hr.decision_for_person","hr.source_conflict","hr.change_pending","hr.acceptance_without_person","hr.release_refused","hr.release_without_person","hr.send_unconfirmed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["answer.message_id","answer.queue","answer.policy","answer.source_card_ids","answer.released_by","source_card.edition","source_card.jurisdiction","source_card.effective_from","change_delta.accepted_by","change_delta.accepted_on","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/handbook-desk","bot":"https://x.ai/bot/WDbxt7SKGanp7Jghdg2QL"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"HR Bot","original_author":"Goose","share_link":"https://x.ai/bot/jiXiI3f9iR5qNB-Frc0eT","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"cited-answer","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:10:36.140Z","run_id":"run-1793715036139","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"handover-manual","name":"Handover Manual","office_task":"At practical completion, put the O&M manual together from the job's asset list, certificates and records, list anything missing, and hold it for the project manager to release.","verticals":["trades-building"],"standards":["rejected-pack"],"systems_of_record":["the job system that issues the job_id the manual belongs to, with its installed asset list (Simpro, ServiceM8 or Tradify's job export)","the document store that issues the document_id of each certificate, warranty and record in the job folder, and holds the drafted manual (SharePoint, OneDrive or Google Drive)","the exception desk the business runs, holding each held manual with its named owner"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the drafted O&M manual, written into the job's handover folder against the job_id: the asset schedule (make, model, serial, location, installer and licence), each filed certificate, warranty and instruction by its number, the written not-applicable for each record the job does not need with its rule, warranty end and first service dates derived from the dated rules, the date the manual is due to the client, the queue after the eight checks in order, and the as-of date; marked released only after the project manager's named release, which the build never gives","readback":"the document store returns a report_id, and reading that id back returns the job_id, seam.queue, seam.rule_version, seam.manual_due and seam.as_of; no id back means the manual was not written and the run raises an exception instead"},{"event":"exception.raised","write":"an exception on the job naming its project manager: the first check that failed (a record filed for another job, a lapsed builder or trade licence, an asset with no handover rule, records still missing listed in full, a second site address or licence number), values read off a scan waiting for a person to confirm, or a manual waiting for the project manager's named release","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the failed check with its reason, the list of missing records and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["handover.record_for_other_job","handover.licence_lapsed","handover.no_rule_for_asset","handover.records_missing","handover.two_addresses_or_licences","handover.yellow_values","handover.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.report_id","seam.queue","seam.failed_check","seam.missing","seam.rule_version","seam.manual_due","seam.as_of","seam.accepted_by","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/handover-manual","bot":"https://x.ai/bot/z9mQfPQBXFr21EqLI0nfb"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:45:12.377Z","run_id":"run-1793796312375","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"hours-audit","name":"Hours Audit","office_task":"Every week before the pay run, check the Square timecards against the roster and the award edition, put anything odd in front of its owner, and export only what a person released.","verticals":["b2b-office"],"standards":["timesheet-check"],"systems_of_record":["Square Team (team members, scheduled shifts with the job each is for, and timecards)","the business's rule store holding each award edition as a dated row","the business's Australian payroll system, which issues the export batch id","the exception desk the business runs (the anomaly queue)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the period report: hours by person and day, daily and weekly totals each naming the entries they sum, anomalies found and resolved, who released the period or that nobody has, and the payroll batch id when there is one. Published every run, a clean period included","readback":"the report store returns a report_id, and reading that id back returns the period id, the totals with their entry ids and the release field; no id back means nothing was published and the run stops"},{"event":"exception.raised","write":"an anomaly on the timecard entry, one of the six kinds (over_hours, overlap, missing_break, not_rostered, not_allocated, rule_unclear), naming the person who owns it","readback":"the exception desk returns an exception_id, and reading that id back returns the entry id, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["timesheet.over_hours","timesheet.overlap","timesheet.missing_break","timesheet.not_rostered","timesheet.not_allocated","timesheet.rule_unclear"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.period_id","seam.anomalies_open","seam.rule_edition","seam.released_by","seam.export_external_id","seam.report_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/hours-audit","bot":"https://x.ai/bot/s6sgM6vr-LmdssyEUtNkY"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Square Crew, Payroll & HR Helper","original_author":"Anatoliy Belyshev","share_link":"https://x.ai/bot/OQZaBnEMi7H_0En2qys0a","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"timesheet-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:28:58.533Z","run_id":"run-1793712538532","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"hours-check","name":"Hours Check","office_task":"When the pay week closes, check the crew's hours against the roster, their jobs and the dated award, put the odd ones in front of a named person, and send nothing to payroll until someone releases it.","verticals":["trades-building"],"standards":["timesheet-check"],"systems_of_record":["the job system that issues the job_id and holds the allocations and roster (ServiceM8, Simpro, Tradify, Fergus or similar)","the payroll system that takes one export per period and returns its id (Xero Payroll, Employment Hero or MYOB)","the exception desk the business runs, for the anomaly queue"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the period report into the system the payroll officer opens: hours by person and day with totals that list the entry ids they sum, anomalies found and resolved, the award edition cited on each card, who released the period or that nobody has, and the payroll export id once one exists. Published every run, a clean period included","readback":"the report store returns a report_id, and reading that id back returns the period id, the totals with their entry ids and the release field; the payroll export is read back by period with readExport, and a null external id is reported as a failed export, never a success"},{"event":"exception.raised","write":"an anomaly on the entry, from the closed list (over_hours, overlap, missing_break, not_rostered, not_allocated, rule_unclear), naming the person who owns it: the supervisor, whoever keeps the roster, the job's owner, or whoever answers for the award","readback":"the exception desk returns an exception_id, and reading the period's queue back returns that id with the entry id, the kind and the owner; one anomaly per entry and kind, so a retried wake raises none twice"}],"exceptions":{"raises":["timesheet.over_hours","timesheet.overlap","timesheet.missing_break","timesheet.not_rostered","timesheet.not_allocated","timesheet.rule_unclear"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.period_id","seam.anomaly_owner","seam.card_rule_edition","seam.released_by","seam.export_external_id","seam.report_id"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/hours-check","bot":"https://x.ai/bot/PpPKd0VJKWBUpbxVtbzvA"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"timesheet-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:50:14.904Z","run_id":"run-1793710214902","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"inbox-desk","name":"Inbox Desk","office_task":"Each weekday, read the shared business inbox, file every message against its job or supplier, and hold every real reply for a named person.","verticals":["b2b-office"],"standards":["inbox-triage"],"systems_of_record":["the mail system that issues the message_id (the shared Gmail or Outlook mailbox)","the job system or ledger that holds the job and supplier records messages are filed against","the exception desk the business runs, holding the queue table and its items"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an item on the exception desk naming the person who owns it, one per thread: a message waiting on its queue owner's reply, an unmatched message left as a task, a complaint handed whole to a person, or an item past its kind's clock handed to the owner's manager","readback":"the exception desk returns an exception_id (the item id), and reading the record back by message_id returns the item with its kind, record_ref, owner, due date and every outbound with who released it; no item back means nothing was raised and the message is escalated to the other queue's owner"}],"exceptions":{"raises":["inbox.awaiting_release","inbox.unmatched_task","inbox.complaint","inbox.past_clock","inbox.readback_failed"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.message_id","seam.thread_id","seam.kind","seam.record_ref","seam.owner","seam.due","seam.status","seam.released_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/inbox-desk","bot":"https://x.ai/bot/f5YXTvk9hdZMftvRjBCRv"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Inbox Triage","original_author":"Cristopher Guido","share_link":"https://x.ai/bot/lDp666Fm-QgyBGqK7ee4l","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"inbox-triage","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:04:32.610Z","run_id":"run-1793703872608","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"install-book","name":"Install Book","office_task":"When an install is signed off, put the unit and its warranty on our books from the commissioning record, work out its first service date from our schedule, and remind the customer once.","verticals":["trades-building"],"standards":["next-service"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, Fergus, Jobber or AroFlo: the completed install or service job and the equipment the technician recorded on it)","the asset register that issues the asset_id (each installed unit, with its service records and the reminder history kept against it)"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.created","write":"one booking request in the job system per yes, against the customer and the asset, carrying the customer's reply word for word and no time slot or price; a person books the time and prices the work","readback":"the job system returns the job id, and reading that job back returns the same customer_id and asset_id before the office is told a request is waiting; an open job already on the asset means nothing new is written; no job that reads back means an exception, not a booking"},{"event":"exception.raised","write":"an exception on the asset or the reply naming the person who owns it: a missing install date, model or equipment type, an equipment type with no schedule row, a customer who agreed to no channel, a reply that is not a yes or a stop, a refused send, or a booking request that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the asset_id or reply_id, the kind and the exception_owner; no id back means nothing was raised and the run stops for that asset"}],"exceptions":{"raises":["missing_install_date","missing_model","missing_equipment_type","no_schedule","no_consent","unclear_reply","next_service.send_refused","next_service.booking_not_read_back","next_service.record_not_written"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.source_job_id","seam.reminder_stage","seam.booking_job_id","seam.opt_out","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/install-book","bot":"https://x.ai/bot/yXlgw2u5AGCqD-UbMNgTH"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"next-service","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:19:05.476Z","run_id":"run-1793794745475","green":10,"red":0,"with_us":1,"evidence_required":1,"total":15}]},{"slug":"intercompany-match","name":"Intercompany Match","office_task":"Each month end, match what our group companies say they owe each other across their Xero files, list every difference with both figures, and fix one only once a named person accepts it.","verticals":["accounting-bookkeeping"],"standards":["two-records"],"systems_of_record":["Xero, the issuing company's file (the intercompany invoice and its InvoiceID)","Xero, the receiving company's file (the bill entered for the same charge, carrying the issuer's InvoiceID as its reference)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the month-end intercompany run into the group's reconciliation log: the pair contract id, the key it joined on (the issuer's Xero InvoiceID), the master per field, and the five counts (matched, within tolerance, mismatched, orphaned, corrected), the all-clear included","readback":"the log returns a report_id, and reading that id back returns the run with its contract id and counts; no id back means the run did not publish and the contract owner is told"},{"event":"exception.raised","write":"an exception on the issuer's Xero InvoiceID naming the contract owner: an open difference with both figures and the master's figure awaiting acceptance, an entry in one company's file with no partner in the other, a gap over the threshold amount, a run over the mismatch rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading it back returns the issuer's InvoiceID, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two_records.no_contract","two_records.no_master","two_records.difference_open","two_records.orphan","two_records.over_threshold","two_records.mismatch_rate","two_records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.issuer_invoice_id","seam.contract_id","seam.difference_status","seam.value_issuer","seam.value_receiver","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/intercompany-match","bot":"https://x.ai/bot/rLwLLxtmnNsKK-gtQmsXY"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:51:38.359Z","run_id":"run-1793793098357","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"invoice-desk","name":"Invoice Desk","office_task":"When a job is marked complete, put its draft invoice in Xero at our own prices, park what it cannot price, and send only once a named person or their rule releases it.","verticals":["b2b-office"],"standards":["invoice-out"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, or a job sheet)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per completed job, keyed to the job id (reference job:<id>, and the stage under a building contract), every line a job line priced from the Xero Items read at draft time, carrying the book edition and any signed variation acceptance.","readback":"The invoice is read back from the ledger by the job id (Xero GET /api.xro/2.0/Invoices/{InvoiceID}) and must return the same invoice id, its external id and the job id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The release on the invoice record, naming the person who closed the awaiting-release exception or the rule (with its threshold) that person set, then the send from the ledger. Nothing parked is ever sent.","readback":"The invoice read back by its id shows status sent, the sent time, and released_by or released_by_rule, with the release before the send."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the job: the reason from the standard's fixed list (not_in_pricebook, unsigned_variation, no_stage, write_failed) or awaiting_release, the job id, the invoice id, the unpriced codes with no rate, and exception_owner set to the person the business named for invoices.","readback":"The exception desk returns the exception against the job id, and reading it back returns the job_id, invoice_id, reason and exception_owner; the next hop reads it there and stops."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.no_stage","invoice.write_failed","invoice.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/invoice-desk","bot":"https://x.ai/bot/BuX7-5BB-IjFDdBpLKETb"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Create and approve Xero invoices from Pipedrive Closed Won deals with Slack","original_author":"Intuz","share_link":"https://n8n.io/workflows/20013","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T12:19:44.802Z","run_id":"run-1793708384801","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:19:45.183Z","run_id":"run-1793708385181","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"invoice-hold","name":"Invoice Hold","office_task":"When a renovation job is marked complete, draft its one invoice in Xero at our own prices and hold it until a named person, or their rule, releases it.","verticals":["trades-building"],"standards":["invoice-out"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, or a job sheet)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per completed job, keyed to the job id (reference job:<id>, and the stage under a building contract), every line a job line priced from the Xero Items read at draft time, carrying the book edition and any signed variation acceptance as evidence.","readback":"The invoice is read back from the ledger by the job id and must return the same invoice id, its Xero InvoiceID and the job id. No id back is not a write: it raises invoice.write_failed with the named owner and the run stops."},{"event":"invoice.sent","write":"The release on the invoice, naming the person who closed the awaiting-release exception or the rule (with its threshold) that person set, then the send from the ledger. Nothing parked is ever sent.","readback":"The invoice read back by its id shows status sent, the sent time, and released_by or released_by_rule, with the release recorded before the send."},{"event":"exception.raised","write":"A parked or held invoice as an exception on the job: the reason (not_in_pricebook, unsigned_variation, no_stage, write_failed or awaiting_release), the job id, the invoice id, any codes left without a rate, and exception_owner set to the person the business named for invoices.","readback":"The exception desk returns the exception against the job id, and reading it back returns the job_id, invoice_id, reason and exception_owner; the next hop reads it there and stops."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.no_stage","invoice.write_failed","invoice.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.stage","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/invoice-hold","bot":"https://x.ai/bot/oUrbxQPpMrbAaScrAaDvs"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Chief of Staff","original_author":"Amine","share_link":"https://x.ai/bot/WMLSz9eCswzYR8nPmmxsJ","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T13:14:19.605Z","run_id":"run-1793711659603","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:14:21.036Z","run_id":"run-1793711661035","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"invoice-pair","name":"Invoice Pair","office_task":"Every morning, check our Harvest invoices against the ledger by invoice id, show each difference with both values, and fix one only once a named person accepts it.","verticals":["b2b-office"],"standards":["two-records"],"systems_of_record":["Harvest (issues the invoice and its id)","Balances (the ledger that records payment against the Harvest invoice id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"payment.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's report into the shared reconciliation log: contract id, the key it joined on, the master per field, and the five counts (matched, within tolerance, mismatched, orphaned, corrected), the all-clear included","readback":"the log returns a report_id, and reading that id back returns the run with its contract id and counts; no id back means the run did not publish and the owner is told"},{"event":"exception.raised","write":"an exception on the Harvest invoice id naming the contract owner: an open difference with both values and the master's value awaiting acceptance, an orphan on one side, a difference over the threshold amount, a run over the mismatch rate, or a correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading it back returns the Harvest invoice id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["two_records.no_contract","two_records.no_master","two_records.no_master_for_field","two_records.difference_open","two_records.orphan","two_records.over_threshold","two_records.mismatch_rate","two_records.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.harvest_invoice_id","seam.contract_id","seam.difference_status","seam.value_harvest","seam.value_ledger","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/invoice-pair","bot":"https://x.ai/bot/fm_Ox0fggf70TfVai1tjO"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Invoice Mirror","original_author":"Jerrod Tuck","share_link":"https://x.ai/bot/HwckXN5Yd1uxRu86msyfj","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:38:10.892Z","run_id":"run-1793709490890","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"job-files","name":"Job Files","office_task":"Find the permit, approval and job paperwork on our drive and give back the exact page of the exact file, knowing it is the current copy and who owns it.","verticals":["trades-building"],"standards":["knowledge-base"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, Tradify, Fergus), whose id names each job's folder on the drive","the shared drive that holds the job folders and company files and issues the document_id (Google Drive or SharePoint), left where it is","the register on that tenant (one Sheet or SharePoint list: a row per source, owner a person, kind, edition and checksum)","the task list the office runs (Google Tasks, Planner or a sheet), which issues the exception_id for each open question"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the job file sheet, written as one Doc into Jobs/<job_id>/ after each run: every registered permit, approval, certificate and job file for that job_id with its owner, edition and the locator that opens it, the company-wide codes it works under, and the open tasks for the job, every line by register id or task id and nothing composed from the files","readback":"the drive returns the sheet's file id as the report_id, and reading that id back returns the Doc with the job_id, the run time and the register ids it lists; no id back means no sheet was published and the run raises an exception to the register keeper"},{"event":"exception.raised","write":"a task on the office's task list naming the person who owns it, with a due date: an approval edition or code the office expects and the drive does not hold, a file whose only owner is a team, two copies of one notice waiting for a person to pick the one the office works from, a homeowner's or client's material waiting for someone to set who may read it and for how long, an instrument with no edition printed, or a registered file gone from the drive","readback":"the task list returns an exception_id, and reading that id back returns what is expected, the owner and the due date; no id back means nothing was raised, and the file stays off the index"}],"exceptions":{"raises":["kb.expected_edition_missing","kb.owner_not_a_person","kb.canonical_copy_undecided","kb.customer_access_undecided","kb.instrument_without_edition","kb.source_gone_from_drive"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["register.id","register.kind","register.owner","register.location","register.edition","register.checksum","register.retrieved_at","register.status","register.duplicate_of","register.access_list","register.expires_on","register.superseded_checksums"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/job-files","bot":"https://x.ai/bot/zndHCTSnmcuzhCwXWphcN"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"File Crawler","original_author":"Duncan Waring","share_link":"https://x.ai/bot/bNv8Ii8E5LgmB39kN5uyj","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-base","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:44:28.936Z","run_id":"run-1793713468935","green":11,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"job-hours","name":"Job Hours","office_task":"When a tech closes a job or the pay week ends, check every hour against the job it was booked to, put the odd ones in front of their owner, and export to payroll only what a person released.","verticals":["trades-building"],"standards":["timesheet-check"],"systems_of_record":["the job system that issues the job_id and holds the allocations, the roster and the techs' time entries (ServiceM8, Simpro, Tradify, Fergus or similar)","the business's rule store holding each award edition as a dated row","the Australian payroll system that takes one export per pay period and returns its id (Xero Payroll, Employment Hero, KeyPay or MYOB)","the exception desk the business runs, for the anomaly queue"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the pay period's hours report into the system the payroll officer opens: hours by tech and day with daily and weekly totals that list the entry ids they sum, each line's job_id, anomalies found and resolved, the award edition on every card, who released the period or that nobody has, and the payroll export id once one exists. Published every run, a clean period included","readback":"the report store returns a report_id, and reading that id back returns the period id, the totals with their entry ids and the release field; the payroll export is read back by period before any write, and a null external id is reported as a failed export, never a success"},{"event":"exception.raised","write":"an anomaly on the time entry, one of the six closed kinds (over_hours, overlap, missing_break, not_rostered, not_allocated, rule_unclear), naming its owner: the tech's supervisor, whoever keeps the roster, the job's owner, or whoever answers for the award","readback":"the exception desk returns an exception_id, and reading the period's queue back returns that id with the entry id, the kind and the owner; one anomaly per entry and kind, so a retried wake raises none twice"}],"exceptions":{"raises":["timesheet.over_hours","timesheet.overlap","timesheet.missing_break","timesheet.not_rostered","timesheet.not_allocated","timesheet.rule_unclear"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.period_id","seam.job_id","seam.anomaly_owner","seam.card_rule_edition","seam.released_by","seam.export_external_id","seam.report_id"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/job-hours","bot":"https://x.ai/bot/rzkv8Nfmto7SUTupq3KdF"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Kairos · Timesheet Manager","original_author":"ᑕᕼIᑕᗩᘜO MAGA","share_link":"https://x.ai/bot/KvPsNsHBQIkadJ9HBZ6D0","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"timesheet-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:45:41.447Z","run_id":"run-1793713541445","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"job-sheet","name":"Job Sheet","office_task":"When the tech finishes on site, fill in the job card from what they sent, priced only from our price book, and save it to the job once they reply yes.","verticals":["trades-building"],"standards":["job-close"],"systems_of_record":["ServiceM8 or Simpro (the job, its assigned tech, its quote, its materials, notes and attachments)","the business's own price book (ServiceM8 materials, the Simpro catalogue or the Xero item list)","the exception desk the business runs"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.completed","write":"the confirmed job card on the job_id the tech named: the work done, each part as a price book line at the book's price at the write, the labour line and the photos, written once under close:<tenant>:<job_id>:<capture>, then the job status set to Completed","readback":"the card write returns the job system's ids for the note, each material and each photo; only then is the status set, and reading the job back by job_id returns status Completed with the card under that intent id. No ids back means not written: write_failed is raised and the retry carries the same intent id"},{"event":"exception.raised","write":"an exception on the job naming its owner: a job number the job system does not hold, a sender not assigned to the job, a part not in the book or matching two lines, a variation the quote did not cover, a draft the tech did not confirm within two hours, or a write with no ids back","readback":"the exception desk returns an exception_id, and reading the job's exceptions back by job_id returns it with the reason, the tech's words exactly and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["close.no_job","close.not_assigned","close.not_in_book","close.ambiguous","close.variation","close.not_confirmed","close.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.close_intent_id","seam.close_draft_id","seam.close_confirmed_by","seam.close_external_ids","seam.close_status","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/job-sheet","bot":"https://x.ai/bot/AcNGM5o1k9ZInQxJjyxR7"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"job-close","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:09:48.999Z","run_id":"run-1793794188997","green":5,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"job-wip","name":"Job WIP","office_task":"Every Monday, publish the job profit and work-in-progress report: each open job's quoted value, cost to date and invoiced to date, every figure with its source and the time it was read.","verticals":["trades-building"],"standards":["recurring-report"],"systems_of_record":["the job system (Simpro, ServiceM8, Fergus and the like): each open job's accepted quote plus approved variations, and its cost to date (labour at cost rate, materials and subcontract bills against the job)","the ledger (Xero or MYOB): invoices raised against each job's tracking category to date, less credit notes","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's job WIP report per audience (owner with every open job, external accountant with the open-job totals), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, released by the named person with the reason","readback":"reading the week's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a job system or ledger that could not be read, a measure with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the week, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/job-wip","bot":"https://x.ai/bot/RPLIcURtJVvTXDY8NkGxW"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:52:59.542Z","run_id":"run-1793796779541","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"jobs-weekly","name":"Jobs Weekly","office_task":"Every Monday, publish our jobs report: jobs finished last week, jobs still open by how old they are, and staff hours by task, every figure with its source and the time it was read.","verticals":["trades-building"],"standards":["recurring-report"],"systems_of_record":["the job system (ServiceM8, Simpro, Fergus and the like): jobs completed in the week and open jobs by age from their created date","the timesheets (the job system's own time clock, or the payroll timesheets): approved staff hours booked to each task","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's jobs report per audience (owner, site supervisors), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the week's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a job system or timesheet that could not be read, a measure with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the week, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/jobs-weekly","bot":"https://x.ai/bot/tcxuBjNPY-FhjnoVWuJet"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:24:09.561Z","run_id":"run-1793795049559","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"late-rent-desk","name":"Late Rent Desk","office_task":"For a landlord with 1 to 50 doors: each day, find who is really behind on rent, text only them, and hand notices, fees and hardship to a person.","verticals":["property"],"standards":["rent-arrears"],"systems_of_record":["the property management system or rent ledger that issues the tenancy_id (its tenancy ledger, rule store and message log)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"rent.overdue","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the sent copy of each released arrears SMS (body, recipient tenancy, timestamp), filed in the message log against the tenancy_id, after every stop condition was checked against a fresh ledger read","readback":"reading the message log by tenancy_id returns the message with its tenancy_id, body and sent time; if the new copy does not read back, the desk raises rent.message_not_filed and the sequence goes no further"},{"event":"exception.raised","write":"an exception on the tenancy naming the person who owns it: a stop condition that matched, a failed or stale ledger read, no dated rule for the state, a notice drafted and held for a named release, a fee held for a person, hardship stated, or a sequence that went unanswered","readback":"the exception desk returns an exception_id, and reading that id back returns the tenancy_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["rent.ledger_read_failed","rent.ledger_stale","rent.no_rule_for_state","rent.unmatched_receipt","rent.payment_received","rent.payment_in_transit","rent.payment_arrangement","rent.hardship_on_file","rent.hardship_stated","rent.dispute_or_advocacy_on_file","rent.on_formal_path","rent.paused_by_person","rent.notice_drafted_awaiting_release","rent.fee_held_for_person","rent.sequence_unanswered","rent.send_refused","rent.message_not_filed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.tenancy_id","seam.triage_outcome","seam.stop_check","seam.rule_version","seam.next_lawful_date","seam.notice_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/late-rent-desk","bot":"https://x.ai/bot/XwHjd5j-gNaxc1QO3VBXy"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"LeaseLord","original_author":"Jonah","share_link":"https://x.ai/bot/cMtHljXnkIqtyUf20XbIE","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rent-arrears","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:07:00.891Z","run_id":"run-1793714820890","green":5,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"lead-payback","name":"Lead Payback","office_task":"Each month, publish which ad campaign or lead source our jobs came from and what we invoiced on them, every figure traced to the job and invoice records.","verticals":["trades-building","b2b-office"],"standards":["recurring-report"],"systems_of_record":["the job system (Simpro, ServiceM8, Tradify, Fergus and the like): the lead source field and accepted quote on each job_id","the ledger (Xero or MYOB): invoices and credit notes raised in the month, each carrying its job_id in the reference","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the month's lead source report per audience (owner: jobs won and invoiced value per lead source; marketing contractor: jobs won only), each figure carrying its definition id, source and as-of time or published as unavailable with the reason, jobs with no lead source recorded counted as their own line; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a job system or ledger read that failed, a lead source line with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/lead-payback","bot":"https://x.ai/bot/NDXnWJsEhJs8io6X4xgOQ"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:59:26.677Z","run_id":"run-1793797166675","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"lead-sort","name":"Lead Sort","office_task":"Sort the trade office inbox, voicemails and web-form leads included, onto the job or supplier by id, and hold every real reply for a named person.","verticals":["trades-building"],"standards":["inbox-triage"],"systems_of_record":["the shared office mailbox (Microsoft 365 or Google Workspace) that issues the message_id, where voicemail and website enquiry-form notifications land","the job system that issues the job_id messages are filed against (ServiceM8 or Simpro)","the ledger that holds supplier records (Xero)","the exception desk the business runs, holding the queue table and its items"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the message filed against the job or supplier record by that record's own id, and for a supplier invoice its attachment filed as evidence with its hash and the message id, where Invoice Check reads it","readback":"reading the record by message_id returns the filing with record_ref job:<job_id> or supplier:<id>, and the evidence with the attachment hash; no record_ref back means it was not filed, and the message stays an unfiled task for a named person"},{"event":"exception.raised","write":"an item on the exception desk naming the person who owns it, one per thread: a new lead waiting on the office to book and quote, an unmatched or other message left as a task, a complaint handed whole to the owner, or an item past its kind's clock handed to the owner's manager","readback":"raising the item returns an item id, and reading the record by message_id returns that item with its kind, record_ref, owner, due date and every outbound with who released it; no item id back means nothing was raised and the run stops"}],"exceptions":{"raises":["inbox.lead_awaiting_booking","inbox.unmatched_task","inbox.classified_other","inbox.complaint","inbox.awaiting_release","inbox.past_clock"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.message_id","seam.thread_id","seam.kind","seam.record_ref","seam.item_id","seam.owner","seam.due","seam.status","seam.released_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/lead-sort","bot":"https://x.ai/bot/GRh4pXcHEy_TT9MaUilxp"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Contractor Front Desk","original_author":"Thuong P. Nguyen","share_link":"https://x.ai/bot/A1t0gfd8P4hbldi8swcem","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"inbox-triage","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:06:35.936Z","run_id":"run-1793711195935","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"lease-dates","name":"Lease Dates","office_task":"Keep every commercial lease's rent review and option dates worked out from the lease and the state's rules, draft the notice in time for the manager to serve, and file the served copy.","verticals":["property"],"standards":["compliance-calendar"],"systems_of_record":["the property management system that issues the tenancy_id (its commercial lease register, dated rule set and the document store served notices are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"a served rent review notice, a landlord's option reminder notice or the tenant's option exercise letter, attached to an email, filed as evidence on the lease obligation it names by obligation id and the lease's tenancy_id; an email with no obligation id is never matched on a shop number, tenant name or address and is raised instead","readback":"the obligation is read back by its id and must return the same evidence reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and lease.copy_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the lease obligation naming the person who owns it: an unknown review or commencement date, no rule in force, a past date no retained rule version explains, a 'served it' email with no copy, a landlord's dated instruction not to review, a missed review or option date, a drafted notice awaiting the manager's release, a release with no named person, silence past the next chase date, or an email with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["lease.anchor_unknown","lease.no_rule_in_force","lease.history_unexplained","lease.served_without_copy","lease.copy_not_read_back","lease.refusal_recorded","lease.date_missed","lease.notice_drafted_awaiting_release","lease.release_refused","lease.reply_overdue","lease.email_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.tenancy_id","seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/lease-dates","bot":"https://x.ai/bot/2HY5QB8n8xiK-OQkTUImU"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:05:29.281Z","run_id":"run-1793793929280","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"licence-watch","name":"Licence Watch","office_task":"Each morning, work out when our licences and insurance policies run out from each state's rule, remind the named person with a Done link, and count it renewed only when the new certificate is filed.","verticals":["trades-building"],"standards":["compliance-calendar"],"systems_of_record":["the business's licence register (each contractor licence, worker trade licence and insurance policy with its issue or renewal date, the dated rule set per state, and the document store renewed licences and certificates of currency are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the renewed licence or certificate of currency attached to a Done reply, filed as evidence of renewal on the licence obligation the Done link names by obligation id; a reply with no obligation id is never matched on a name or a phone number and is raised instead","readback":"the obligation is read back by its id and must return the same document reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and licence.evidence_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the licence obligation naming the person who owns it, which the exception desk texts to them with the Done link: a renewal coming due, a lapse, a Done with no document, no issue date on the licence record, no rule for that licence type in that state, a past expiry no retained rule version explains, a dated decision not to renew, a drafted renewal request awaiting a named release, a release with no named person, silence past the next chase date, or a reply with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["licence.renewal_due","licence.overdue","licence.done_without_document","licence.evidence_not_read_back","licence.done_unmatched","licence.anchor_unknown","licence.no_rule_in_force","licence.history_unexplained","licence.renewal_declined","licence.renewal_drafted_awaiting_release","licence.release_refused","licence.chase_due"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/licence-watch","bot":"https://x.ai/bot/204M7lekBay-3ry7z5Zmi"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Send license and insurance renewal reminders by SMS with Twilio","original_author":"Michael Matthews","share_link":"https://n8n.io/workflows/20108","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:06:49.750Z","run_id":"run-1793714809749","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"loan-intake","name":"Loan Intake","office_task":"Turn every lead and client call into the one client file in our CRM, chase each missing figure or document as an owned task, and hold the file for a broker to approve.","verticals":["accounting-bookkeeping"],"standards":["advice-file"],"systems_of_record":["the broker's CRM that issues the client file id (the client file, its deal record and its tasks)","the network's dated lender-panel library, where a named person accepts each clause"],"consumes":[{"event":"call.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the interview's consent record, transcript and verbatim lines with their spans, filed on the client's one file in the broker CRM (its deal record, carried as job_id) with the resolved fields and the computed gaps, by that file's own id","readback":"the CRM returns the file's external id, and reading the client's file by id returns that id with the interview id appended; a read by interview id lists the verbatim, the file, the tasks and the coaching together. A null external id is a failed interview and raises an exception"},{"event":"exception.raised","write":"a task on the client file naming the person who owns it: one per blocking gap (a missing figure or document) with a due date, raised once; a refused recording notice for a person to take notes; a lender-policy question declined to the Head of Credit; a breach_suspect coaching finding for the compliance officer","readback":"the CRM returns a task id, and reading the file's tasks back returns it with the field key, the owner and the due date; a gap that already has a task is not raised again"}],"exceptions":{"raises":["advice.consent_not_recorded","advice.file_write_failed","advice.file_readback_failed","advice.blocking_gap","advice.policy_declined","advice.breach_suspect"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["file.external_id","file.interview_ids","file.missing","interview.consent","task.owner","task.due","draft.queue"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/loan-intake","bot":"https://x.ai/bot/Q3WQrf9zEzmGCyWSF2BSL"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Qualify mortgage leads and collect documents with Gemini, Gmail, Drive, Telegram, and Supabase","original_author":"Shashwat Singh","share_link":"https://n8n.io/workflows/13387","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"advice-file","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:54:12.845Z","run_id":"run-1793714052844","green":10,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"lodgement-watch","name":"Lodgement Watch","office_task":"Keep every client's BAS, IAS and payroll tax due dates worked out from the ATO and state rules, file the lodgement receipts, and put anything late in front of a named person.","verticals":["accounting-bookkeeping"],"standards":["compliance-calendar"],"systems_of_record":["the practice's obligation register (its client lodgement calendar, dated rule set and the document store lodgement receipts are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"a lodgement receipt attached to an email, filed as evidence of completion on the client obligation it names by obligation id; an email with no obligation id is never matched on a client name and is raised instead","readback":"the obligation is read back by its id and must return the same evidence reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and lodgement.evidence_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the client obligation naming the person who owns it: an unknown anchor, no rule in force, a past date no retained rule version explains, a 'lodged' email with no receipt, a client's dated refusal to supply records, a breach, a drafted records request awaiting a named release, a release with no named person, silence past the next chase date, or an email with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["lodgement.anchor_unknown","lodgement.no_rule_in_force","lodgement.history_unexplained","lodgement.completion_without_evidence","lodgement.evidence_not_read_back","lodgement.refusal_recorded","lodgement.breached","lodgement.request_drafted_awaiting_release","lodgement.release_refused","lodgement.chase_due","lodgement.email_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/lodgement-watch","bot":"https://x.ai/bot/k0r_VYkKOQNs2WPWRBSJr"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:05:52.141Z","run_id":"run-1793714752139","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"manual-desk","name":"Manual Desk","office_task":"When a tech on site asks about the unit on their job, show them the page of its install or service manual that covers it, with page and revision, or say we hold no manual for it.","verticals":["trades-building"],"standards":["knowledge-base"],"systems_of_record":["the job system that issues the job_id and records the unit make and model on each job (ServiceM8, Simpro, Tradify, Fergus)","the shared drive that holds the manufacturers' install and service manuals, commissioning videos and the office's procedures and issues the document_id (Google Drive or SharePoint), left where it is","the register on that tenant (one Sheet or SharePoint list: a row per source, owner a person, kind, revision and checksum)","the task list the office runs (Google Tasks, Planner or a sheet), which issues the exception_id for each open question"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"job.created","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the manual page sheet for the job, written as one Doc into Jobs/<job_id>/ after a tech's question: the question, and for each page given the register id, the manufacturer's revision and the locator that opens the manual at that page, or the fixed sentence that no manual for the unit is held; nothing composed from the manuals","readback":"the drive returns the sheet's file id as the report_id, and reading that id back returns the Doc with the job_id and the register ids it lists; no id back means no sheet was published and the run raises an exception to the register keeper"},{"event":"exception.raised","write":"a task on the office's task list naming the person who owns it, with a due date: a manual revision the office expects and the drive does not hold, a manual for a unit on a job that is not held at all, a manual whose only owner is a team, two copies of one manual waiting for a person to pick the one the office keeps, a customer's note waiting for someone to set who may read it and for how long, a recheck of a manual held only on the manufacturer's portal, or a registered file gone from the drive","readback":"the task list returns an exception_id, and reading that id back returns what is expected, the owner and the due date; no id back means nothing was raised, and the file stays off the index"}],"exceptions":{"raises":["kb.expected_edition_missing","kb.owner_not_a_person","kb.canonical_copy_undecided","kb.customer_access_undecided","kb.issuer_recheck_due","kb.source_gone_from_drive"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["register.id","register.kind","register.owner","register.location","register.edition","register.checksum","register.retrieved_at","register.status","register.duplicate_of","register.access_list","register.expires_on","register.superseded_checksums"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/manual-desk","bot":"https://x.ai/bot/e9mNYP_tJC47L40WMyIn7"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-base","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T13:01:25.750Z","run_id":"run-1793797285748","green":11,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"margin-watch","name":"Margin Watch","office_task":"Every Friday, list the jobs where what we have actually spent on labour and materials is eating the margin we quoted, name the lines that caused it, and leave what to do about each job to the owner.","verticals":["trades-building"],"standards":["recurring-report"],"systems_of_record":["the job system (ServiceM8, Simpro, Tradify, Fergus and the like): the accepted quote's labour and material lines, time booked to the job and the job's margin to date, against each job_id","the ledger (Xero or MYOB): supplier bills coded to the job","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's job margin report per audience (owner: every quoted and actual line and the margin per job; external accountant: margins only), each figure carrying its definition id, source and as-of time or published as unavailable with the reason, and commentary naming each job whose actual labour or materials line is above its quoted line; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a job system or ledger read that failed, a job line with no definition or two, a margin threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/margin-watch","bot":"https://x.ai/bot/sa2_BlEPhMjh407JVOHEd"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:26:01.448Z","run_id":"run-1793795161447","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"matter-billing","name":"Matter Billing","office_task":"When our practice system marks an appearance or signed draft done, draft its invoice in Xero at our rate card, or park it with a reason, and hold it for the solicitor's release.","verticals":["b2b-office"],"standards":["invoice-out"],"systems_of_record":["the firm's practice management system, which issues the id of each billable task on a matter (carried as job_id)","Xero"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft tax invoice in Xero per completed billable task, referenced to the task id (and the stage under a staged costs agreement), every line a line on the task and every rate read from the firm's rate card at draft time, with any signed variation attached as evidence. A second completion event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<task id>, and that id is stamped on the task as seam.invoice_id. No id back is not a write: it raises invoice.write_failed."},{"event":"invoice.sent","write":"The invoice leaves only after a release that names the responsible solicitor, or names the rule they set and shows the total is under its threshold; the release and the send time are recorded against the task.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the task's record read by its id shows seam.release (a person or a rule) and the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked invoice as an exception on the task: the reason from the standard's fixed list (a code the rate card does not hold, a variation with no signed acceptance, a failed write, or a draft over the release threshold), with exception_owner set to the person the firm named for billing.","readback":"The task read by its id shows the open exception with its exception_owner, and the parked draft in Xero carries no rate for the unpriced line; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.book_edition","seam.status","seam.release","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/matter-billing","bot":"https://x.ai/bot/AcVkv1IqlCZ8IZ2j4R4L1"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Fee Note and Invoice Clerk","original_author":"Suyash Verma","share_link":"https://x.ai/bot/Q84GaJdxDWIKrC6CN8vXt","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T12:18:47.235Z","run_id":"run-1793708327231","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:18:47.684Z","run_id":"run-1793708327683","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"measure-quote","name":"Measure Quote","office_task":"When the site measure is on the job (rooms, square metres, lineal metres, counts), draft the quote at our own price-list rates, or park it with a reason, and leave it for us to send.","verticals":["trades-building"],"standards":["quote-out"],"systems_of_record":["ServiceM8","Simpro","Xero (Items as the price list, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the job it was drafted from, ex GST. One line per room and item from the site measure: the catalogue id from the business's own price list, the unit that item is sold by (m2, lm or each), the measured quantity, and that item's rate as read at draft time. The amount is quantity times rate and nothing else: no waste allowance, rounding or unit conversion the price list does not carry. It is left in draft, editable, for the person who owns quotes; this node has no way to send it.","readback":"The quote is read back by the id the system returned (ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote, or a job sent back for its measure, as an exception on the job: the park reason from the standard's fixed list (or measure_missing, measure_unit_mismatch), the lines that did price with their catalogue ids and rooms, the work that did not, no total, and exception_owner set to the person the business named for quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.measure_missing","quote.measure_unit_mismatch","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/measure-quote","bot":"https://x.ai/bot/8PXsXR_y2z8LVnRiDRmyO"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:33:18.442Z","run_id":"run-1793795598440","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:33:53.703Z","run_id":"run-1793795633699","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"meeting-notes","name":"Meeting Notes","office_task":"After each client meeting, file what the client told us (facts, preferences, standing instructions) on their record as suggestions, for a partner to accept or reject.","verticals":["accounting-bookkeeping"],"standards":["client-memory"],"systems_of_record":["the practice management system that issues the job_id and the client id on it (for example Xero Practice Manager or FYI)","the practice's client memory list on its own Microsoft 365 or Google Workspace, with an approvals list only approvers can write to"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"each fact, preference or standing instruction heard in the meeting note, filed as a proposed item on the client's memory list against the job_id the note names, with the note's message_id as its source and stated or inferred (naming the model) as said","readback":"the memory list returns an item id; reading that id back returns the client_id from the job, the job_id, source.ref equal to the message_id and status proposed. No id back, or any other status, means nothing was filed: an exception is raised and the run stops"},{"event":"report.published","write":"the monthly review: every approved standing instruction once, with its version, when it was last followed, and an ok, not_applied or contradicted flag with its evidence. It changes nothing on the list","readback":"the review list returns a report_id; reading it back returns the lines published. No id back raises memory.review_not_published"},{"event":"exception.raised","write":"an exception naming the practice manager: a decision from someone not on the approvers list or not from the approval surface, a note with no job id, an unreadable job, or a write that did not read back","readback":"the exception desk returns an exception_id, and reading it back returns the job_id or decision id, the reason and the exception_owner"}],"exceptions":{"raises":["unauthorised_approver","memory.no_job_id","memory.job_unreadable","memory.write_not_read_back","memory.decision_on_non_proposal","memory.superseded_item_not_in_force","memory.review_not_published"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["memory.client_id","memory.job_id","memory.source","memory.status","memory.version","memory.supersedes","memory.superseded_by","memory.approved_by","memory.approved_at","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/meeting-notes","bot":"https://x.ai/bot/SPfLzBHMu92JBfqblCd9P"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"client-memory","edition":"2026-10-29","environment":"stub","ran_at":"2026-11-04T12:00:31.404Z","run_id":"run-1793793631403","green":5,"red":0,"with_us":1,"evidence_required":1,"total":8}]},{"slug":"month-pack","name":"Month Pack","office_task":"Each month, put every client's management pack (profit and loss, balance sheet, cash, key ratios) in their folder, every figure sourced and as-of, for the partner to send.","verticals":["accounting-bookkeeping"],"standards":["recurring-report"],"systems_of_record":["each client's ledger (Xero or MYOB): profit and loss, balance sheet and the executive summary ratios for the month","each client's bank statement: the operating account's closing balance at month end","the practice's client folder the pack is published into (SharePoint or Google Drive), which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"report.published","write":"one view of the client's monthly pack per audience (reviewing partner, client's owner, client's lender), written into the practice's folder for that client, each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason. Sending it outside the practice stays with the partner","readback":"reading the client's month back from the folder returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a pack that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the client, the month, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/month-pack","bot":"https://x.ai/bot/mOysfEj0qciyROJ0g35N-"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:50:24.890Z","run_id":"run-1793793024888","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"notice-check","name":"Notice Check","office_task":"Before a breach notice for unpaid rent goes to a tenant, check it against the ledger and the state's dated rule, hold it for a named person with its dates, and check it again when they release it.","verticals":["property"],"standards":["rent-arrears"],"systems_of_record":["the property management system that issues the tenancy_id (PropertyMe, Console Cloud or similar): its tenancy ledger, dated rule store, notice drafts and message log"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"rent.overdue","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the day's arrears short list, written into the property system's task view: one row per tenancy_id with its paid-to date, days past it, balance, triage outcome, the dated rule version applied and the date the state threshold is met","readback":"the property system returns a report_id for the list, and reading that id back returns the same tenancy_ids with their paid-to dates and rule versions; no id back means the list was not published and an exception is raised"},{"event":"exception.raised","write":"an exception on the tenancy naming the person who owns it: a drafted notice awaiting a named release with its paid-to date, rule version, threshold date and earliest remedy date; a notice that failed its check at draft or release; a stop condition caught before a message; a failed or stale ledger read; a fee held for a person; or an unanswered sequence","readback":"the exception desk returns an exception_id, and reading that id back returns the tenancy_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["rent.ledger_read_failed","rent.ledger_stale","rent.no_rule_for_state","rent.notice_drafted_awaiting_release","rent.notice_check_failed","rent.payment_received","rent.hardship_on_file","rent.arrangement_in_place","rent.on_formal_path","rent.fee_held_for_person","rent.sequence_unanswered","rent.send_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.tenancy_id","seam.triage_outcome","seam.stop_check","seam.rule_version","seam.notice_status","seam.remedy_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/notice-check","bot":"https://x.ai/bot/S2DpwyEQHQJz137xaTK5L"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rent-arrears","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:06:05.383Z","run_id":"run-1793714765381","green":5,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"nudge-desk","name":"Nudge Desk","office_task":"Every weekday, find our overdue invoices, chase each customer once in the right order, never past the do-not-chase list or the gate, and turn a reply with a date into a promise.","verticals":["accounting-bookkeeping"],"standards":["debtor-chasing"],"systems_of_record":["QuickBooks Online (the ledger that issues the invoice_id)","Gmail (the reminder and the reply, by message_id)","the exception desk the business runs (a sheet or a task list that issues the exception_id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"poll"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"a dated promise to pay, from the debtor's reply, written as a note on the invoice in the ledger: the date, an amount that may be empty, the method if offered, and when it was captured; it sits beside any open dispute and never closes it","readback":"GET /v3/company/{realmId}/invoice/{invoice_id} returns the invoice carrying the promise date and capture time; no promise on the read-back means it was not written, and a promise_not_recorded exception is raised"},{"event":"exception.raised","write":"an exception on the customer's invoices naming the person who owns it: an open dispute, a relationship-sized balance, a reply with no date, a promise that did not read back, or an override refused for want of a named approver","readback":"the exception desk returns an exception_id, and reading that id back returns the invoice_ids, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispute_open","relationship_account","reply_without_date","promise_not_recorded","override_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.chase_bucket","seam.gate_reason","seam.promise_date","seam.promise_captured_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/nudge-desk","bot":"https://x.ai/bot/_OXTCnxwXpjsaKNX9SpaO"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Chase overdue QuickBooks invoices with Claude, Gmail, Slack and Google Sheets","original_author":"Amplence","share_link":"https://n8n.io/workflows/20684","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T12:30:34.243Z","run_id":"run-1793709034242","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:30:34.689Z","run_id":"run-1793709034687","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"open-home-desk","name":"Open Home Desk","office_task":"After each open home, follow up everyone who said yes at sign-in with a message I approved, sort their replies, and draft the vendor's report from what buyers actually said.","verticals":["property"],"standards":["open-home-feedback"],"systems_of_record":["the sign-in register the agency CRM exports, or the typed-up paper sheet, which issues the document_id","the agent's mail system, which holds the approved drafts, the sends and the replies (message_id)","the report store the agent and the vendor open, which issues the report_id per version"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the week's vendor report for one listing, drafted to the agent as a new version, and sent to the vendor only once the agent approved that version","readback":"the report store returns a version for the listing, and reading the listing's latest report back returns that version, its counts and verbatim comments, and whether it reached the vendor; no version back means nothing was written"},{"event":"exception.raised","write":"an exception naming the agent who owns it: an incomplete register row, no consent at sign-in, the same attendee at two opens, an offer, a complaint, or a reply that fits no class","readback":"the exception desk returns an exception_id, and reading that id back returns the register row or reply it is about, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["open_home.incomplete_row","open_home.no_consent","open_home.duplicate_attendee","open_home.offer","open_home.complaint","open_home.unclear_reply"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.document_id","seam.listing_id","seam.draft_status","seam.approved_by","seam.consent_withdrawn","seam.reply_classes","seam.report_version","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/open-home-desk","bot":"https://x.ai/bot/QhRWkshKIf4cxnCkYJmQl"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Mary (Realtor Assistant)","original_author":"Rick","share_link":"https://x.ai/bot/eQ4tLI6SMBanz6rovfhyV","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"open-home-feedback","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T11:05:46.402Z","run_id":"run-1793703946401","green":9,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"ops-map","name":"Ops Map","office_task":"Keep one accepted map of how the business runs, step by step, from its own procedures, and name a person when two procedures disagree or one is replaced.","verticals":["b2b-office"],"standards":["knowledge-graph"],"systems_of_record":["the document store that issues the document_id for each procedure and edition (SharePoint or Drive)","Xero, for the contact id of each supplier the procedures name","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the change delta for a replaced procedure, written into the ops map store: the source's document_id, its old and new checksum, and the computed list of every step node built from it, which wait for a named person to accept the delta","readback":"the store returns the delta's report_id, and reading that id back returns the document_id, both checksums and the affected node ids; no id back means no delta was written and the affected nodes stay out of live"},{"event":"exception.raised","write":"an exception naming the person who owns the map: two live procedures answering one step differently, a source that is not an instrument, a refused acceptance, a SAME_AS a person has not decided, or a delta awaiting acceptance","readback":"the exception desk returns an exception_id, and reading that id back returns the node or document ids, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["graph.conflict_open","change.delta_awaiting_person","source.not_an_instrument","source.customer_material_held","source.acceptance_refused","extract.type_not_in_contract","extract.source_not_accepted","node.acceptance_refused","identity.same_as_needed","claim.promotion_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["node.queue","node.accepted_by","node.provenance","source.checksum","delta.affected_node_ids","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/ops-map","bot":"https://x.ai/bot/6LLgjQaEP8e7ruECVXw9M"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"OS: Ontology Stack","original_author":"Damiano Redemagni","share_link":"https://x.ai/bot/9Uh8RaBqp6PrcOcZjMHbD","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"knowledge-graph","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:45:55.742Z","run_id":"run-1793713555741","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"order-release","name":"Order Release","office_task":"Turn each job's material list into one purchase order per supplier, and hold any order over the spending limit, or to an unapproved supplier, until a named person releases it.","verticals":["b2b-office","trades-building"],"standards":["material-order"],"systems_of_record":["the job system that issues the job_id and holds its material list (ServiceM8, Simpro, Tradify, Fergus or a job sheet)","the supplier portal or job-system purchasing that issues each order's external id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"order.sent","write":"one purchase order per job and supplier, priced from that supplier's catalogue, released by the release rule under the limit to an approved supplier or by a named person otherwise, and sent against the job","readback":"the ordering system returns the order's external id, and reading the job's orders back by job_id returns that id with the supplier, the catalogue edition and who or which rule released it; no id back is a failed write, raised to a person, and nothing is sent"},{"event":"delivery.recorded","write":"the supplier's docket matched to its sent order by order id, line by line, with the quantity received and a reason (short, damaged, substituted) on any line that differs","readback":"reading the job's record by job_id returns the delivery on that order with one line per ordered line; a docket that names no sent order is never recorded and is raised instead"},{"event":"exception.raised","write":"an exception on the order naming the person who owns it: an order waiting for a named release (over the limit, or to a supplier not on the approved list), a code no catalogue holds, an order write with no id back, a docket with no sent order, and every delivery variance (short, over, wrong item, changed price, unaccepted substitution)","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the order id, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["material.release_needed","material.not_in_catalogue","material.write_failed","material.no_order_for_docket","material.short","material.over","material.wrong_item","material.price_changed","material.substitution_unaccepted"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.order_external_id","seam.supplier_id","seam.catalogue_edition","seam.released_by","seam.order_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/order-release","bot":"https://x.ai/bot/8tmAkZ5tOyH8thyK7Fq0B"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"material-order","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:00:50.873Z","run_id":"run-1793714450871","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"outgoings-book","name":"Outgoings Book","office_task":"File each managed property's council rates, water, strata levy and power bills against that property by the account number printed on them, and list what falls due when for a person to pay.","verticals":["property"],"standards":["document-filing"],"systems_of_record":["the property management system that issues each property record and holds its account numbers (rates assessment, water account, strata plan and lot, electricity or gas NMI), e.g. PropertyMe or Console Cloud","the agency's document store, where each original is kept unaltered"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"evidence.filed","write":"the original rates, water, strata levy or power bill attached unaltered to the one property whose account register holds the number printed on it, with the amount and due date typed into that bill period's blank fields only, and the tenancy_id carried where the property is let","readback":"the property management system returns the attachment id on the property; reading the property back by its id returns the attachment, its fingerprint and the entered fields; no id back means it was not filed and an exception is raised"},{"event":"report.published","write":"the daily close: arrived, filed, on the list and duplicates, the open exceptions oldest first, and every filed bill falling due from today with its property, amount and due date, soonest first, published on quiet days too; nothing on it is paid","readback":"the system the close is published into returns a report_id, and reading it back returns the day, counts that add up and the due list"},{"event":"exception.raised","write":"one exception on the outgoings list for a bill that cannot be filed with confidence, with its closed-list reason, the field, both values where the bill disagrees with what the property already holds, and the named owner","readback":"the exception desk returns an exception_id, and reading it back returns the arrival, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["filing.no_id","filing.two_matches","filing.no_match","filing.unreadable_field","filing.does_not_add_up","filing.conflicts_with_record","filing.unknown_kind"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.arrival_id","seam.file_hash","seam.property_id","seam.tenancy_id","seam.bill_period","seam.filing_state","seam.exception_owner","seam.cleared_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/outgoings-book","bot":"https://x.ai/bot/evFzeEaVy4iYDAmxxMtRq"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"document-filing","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:06:37.324Z","run_id":"run-1793793997323","green":10,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"outgoings-desk","name":"Outgoings Desk","office_task":"Each year, when a commercial tenant's outgoings are reconciled, work out their share from the lease, draft the recovery invoice in Xero, park any unclear share, and hold it for the manager.","verticals":["property"],"standards":["invoice-out"],"systems_of_record":["the property management system that holds each commercial lease, its recoverable outgoings and the tenant's share, and issues one outgoings reconciliation record per tenancy per outgoings year (carried as job_id, with the tenancy_id on it), which the property manager marks final","the building's outgoings schedule for the year, actual and budget per category, kept as the agency's Xero items for that building","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft recovery invoice in Xero per tenancy per outgoings year, referenced job:<reconciliation id>, one line per outgoings category the reconciliation carries at the tenant's lease share of that year's actual, less the same share of the budget the tenant paid instalments on, every figure read from the year's outgoings schedule at draft time and the signed deed of variation attached for any share changed mid-year. Xero applies GST from the items. A second final event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<reconciliation id>, and that id is stamped on the reconciliation as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The recovery invoice leaves only after the property manager releases it by name, or under a rule and threshold they wrote down (none by default); the release and the send time are recorded against the reconciliation. The bot never approves or emails in Xero itself.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the tenant's contact, and the reconciliation read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting recovery as an exception on the reconciliation: the reason from the standard's list (not_in_pricebook for a category the year's schedule does not hold or a share the lease does not record, unsigned_variation, write_failed), over_threshold for a draft waiting on the manager, or credit_due when instalments already cover the share, with the reconciliation id, the invoice id, the categories left unbilled and exception_owner set to the property manager named for outgoings.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold","invoice.credit_due"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/outgoings-desk","bot":"https://x.ai/bot/ENjTEjyJurow_WTQdNgzl"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T12:06:31.733Z","run_id":"run-1793793991731","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:08:16.690Z","run_id":"run-1793794096688","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"owing-today","name":"Owing Today","office_task":"Every morning, show me who owes us money, biggest first, with a polite or firmer reminder already written for each one, and I send them.","verticals":["trades-building"],"standards":["debtor-chasing"],"systems_of_record":["Xero","MYOB","ServiceM8","the exception desk the business runs"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"payment.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"A dated promise to pay, taken from a debtor's reply on a reminder thread that carries the invoice id: the date, the amount or none, and when it was captured, written onto the invoice in the ledger. That date becomes the customer's next follow-up, and no reminder is queued for them before it. It never clears a logged dispute.","readback":"The invoice is read back by its id (Xero GET /api.xro/2.0/Invoices/{InvoiceID}/History, MYOB GET /accountright/{company_file_id}/Sale/Invoice/{UID}) and must show the promise with its date. No promise on the read-back is not a write: it raises debtor.promise_write_failed."},{"event":"exception.raised","write":"An exception naming exception_owner, the person the business set for receivables: today's queue of reminder drafts for that person to send (customer, invoice ids, total, tone and text), a relationship-sized balance or open dispute lifted out of the run, hardship or a dispute named in a reply, a reply with no date, a refused override, or a promise that did not write.","readback":"The exception desk returns an exception_id, and reading that id back returns the customer, the invoice ids, the reason and the exception_owner; no id back means nothing was raised and the run stops."}],"exceptions":{"raises":["debtor.queue_ready","debtor.relationship_account","debtor.dispute_open","debtor.hardship","debtor.dispute_named","debtor.reply_without_date","debtor.reply_unmatched","debtor.override_refused","debtor.promise_write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.job_id","seam.chase_bucket","seam.reminder_tone","seam.promise_date","seam.next_touch","seam.gate_hold_reason","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/owing-today","bot":"https://x.ai/bot/RXCt5I3jK1p2kNPSJSchd"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Invoice Chaser","original_author":"Mark G","share_link":"https://x.ai/bot/90sITfSWBOYbcnx6uyfun","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T13:19:35.372Z","run_id":"run-1793711975370","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:19:35.848Z","run_id":"run-1793711975846","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"parts-check","name":"Parts Check","office_task":"The afternoon before, check every part tomorrow's jobs need against the van and shelf counts, flag stale counts, and raise shortfalls for ordering, never substituting.","verticals":["trades-building"],"standards":["parts-ready"],"systems_of_record":["the job system that issues the job_id and holds tomorrow's dispatched board, each job's accepted quote lines and materials (ServiceM8, Simpro, AroFlo, Fergus, or a Tradify export into the sheet)","the stock sheet or job-system stock locations holding each van's count with the time it was counted, and the shelf","Material Order's path (the purchasing step that prices, holds and issues the purchase order id)","the exception desk the business runs (a task list or a sheet)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the parts result for tomorrow's date, published by the cut-off every run, quiet or not: every job on the board by job_id with each part on_van, pick_from_shelf (reserved, with its location), ordered (with the purchase order id Material Order returned) or flagged with its reason; plus one message per tech and job carrying the job_id","readback":"the report store returns a report_id for the date, republished in place on a re-run; each Result row is keyed on (for_date, job_id, catalogue_code) on the seam mirror and reads back by job_id; no report_id back means the run did not publish, and the next scheduled run publishes again"},{"event":"exception.raised","write":"a flag on the job naming the person who owns it, one reason from the closed list: needs_list_unknown, stock_unknown (van count older than the limit), lead_time_after_job, not_in_stock or order_failed; an equivalent part in stock is named only here, as a suggestion","readback":"the exception desk returns an exception_id, stored on the line's Result; reading that id back returns the job_id, the part, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["parts.needs_list_unknown","parts.stock_unknown","parts.lead_time_after_job","parts.not_in_stock","parts.order_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.job_id","seam.for_date","seam.catalogue_code","seam.status","seam.reservation_id","seam.order_external_id","seam.message_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/parts-check","bot":"https://x.ai/bot/RArOlS23ok2s25Jl8KlUl"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"parts-ready","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:54:15.500Z","run_id":"run-1793796855499","green":7,"red":0,"with_us":1,"evidence_required":0,"total":10}]},{"slug":"parts-quote","name":"Parts Quote","office_task":"When a customer's spare-parts enquiry is logged as a job, draft its quote from our own parts price list, or park it with a reason, and leave it for us to send.","verticals":["b2b-office"],"standards":["quote-out"],"systems_of_record":["Xero (Items as the parts price list, Quotes)","ServiceM8","Simpro (parts only)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the job the parts enquiry was logged as, every line carrying the part's catalogue id and its rate as read from the price list at draft time, ex GST. It is left in draft for the person who owns parts quotes; this node has no way to send it.","readback":"The quote is read back by the id the system returned (Xero GET /api.xro/2.0/Quotes/{QuoteID}, ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote as an exception on the job: the park reason from the standard's fixed list, the parts that did price with their catalogue ids, the parts that did not, no total, and exception_owner set to the person the business named for parts quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/parts-quote","bot":"https://x.ai/bot/Geo7eiR6ITmacIwXtQHP6"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Generate & Send Spare Parts Price Quotes with Gmail, Sheets and Gemini AI","original_author":"berke","share_link":"https://n8n.io/workflows/5492","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:04:19.029Z","run_id":"run-1793711059027","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:03:35.286Z","run_id":"run-1793711015285","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"payment-watch","name":"Payment Watch","office_task":"Keep track of what each client owes, check the ledger and the inbox for a payment before every reminder, and draft one calm reminder per client for me to say yes to.","verticals":["b2b-office"],"standards":["debtor-chasing"],"systems_of_record":["Xero","MYOB","Gmail (the reminder threads, each carrying its invoice id)","the exception desk the business runs"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"schedule"},{"event":"payment.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"A dated promise to pay from a client's reply on a reminder thread, read by the invoice id the thread carries: the date, the amount or none, and when it was captured, written onto the invoice in the ledger. The promised date becomes that client's next touch. It never clears a logged dispute.","readback":"The invoice is read back by its id (Xero GET /api.xro/2.0/Invoices/{InvoiceID}/History, MYOB GET /accountright/{company_file_id}/Sale/Invoice/{UID}) and must show the promise with its date. No promise on the read-back is not a write: it raises debtor.promise_write_failed."},{"event":"exception.raised","write":"An exception naming exception_owner, the person who owns receivables: a drafted reminder waiting for that person's yes (the invoice ids, the bucket and the text), a payment the client says they made that the ledger has not applied, a relationship-sized balance or an open dispute lifted out of the run, hardship or a dispute named in a reply, a reply with no date, or a promise that did not write.","readback":"The exception desk returns an exception_id, and reading that id back returns the client, the invoice ids, the reason and the exception_owner; no id back means nothing was raised and the run stops."}],"exceptions":{"raises":["debtor.reminder_ready_for_release","debtor.payment_claimed_unapplied","debtor.relationship_account","debtor.dispute_open","debtor.dispute_named","debtor.hardship","debtor.reply_without_date","debtor.reply_unmatched","debtor.reply_needs_person","debtor.promise_write_failed","debtor.override_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.chase_bucket","seam.payment_check","seam.promise_date","seam.next_touch","seam.gate_hold_reason","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/payment-watch","bot":"https://x.ai/bot/EkTpsX1p1gz6GnnxzUC5j"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Freelance Invoice Chaser","original_author":"Cristopher Guido","share_link":"https://x.ai/bot/6XWo6nhodL0bZnP1MnRz5","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T13:19:46.724Z","run_id":"run-1793711986723","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:19:47.076Z","run_id":"run-1793711987075","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"permit-answers","name":"Permit Answers","office_task":"Answer the office's permit, inspection, zoning and building code questions from the council and state rules we hold, citing the clause, or hand them to a named person.","verticals":["trades-building"],"standards":["cited-answer"],"systems_of_record":["the mail system that issues the message_id the question arrived on (Gmail, Outlook)","the business's own clause library of council planning schemes, building regulations and inspection schedules, with its answer register","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an exception on the question's message naming the person who owns it: no jurisdiction given, nothing in the library covers it, a compliance or certificate question for the licensed certifier, a source conflict between two live instruments, or an instrument that moved and is waiting for a named person to accept the change (listing every stored answer that relied on it)","readback":"the exception desk returns an exception_id, and reading that id back returns the message_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cited.no_jurisdiction","cited.not_in_library","cited.certificate_question","cited.source_conflict","cited.change_pending","cited.acceptance_without_person"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["answer.message_id","answer.queue","answer.policy","answer.source_card_ids","source_card.edition","source_card.jurisdiction","source_card.effective_from","change_delta.accepted_by","change_delta.accepted_on","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/permit-answers","bot":"https://x.ai/bot/uK6WNVd93Y2oB-iJDaOtD"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"CITY HALL","original_author":"John Christian","share_link":"https://x.ai/bot/j8YX4im_bz4a5L75BYhWe","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"cited-answer","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:04:50.429Z","run_id":"run-1793703890427","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"plant-watch","name":"Plant Watch","office_task":"Remind us when each piece of our plant and equipment is due its inspection, draft the booking for a person to release, and count it done only when the completed check is filed on the item.","verticals":["trades-building"],"standards":["compliance-calendar"],"systems_of_record":["the business's plant register (each item of plant and equipment with its state, the date its last completed check was filed, the dated inspection rule set per state, and the document store inspection reports and test and tag records are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"the item's inspection flagged due on its plant record by asset id, with the due date derived from the rule version in force for its state, and, where the rule names an outside inspector or tester, the booking request drafted and held unsent for a named person to release","readback":"the obligation is read back by its id and must return the derived due date, the rule version that produced it and the drafted booking still unreleased; a release with no named person is refused and plant.release_refused is raised"},{"event":"evidence.filed","write":"the completed inspection report or test and tag record that arrived in the watched plant folder, filed as evidence on the item's obligation named by obligation id; a document with no obligation id is never matched on an item name or tag and is raised instead","readback":"the obligation is read back by its id and must return the same document reference and a completion date; if it does not, nothing was filed and plant.report_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the item's obligation naming the person who owns it: an inspection coming due, an item overdue that should not be used until its check is filed, a done with no report, no date of last check on the record, no rule for that check in that state, a past due date no retained rule version explains, a dated decision to park the item instead, a drafted booking awaiting release, a release with no named person, silence past the next chase date, or a document with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["plant.inspection_due","plant.inspection_overdue","plant.done_without_report","plant.report_not_read_back","plant.report_unmatched","plant.last_check_unknown","plant.no_rule_in_force","plant.history_unexplained","plant.inspection_declined","plant.booking_drafted_awaiting_release","plant.release_refused","plant.chase_due"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/plant-watch","bot":"https://x.ai/bot/ExcfPcfmyPduPLnNHIhWI"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:42:29.370Z","run_id":"run-1793796149368","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"po-match","name":"PO Match","office_task":"Match each emailed supplier invoice against its purchase order and what was received, leave clean ones as draft bills for a person, and raise every mismatch in dollars.","verticals":["accounting-bookkeeping"],"standards":["invoice-check"],"systems_of_record":["Xero (the ledger that issues the bill_id and holds the purchase orders)","Gmail (the inbox the invoice arrives in, which issues the message_id)","the receipt record against each purchase order (delivery dockets or quantities marked complete)","the document store where written variation approvals live"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"the supplier bill in Xero, kept as a DRAFT bill (ACCPAY) against the purchase order number printed on the invoice, with the four check results, the receipt it matched and the source PDF in its history; nothing is approved or paid","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns Type ACCPAY, Status DRAFT, the PO reference and the history note; no InvoiceID back means it was not written, an exception is raised and the run stops"},{"event":"exception.raised","write":"an exception on the bill naming the person who owns it: the check that failed and the checks that never ran, the difference in dollars, the cumulative position, the source document from the email, and its queue (needs a decision, waiting on the supplier or a receipt, or blocked: no purchase order, or scope with no written approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id or message_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["invoice.no_source_document","invoice.no_purchase_order","invoice.rate_mismatch","invoice.not_received","invoice.quantity_over_received","invoice.unapproved_scope","invoice.contract_sum_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.message_id","seam.order_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/po-match","bot":"https://x.ai/bot/uqaabT4bLgCJ9np8gXr5Z"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Automate 3-way invoice matching from Gmail to Xero with Slack and Teams alerts","original_author":"Jitesh Dugar","share_link":"https://n8n.io/workflows/12662","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:33:24.124Z","run_id":"run-1793709204123","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"policy-desk","name":"Policy Desk","office_task":"Answer staff and customer support, HR and compliance questions only from the policy pack we have approved, citing the clause and its edition, or hand the question to a named person.","verticals":["b2b-office"],"standards":["cited-answer"],"systems_of_record":["the mail system that issues the message_id the question arrived on and the reply went out on (Gmail, Outlook)","the business's own approved policy pack (staff handbook, leave, refunds and returns, privacy, complaints) held as a clause library with editions, state or territory and effective dates, and its answer register","the exception desk the business runs, which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"answer.sent","write":"a stored answer with its source cards (policy, clause, edition, state or territory, effective date), sent as a reply on the question's thread only after a named person released it on the answer register","readback":"the mail system returns the reply's message_id, and reading that id back returns the thread it replies in and the answer register id; no id back means it was not sent, and cited.send_unconfirmed is raised to the named owner"},{"event":"exception.raised","write":"an exception on the question's message naming the person who owns it: no state or territory given, nothing in the approved pack covers it, a compliance statement, legal reading or ruling on one case, a source conflict between two live policies, or a policy that moved and waits for a named person to accept it (listing every stored answer that relied on it)","readback":"the exception desk returns an exception_id, and reading that id back returns the message_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["cited.no_jurisdiction","cited.not_in_pack","cited.decision_for_person","cited.source_conflict","cited.change_pending","cited.acceptance_without_person","cited.release_refused","cited.release_without_person","cited.send_unconfirmed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["answer.message_id","answer.queue","answer.policy","answer.source_card_ids","answer.released_by","source_card.edition","source_card.jurisdiction","source_card.effective_from","change_delta.accepted_by","change_delta.accepted_on","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/policy-desk","bot":"https://x.ai/bot/A9WUedwGC_AmDFRUCmfOd"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Claim Cage","original_author":"Andy Mccutcheon","share_link":"https://x.ai/bot/iZv6S7_mFwfpA2veP7mOH","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"cited-answer","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:11:41.218Z","run_id":"run-1793711501216","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"portal-match","name":"Portal Match","office_task":"Each weekday, check every job's status in Simpro against the client's work-order portal by work-order number, show each difference with both values, and fix one only once a person accepts it.","verticals":["trades-building"],"standards":["two-records"],"systems_of_record":["Simpro (the job carries the client's work-order number; owns the job status and the invoiced total)","the client's work-order portal: a real estate agency's maintenance system, a facilities manager or a CMMS (issues the work-order number; owns the attend-by date and the not-to-exceed limit)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the run's work-order report where the service coordinator opens it: the pair contract it ran under, the key it joined on (work_order_no), the owner per field, and the counts matched, within tolerance, mismatched, orphaned and corrected, published every run including the all-clear","readback":"the report store returns a report_id, and reading that id back returns the contract id, the five counts and the published time; no id back means the run did not publish and the owner is told"},{"event":"job.updated","write":"an accepted correction on the Simpro job, one field (the attend-by date or the not-to-exceed limit the portal owns), with the difference id and the name of the person who accepted it, and both original values kept on the difference","readback":"Simpro returns the job id for the write, and reading the job back returns the accepted value on that field; no id back raises portal_match.write_not_read_back and the person keys it by hand"},{"event":"exception.raised","write":"an exception on the work order naming the person who owns it: an open difference with the Simpro value, the portal value and the owning system's value side by side awaiting acceptance, a work order on one side only, a gap over the threshold amount, a run over the mismatch rate, or an accepted correction whose write returned no id","readback":"the exception desk returns an exception_id, and reading that id back returns the work_order_no, the field, both values and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["portal_match.contract_missing","portal_match.owner_missing","portal_match.difference_open","portal_match.orphan","portal_match.over_threshold","portal_match.mismatch_rate","portal_match.write_not_read_back"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.work_order_no","seam.job_id","seam.contract_id","seam.run_id","seam.difference_status","seam.value_simpro","seam.value_portal","seam.owner_value","seam.correction_accepted_by","seam.correction_written_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/portal-match","bot":"https://x.ai/bot/y1w0bFgaFF4U207if4GFU"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"two-records","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:44:53.675Z","run_id":"run-1793796293674","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"practice-desk","name":"Practice Desk","office_task":"Sort everything that lands in the practice inbox onto the right client job or supplier, give each one an owner and a deadline, and hold every reply for the owner to release.","verticals":["accounting-bookkeeping"],"standards":["inbox-triage"],"systems_of_record":["the practice's shared mailbox (Microsoft 365 or Google Workspace), which issues the message_id","the practice manager that issues the client engagement job_id (for example Xero Practice Manager)","the practice's own ledger, for supplier records (for example Xero)"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"job.updated","write":"the client's message and its attachments filed against the client engagement job by the job's own id, never copied into a folder","readback":"reading the record by message_id returns the filing with record_ref job:<job_id>; no record_ref back means it was not filed, and the message stays an unfiled item for a named person"},{"event":"exception.raised","write":"an item on the exception desk naming the person who owns it: a message that matched no record or was classified other, a complaint handed over whole, a client reply drafted and awaiting the owner's release, or an item past its kind's clock escalated to the queue manager","readback":"raising the item returns an item id, and reading the record by message_id returns that item with its kind, record_ref, owner and due date; no item id back means nothing was raised and the run stops"}],"exceptions":{"raises":["inbox.unmatched_record","inbox.classified_other","inbox.complaint_escalated","inbox.no_queue_for_kind","inbox.awaiting_release","inbox.past_clock"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.message_id","seam.kind","seam.record_ref","seam.item_id","seam.owner","seam.due","seam.released_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/practice-desk","bot":"https://x.ai/bot/6MxAr7R7Kqxa6PGOopLME"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Tax Firm OS","original_author":"Amervim Bonano","share_link":"https://x.ai/bot/vMr8x1Lm8mpo-jKBrdxCh","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"inbox-triage","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:04:35.949Z","run_id":"run-1793703875948","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"prestart-desk","name":"Prestart Desk","office_task":"File each daily vehicle pre-start or site safety check on its vehicle or job, and put every failed item in front of the person our table names, with a clock, for them to sort and tick off.","verticals":["trades-building"],"standards":["exception-desk"],"systems_of_record":["the job system (Simpro, or ServiceM8, AroFlo or Fergus) that issues the job_id for a site check and the asset_id for a vehicle kept as plant and equipment, where each completed check is filed as an attachment","the ledger that issues the invoice_id (Xero), for items other surfaces raise against an invoice","the checks mailbox (Gmail or Outlook) the pre-start form app emails each completed check into, which issues the message_id","the exception desk the business runs (a sheet with Raise and Routing tabs, a SharePoint list, or Office Voice's queue), which issues the exception_id"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the completed vehicle or site check, filed as an attachment on the vehicle's asset record or on the job it was done on, by that record's id, keyed on message id + check + prestart-desk so a resent email files once","readback":"the job system returns an attachment id, and reading the asset or job back by its id lists that attachment with the message_id. No id back means it was not filed: a write_failed item goes to the named owner and the check is not counted"},{"event":"exception.raised","write":"One item per vehicle or job and type on the exception desk: failed items land as type other with the vehicle_check_failed or site_check_failed label kept in the reason, each failed item listed, the filed check as evidence, and the owner and the clock from the routing table. A later failing check updates the same item without restarting its clock; a later passing check marks it resolved upstream and it stays open for the owner to close. Raises from other surfaces are typed from the closed list the same way.","readback":"the exception desk returns an exception_id, and reading it back returns the asset_id or job_id (or invoice_id), the type, the reason, the failed items, the due time and the exception_owner. No id back means nothing was raised: the raiser is told and the run stops"},{"event":"report.published","write":"the morning summary, once a day at the set time and also when nothing is open: open items by type and by owner, the overdue ones, the labels that arrived as other, and every vehicle or job with failed check items still open","readback":"the place the office reads it (an email, a Teams channel or a sheet tab) returns a report_id for that day, and a second run that morning reads it back and publishes nothing"}],"exceptions":{"raises":["vehicle_check_failed","site_check_failed","write_failed","parts_shortfall","price_not_in_book","address_unresolved","promise_broken","dispute","hardship","other"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.job_id","seam.check_attachment_id","seam.exception_id","seam.exception_type","seam.exception_owner","seam.due_at","seam.raise_count","seam.resolved_upstream","seam.stop_chase","seam.escalated_at"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/prestart-desk","bot":"https://x.ai/bot/e6mZ5tGxQf3qrxC3PiS9h"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"exception-desk","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:43:09.860Z","run_id":"run-1793796189859","green":6,"red":0,"with_us":1,"evidence_required":0,"total":9}]},{"slug":"price-creep","name":"Price Creep","office_task":"Check every line price on each supplier bill against the price we agreed with that supplier, flag every rise in dollars before anyone approves it, and put it in front of a named person.","verticals":["trades-building"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id and holds the supplier bills)","the agreed supplier price list or trade account schedule of rates, by its reference, in the ledger or the job system (Simpro, ServiceM8 or similar)","the document store holding the bill PDFs and any written approval for an item not on the price list"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"a check note on the supplier bill in the ledger: every line priced against the agreed price list it names, each rise or drop in dollars, the tolerance in force with its date, the other three checks (delivered quantity, items not on the list, order total), and the bill placed in the done-and-reversible list for a named person to approve. Nothing is approved or paid","readback":"reading the bill by its bill_id from the ledger (Xero GET /api.xro/2.0/Invoices/{bill_id}/History, or the MYOB bill's journal memo) returns the check note with the four results and seam.queue = done_reversible; no note back means it was not written and the bill is raised as an exception instead"},{"event":"exception.raised","write":"an exception on the bill naming the person who owns it: the first check that failed and the checks that never ran, the price rise in dollars line by line, the price list it was read against, the bill PDF, and its queue (needs a decision for a price rise, quantity or order-total overrun; waiting on the supplier for a missing bill PDF; or blocked: no price list named, or an item not on the list with no written approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["price.no_bill_document","price.no_price_list","price.rise","price.billed_over_delivered","price.item_not_on_list","price.order_total_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.price_list_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/price-creep","bot":"https://x.ai/bot/fR8wRSMB9Z4AyS0SBdkao"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:46:30.433Z","run_id":"run-1793792790431","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"price-sheet","name":"Price Sheet","office_task":"Before each appraisal, draft the vendor's one-page price evidence from comparable sales chosen by written rules, each sourced, and hold it for the agent to approve.","verticals":["property"],"standards":["price-one-pager"],"systems_of_record":["the agency's listing system, which issues the listing_id for the appraisal and holds the subject property","the recorded sales source the agency already licenses","the document store the approved page and its record of what was shown are published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the one-pager version the agent approved, released to the vendor named on the listing, with an append-only record of what was shown: every comparable with its source, sale date and read date, the range, the agent's estimate apart, the approval and the date","readback":"reading the listing's records back by listing_id and date returns each report_id with its version, released_on and approved_by, matching the approved version comparable for comparable; no id back means nothing was released and an exception is raised"},{"event":"exception.raised","write":"an exception on the listing naming the agent: a quoted figure below the evidence (held, with the sales above it), stale sales (held), too few comparables for a range, or an approval not given","readback":"the exception desk returns an exception_id, and reading that id back returns the listing_id, the version, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["price.underquote_held","price.sales_stale_held","price.too_few_comparables","price.approval_not_given","price.release_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.listing_id","seam.version","seam.report_id","seam.approved_by","seam.released_on","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/price-sheet","bot":"https://x.ai/bot/3801imcQRCPb81bd_Cdxf"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"CMA Specialist Bot","original_author":"Daniel Ledo","share_link":"https://x.ai/bot/SxOQ9jNfWOqHFRi5KVTfa","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"price-one-pager","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T12:49:36.632Z","run_id":"run-1793710176630","green":9,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"progress-desk","name":"Progress Desk","office_task":"Each month, draft every builder contract's progress claim from the schedule, the project manager's site walk and the signed variations, and hold it for the project manager to sign and serve.","verticals":["trades-building"],"standards":["progress-claim-draft"],"systems_of_record":["the builder's contract record (Simpro, Buildxact, a SharePoint list or the claims sheet the builder runs) that holds each contract's sum, schedule of values and what was claimed before, the project manager's site assessment per line per month, the signed variations and the waiver acceptance, and issues the contract record's id (carried as job_id) and the held draft's id (carried as report_id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"One claim draft per contract per month, written into the contract record and keyed contract:<contract id>:<period>: every schedule line with its scheduled value, the percent complete the project manager entered this month with their name and the date, value to date, claimed before and this claim in cents, totals that are the sums of the lines, each signed variation with its signed acceptance attached, the waiver version, and the words \"DRAFT: not a payment claim until reviewed and served by you\". It is held for the contract's named project manager. A second run in the month updates the same draft. It states no due date, payment schedule, retention or adjudication, and nothing is served, sent or lodged by the bot; the project manager releases it, then signs and serves the claim.","readback":"The contract record returns the draft's id; reading the claim back by contract id and period must return that id with the marker, the lines and the hold for the project manager, and it is stamped on the contract as seam.report_id. No id back is not a write: it raises an exception with reason write_failed and the run stops for that contract."},{"event":"exception.raised","write":"A parked draft or a stopped run as an exception on the contract record: the reason (no_waiver_acceptance, schedule_mismatch, no_assessment, unsigned_variation, below_previous or write_failed), the contract id, the period, the lines left out, and exception_owner set to the contract's project manager, or to the account owner for no_waiver_acceptance.","readback":"The exception desk returns an exception_id, and reading it back returns the contract id, the period, the reason and the exception_owner; the next run reads it there and does not release or re-park around it until exception.closed."}],"exceptions":{"raises":["claim.no_waiver_acceptance","claim.schedule_mismatch","claim.no_assessment","claim.unsigned_variation","claim.below_previous","claim.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.report_id","seam.period","seam.waiver_version","seam.status","seam.park_reason","seam.held_for","seam.released_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/progress-desk","bot":"https://x.ai/bot/LXDY-4WkTzd29zBBgAC5a"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"progress-claim-draft","edition":"2026-11-05","environment":"stub","ran_at":"2026-11-04T22:23:01.245Z","run_id":"run-1793830981244","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"promise-watch","name":"Promise Watch","office_task":"Turn every client's \"I'll pay by\" reply into a dated promise on the invoice, and when that date passes unpaid, draft the next chase for the owner to approve.","verticals":["b2b-office"],"standards":["debtor-chasing"],"systems_of_record":["Xero (the ledger that issues the invoice_id; the promise is written onto the invoice)","Gmail (the watched inbox that issues the message_id of each client reply and holds the chase drafts)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"a dated promise to pay on the invoice the client's reply names by its invoice number: date (never empty), amount (may be empty), method if offered, and when it was captured; the follow-up moves to that date","readback":"GET /api.xro/2.0/Invoices/{InvoiceID}/History returns the promise note with its date and capture time; no note back means it was not written and an exception is raised instead"},{"event":"exception.raised","write":"an exception on the invoice naming the person who owns it: a chase drafted and waiting for approval, a broken promise, a dispute, a relationship-sized balance lifted out of the run, a reply with no single invoice id, a reply with no date, or an override refused for want of a named approver","readback":"the exception desk returns an exception_id, and reading that id back returns the invoice_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["chase_drafted_awaiting_approval","dispute_open","relationship_sized_balance","promise.no_invoice_ref","promise.no_date","promise.write_failed","override.refused_no_approver","held_open_exception"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.promise_date","seam.promise_amount","seam.promise_captured_at","seam.chase_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/promise-watch","bot":"https://x.ai/bot/iWjwoISqtZKb0lHxeZ1Et"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"PayDate Chase","original_author":"Skip Rogers","share_link":"https://x.ai/bot/QKd4byLZMI9Amf9dRlDP1","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T12:30:58.315Z","run_id":"run-1793709058313","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:30:59.671Z","run_id":"run-1793709059669","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"proposal-desk","name":"Proposal Desk","office_task":"When we open a proposal job for a prospective client, draft their engagement fee quote from our own service price list, or park it with a reason, and hold it for a partner to send.","verticals":["accounting-bookkeeping"],"standards":["quote-out"],"systems_of_record":["Xero Practice Manager (the prospect's proposal job)","Xero (Items as the service price list, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft fee quote on the prospect's proposal job, one line per service the prospect needs (a quarterly BAS listed four times), every line carrying the service's catalogue id and its fee as read from the practice's price list at draft time, ex GST. It is held in draft for the partner, who agrees the scope and sends it with the engagement letter; this node has no way to send it.","readback":"The quote is read back by the id Xero returned (GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the proposal job's id in its reference. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked proposal as an exception on the job: the park reason from the standard's fixed list, the services that did price with their catalogue ids, the ones that did not (advisory, restructures, anything bespoke), no total, and exception_owner set to the partner the practice named for proposals.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/proposal-desk","bot":"https://x.ai/bot/H2M_67hBAGEirh_YbgAd1"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:57:13.926Z","run_id":"run-1793793433925","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:58:37.390Z","run_id":"run-1793793517389","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"quote-desk","name":"Quote Desk","office_task":"When a job is booked, draft its quote in our job system from our own price list, or park it with a reason, and leave it for us to send.","verticals":["trades-building"],"standards":["quote-out"],"systems_of_record":["ServiceM8","Simpro","Xero"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.sent","write":"A draft quote on the job it was drafted from, every line carrying a catalogue id from the job system's own price list. This node never sends it: quote.sent fires from the job system when the named person releases the draft.","readback":"The quote is read back by the id the job system returned (ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote as an exception on the job: the park reason from the standard's fixed list, the priced lines, no total, and exception_owner set to the person the business named for quotes.","readback":"The job read by its id shows the open exception with its exception_owner; the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["grok-bot-routine","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/quote-desk","bot":"https://x.ai/bot/sA1aFB0C07qfNXbGzJQR2"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Tiffany","original_author":"Micah Watson","share_link":"https://x.ai/bot/7DlZjgLrcgPUNVkl_cC95","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T10:58:25.199Z","run_id":"run-1793703505198","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T10:58:25.583Z","run_id":"run-1793703505582","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"quote-keeper","name":"Quote Keeper","office_task":"Keep every quote we send on the register and follow each quiet customer up on our cadence and in our wording until they decide, then hand a no, a dispute or the cap to a person.","verticals":["trades-building"],"standards":["follow-up"],"systems_of_record":["the job system that issues the quote_id and job_id (ServiceM8, Simpro, or for Tradify a register kept beside it)","the exception desk the business runs (a sheet or a task list that issues the exception_id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"quote.sent","wake":"webhook"},{"event":"quote.accepted","wake":"webhook"},{"event":"quote.declined","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the arrival that ends the chase, filed against the job the quote belongs to by its job_id: the customer's signed acceptance or reply by message_id, or the decision recorded on the call; the open item moves to arrived and is never touched again","readback":"reading the job by its job_id returns the filed attachment or note with its message_id or outcome id and the quote_id; nothing on the read-back means it was not filed, and the item stays open for a person rather than being chased"},{"event":"exception.raised","write":"an exception on the quote naming the person who owns it, with every touch so far: a no on the call, a dispute or a stop request, or the cadence's cap reached with no decision","readback":"the exception desk returns an exception_id, and reading that id back returns the quote_id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.quote_id","seam.job_id","seam.followup_touches","seam.followup_outcome","seam.arrival_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/quote-keeper","bot":"https://x.ai/bot/bVW0_pOKwmpHHBMoAUcjJ"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"The Follow-Up Machine — Quotes Don't Die in the Inbox Anymore","original_author":"News Gurus","share_link":"https://x.ai/bot/iXXRYul0WYgEQeFBSxba_","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T12:59:09.118Z","run_id":"run-1793710749116","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"quote-nudge","name":"Quote Nudge","office_task":"Each morning, find the flooring quotes customers have not answered, draft a low-pressure nudge for the rep to send within the cap, and hand any no or dead quote to a named person.","verticals":["trades-building"],"standards":["follow-up"],"systems_of_record":["the job system that issues the quote_id and job_id (ServiceM8, Simpro, or a quote register kept beside Tradify, which has no public API)","Gmail or Outlook (the rep's outbox for the drafted nudge, and the customer's reply by message_id)","the exception desk the business runs (a sheet or a task list that issues the exception_id)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"quote.sent","wake":"webhook"},{"event":"quote.accepted","wake":"webhook"},{"event":"quote.declined","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the customer's decision on the quote (their acceptance or reply, by message_id) filed as an attachment on the job the quote belongs to, which marks the open item arrived and ends the chase before any further nudge","readback":"the job system returns the attachment's id, and reading it back (for ServiceM8, GET /api_1.0/attachment/{uuid}.json) returns the job_id it is related to and the message_id it came from; no id back means it was not filed, and the next run files it again before anything else"},{"event":"exception.raised","write":"a hand-off on the quote naming the person who now owns it, for a no, a dispute, a stop-contacting-me, or the cadence cap reached with no decision, carrying every nudge and call so far","readback":"the exception desk returns an exception_id, and reading that id back returns the quote_id, the reason, the exception_owner and the touch history; no id back means nothing was raised and the quote is not touched again that run"}],"exceptions":{"raises":["follow_up.declined","follow_up.disputed","follow_up.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["item.status","item.touches","item.outcome","item.arrival_evidence_ref","item.we_owe","item.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/quote-nudge","bot":"https://x.ai/bot/CtyB43HNgbBh6weHS2A7x"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Quote Closer","original_author":"Mark G","share_link":"https://x.ai/bot/lnEBRA4mvuYRbZC003NdY","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T12:58:46.185Z","run_id":"run-1793710726184","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"rack-watch","name":"Rack Watch","office_task":"Keep each client warehouse's AS 4084 racking inspection dated from our rules, draft the booking, file every damage finding against its bay, and draft the repair summary for us to send.","verticals":["b2b-office"],"standards":["compliance-calendar"],"systems_of_record":["the racking inspector's register of client warehouse racking installations (its dated rule store per state, and the document store the signed inspection reports are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"the installation's inspection obligation, classed Due Soon from the rule version in force for its state, with the client's inspection booking drafted on it and held for a named person to release","readback":"reading the installation back by its asset_id returns the derived due date, the rule version that produced it and the drafted booking awaiting release; no draft on the read means nothing was written and the run raises an exception"},{"event":"evidence.filed","write":"the signed inspection report attached to the installation's obligation as its evidence of completion, with each damage finding filed against its bay carrying the inspector's own risk level and repair recommendation, and the client repair summary drafted beside it for a named person to send","readback":"reading the obligation back returns the document_id of the report as its evidence and the findings by bay; a completion with no report is refused by the register and raised, so nothing reads as inspected on a tick"},{"event":"exception.raised","write":"an exception on the installation naming the person who owns it: an overdue inspection, a red bay, a finding with no risk level or no bay, a last inspection date nobody knows, no rule for the site's state, an inspection reported done with no report, a client's dated refusal, a booking or repair summary awaiting release, or a past due date its rule version can no longer explain","readback":"the exception desk returns an exception_id, and reading that id back returns the installation's asset_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["rack.inspection_overdue","rack.inspection_due_soon","rack.red_finding","rack.finding_unclassified","rack.finding_without_bay","rack.repair_summary_awaiting_release","rack.last_inspection_unknown","rack.no_rule_for_state","rack.inspection_without_report","rack.inspection_declined","rack.notice_drafted_awaiting_release","rack.release_refused","rack.history_unexplained","rack.report_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.rule_version","seam.anchor_status","seam.class","seam.evidence","seam.findings_by_bay","seam.refused_at","seam.breached_at","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/rack-watch","bot":"https://x.ai/bot/YhymOLJBCflXE-9vTXxG6"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:39:54.650Z","run_id":"run-1793795994648","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"receipt-chase","name":"Receipt Chase","office_task":"Each weekday, find the bank and card lines in Xero with no receipt, ask the person who spent each one for it, attach it when it comes back, and hand a no or a silence to the bookkeeper.","verticals":["accounting-bookkeeping"],"standards":["follow-up"],"systems_of_record":["Xero, where each spend line in the bank feed has its bank transaction id and the receipt is attached to that line","the receipt register kept beside it, one open item per line with no receipt, owed by the person who spent it","the practice's mailbox (Gmail or Outlook), where a receipt sent back on the chase thread arrives with its message id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the receipt (a tax invoice, or a photo of the docket) attached to its bank or card line in Xero by the line's bank transaction id, which marks the register item arrived so the line can be coded and its GST claimed by the bookkeeper","readback":"reading the line back from Xero by its bank transaction id lists the attachment, and the register item reads back status arrived with an evidence reference naming the message_id the receipt came in on; no attachment back means it was not filed, and the item stays on the register untouched until a person looks"},{"event":"exception.raised","write":"an escalation on the register item naming the bookkeeper: the spender said no or asked us to stop, disputed the line, or the cap was reached with no receipt, carrying every reminder so far","readback":"the exception desk returns an exception_id, and reading it back returns the item id, the bank transaction id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.item_id","seam.bank_transaction_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/receipt-chase","bot":"https://x.ai/bot/mJTyaZsiUedBb-sXF26Zi"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T11:42:22.220Z","run_id":"run-1793792542216","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"recharge-desk","name":"Recharge Desk","office_task":"Each month, turn the software we pay for on clients' behalf into one draft recharge invoice per client in Xero at our recharge prices, and hold it for a named person to release.","verticals":["accounting-bookkeeping"],"standards":["invoice-out"],"systems_of_record":["the practice's subscription register (a sheet or the practice management system) that holds one recharge period per client per month, with each subscription on it reconciled to the supplier's bill, and issues the period's id (carried as job_id)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per client per month, referenced job:<period id> (and the stage under a fixed-fee onboarding agreement), every line one of that client's subscriptions for the month with its register line reference in the notes, every price read from the recharge price list at draft time, and the client's signed approval attached for a seat or upgrade added mid-month. A second close of the same month updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<period id>, and that id is stamped on the period as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The invoice leaves only after a release naming the practice manager, or naming the rule the partner set and showing the total is under its threshold; the release and the send time are recorded against the period.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the period read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the recharge period: the reason from the standard's fixed list (not_in_pricebook, unsigned_variation, write_failed) or over_threshold, the period id, the invoice id, the codes left unpriced, and exception_owner set to the person the practice named for recharges.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/recharge-desk","bot":"https://x.ai/bot/06nJssSz4zT3NcUnuyXbc"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T11:59:07.202Z","run_id":"run-1793793547201","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:59:08.800Z","run_id":"run-1793793548798","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"renewal-watch","name":"Renewal Watch","office_task":"Keep our licences, insurances and site services on a calendar worked out from each state's rules, file the certificates when they come in, and put anything late in front of a named person.","verticals":["b2b-office"],"standards":["compliance-calendar"],"systems_of_record":["the business's obligation register (its compliance calendar, rule set and the document store certificates are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"a certificate, policy schedule or service report from an email, filed as evidence of completion on the obligation it names by obligation id; a message with no obligation id is never matched by name and is raised instead","readback":"the obligation is read back by its id and must return the same evidence reference (the message_id and attachment) and a completion date; if it does not, nothing was filed and renewal.evidence_not_read_back is raised"},{"event":"exception.raised","write":"an exception on the obligation naming the person who owns it: an unknown anchor date, no rule in force, a past date no retained rule version explains, a completion claimed without a document, a dated refusal, a breach, a drafted booking or renewal awaiting a named release, a release with no named person, silence past the next chase date, or an email with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["renewal.anchor_unknown","renewal.no_rule_in_force","renewal.history_unexplained","renewal.completion_without_evidence","renewal.evidence_not_read_back","renewal.refusal_recorded","renewal.breached","renewal.notice_drafted_awaiting_release","renewal.release_refused","renewal.chase_due","renewal.attachment_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/renewal-watch","bot":"https://x.ai/bot/hl3uzsSZ02gmYBcYbVSrH"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Duly","original_author":"Logan Brown","share_link":"https://x.ai/bot/5TEr6ycYq_ijQBd9XEj95","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:10:44.110Z","run_id":"run-1793711444108","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"rent-watch","name":"Rent Watch","office_task":"Every day, work out which tenancies are really behind on rent, chase only those, and hand anything past a reminder to a named person.","verticals":["property"],"standards":["rent-arrears"],"systems_of_record":["the property management system that issues the tenancy_id (its tenancy ledger and message log)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"rent.overdue","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an exception on the tenancy naming the person who owns it: a stop condition that matched, a failed or stale ledger read, a drafted notice awaiting a named release, a fee held for a person, or an unanswered sequence","readback":"the exception desk returns an exception_id, and reading that id back returns the tenancy_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["rent.ledger_read_failed","rent.ledger_stale","rent.no_rule_for_state","rent.payment_received","rent.hardship_on_file","rent.notice_drafted_awaiting_release","rent.fee_held_for_person","rent.sequence_unanswered","rent.send_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.tenancy_id","seam.triage_outcome","seam.stop_check","seam.rule_version","seam.notice_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/rent-watch","bot":"https://x.ai/bot/JHeKSJidz0jfql-QkRaTr"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Landlord Ledger","original_author":"Daniel Masarsky","share_link":"https://x.ai/bot/sPjI0Dec1DUvTc7H0zxNG","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rent-arrears","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T10:56:25.333Z","run_id":"run-1793703385331","green":5,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"rental-safety-watch","name":"Rental Safety Watch","office_task":"Keep every rental's smoke alarm, gas and hot water valve checks dated from the state's rules, draft the booking before each lapses for the property manager to release, and file the certificate.","verticals":["property"],"standards":["compliance-calendar"],"systems_of_record":["the property management system that issues each rental's asset_id and tenancy_id (its safety check register, dated rule set per state, and the document store the contractor's certificates are filed in)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"the rental's safety check obligation, moved to Book now from the rule version in force in its state, with the contractor booking (and the tenant's entry notice where the rule needs one) drafted on it and held for the property manager to release; nothing is sent","readback":"reading the obligation back by its id on the rental's asset_id returns the derived due date, the rule version that produced it and the drafted booking awaiting release; no draft on the read means nothing was written and the run raises an exception"},{"event":"evidence.filed","write":"the contractor's smoke alarm, gas or tempering valve certificate, filed as evidence on the obligation it names by obligation id and the rental's tenancy_id; a 'done' with no certificate attached is refused, and a file with no obligation id is never matched on an address or a tenant's name","readback":"the obligation is read back by its id and must return the same evidence reference and a completion date; if it does not, nothing was filed and safety.done_without_certificate is raised"},{"event":"exception.raised","write":"an exception on the obligation naming the person who owns it: a check overdue, a last check date nobody knows, no rule for the rental's state, a past due date no kept rule version explains, a 'done' with no certificate, a landlord's dated refusal, a tenant not home with the second booking drafted and the next chase date, a draft awaiting release, a release with no named person, or a certificate with no obligation id","readback":"the exception desk returns an exception_id, and reading that id back returns the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["safety.check_overdue","safety.booking_drafted","safety.last_check_unknown","safety.no_rule_for_state","safety.past_date_unexplained","safety.done_without_certificate","safety.owner_declined","safety.waiting_on_access","safety.draft_awaiting_release","safety.release_without_person","safety.certificate_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.tenancy_id","seam.obligation_ref","seam.rule_version","seam.anchor_status","seam.state","seam.evidence","seam.refused_at","seam.breached_at","seam.waiting_on","seam.next_chase","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/rental-safety-watch","bot":"https://x.ai/bot/omyJIh5eMoq_VFkYWpEuE"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:13:02.890Z","run_id":"run-1793794382888","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"repair-board","name":"Repair Board","office_task":"Send each triaged repair to a licensed trade at a time inside the resident's window, text the resident once, and hand what cannot be placed to the property manager.","verticals":["property"],"standards":["dispatch-board"],"systems_of_record":["the property management system that issues the maintenance job_id (its work orders, trade panel and licence records)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"one slot on the maintenance job: the licensed trade, the start and end inside the resident's window, the resolved address, who or which rule set it, and the job version it was made for; updated in place on a change or a displacement, never written twice","readback":"the work order returns the slot's external id, and reading the job back by job_id returns that one slot with its trade, times and author; a write with no id back is a failed write, escalated as write_failed, and nothing is sent about it"},{"event":"exception.raised","write":"an exception on the job naming the property manager who owns it: an address that will not resolve, no trade with a current licence for the work, a window the job cannot fit, no capacity, no consent to text the resident, a failed slot write, or a routine visit an urgent repair displaced and could not be re-slotted","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.resident_message_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/repair-board","bot":"https://x.ai/bot/OrM0797dYfcLhzivum5Hx"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Miffy - Maintenance Triage","original_author":"Miffy","share_link":"https://x.ai/bot/gKgo-_MM29kfcD9qiZf2A","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T12:49:42.714Z","run_id":"run-1793710182712","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"retention-book","name":"Retention Book","office_task":"Keep the retention held on each contract, work out when each half is due back and when the defects period ends, and draft the release request for a named person to send.","verticals":["trades-building"],"standards":["compliance-calendar"],"systems_of_record":["the job system that issues the job_id (Simpro, ServiceM8 or similar): the contract job, its practical completion date and retention terms","the exception desk the business runs, which issues the exception_id","the document store (Drive or SharePoint), where remittances and release certificates are filed against the job"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the client's remittance or release certificate for a retention release, filed against the job it belongs to by job_id and the release obligation id; only then does the release count as received","readback":"the document store returns a document id for the filed attachment, and reading the job by its job_id lists that message_id against the release obligation; no id back means nothing was filed and the release stays live"},{"event":"exception.raised","write":"an exception on the contract job naming the person who owns it: a release request drafted and awaiting a named release, a release overdue, a client refusal (dated, the release still live), practical completion not recorded, no retention rule for the state, a release marked received with no document, or a release that came in late","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the obligation id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["retention.release_request_drafted","retention.release_overdue","retention.release_refused","retention.practical_completion_unknown","retention.no_rule_for_state","retention.no_state_on_contract","retention.rule_history_missing","retention.released_without_document","retention.released_late","retention.release_unnamed","retention.reply_unmatched"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.retention_obligation_id","seam.rule_version","seam.release_state","seam.refused_at","seam.breached_at","seam.evidence_message_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/retention-book","bot":"https://x.ai/bot/Zw_0YeJ77VFchgreUwfaK"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"compliance-calendar","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T11:41:45.084Z","run_id":"run-1793792505082","green":7,"red":0,"with_us":1,"evidence_required":1,"total":10}]},{"slug":"review-ask","name":"Review Ask","office_task":"After each finished job, line up the same Google review message for every customer, one reminder then stop, hold jobs with an open callback or dispute, and a person releases each batch.","verticals":["trades-building"],"standards":["review-request"],"systems_of_record":["the job system that issues the job_id and holds its status, callbacks, invoice dispute and complaint (ServiceM8, Simpro, Fergus, Jobber or AroFlo)","the SMS or email account the business owns (the ask, the reminder and the reply, by message_id)","the review record and the exception desk the business runs (a sheet or a list that issues the exception_id)"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"each ask and reminder a named person released, filed against its job in the review record: the job_id, the customer, the channel, the exact body, the message_id and who released it; each reply filed against the job it answers, word for word","readback":"the SMS or email account returns a message_id for the send, and reading the review record back by job_id returns that message_id with the body and the releaser; no message_id back means nothing was sent, and a send_failed exception is raised"},{"event":"exception.raised","write":"an exception on the job naming the owner: held for an open callback, a disputed invoice or an open complaint; no mobile and no email on record; a send that did not return an id; or a written message that offers something or names stars","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["review.open_callback","review.invoice_disputed","review.open_complaint","review.no_way_to_reach","review.send_failed","review.message_breaks_the_standard"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"seam-mirror","fields":["seam.job_id","seam.ask_status","seam.asked_at","seam.reminded_at","seam.hold_reason","seam.released_by","seam.message_id","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/review-ask","bot":"https://x.ai/bot/fX_6MRT8R_4M5StWEtJk8"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"review-request","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:28:19.986Z","run_id":"run-1793795299984","green":9,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"ring-list","name":"Ring List","office_task":"Every weekday morning, tell me who to ring today from my own database, why each one, with a short opener drafted, and nothing past the do-not-call flags.","verticals":["property"],"standards":["database-reactivation"],"systems_of_record":["the agency CRM, or the copied Contacts sheet, that holds each contact row, its last outcome and the do-not-contact register","the place the agent opens each morning (CRM tasks, the Today tab or a morning email), which issues the report_id for each day's list"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the day's call list for the agent: at most the cap they set, in rank order, each row with its play, the trigger that qualified it, a drafted opener under 40 words and the last outcome. Drafts only: nothing is dialled or sent","readback":"the list store returns a report_id for the day's list, and reading that id back returns the same rows in the same order; no id back means no list was published and the run raises an exception"},{"event":"exception.raised","write":"a thing to sort out, on top of the list and naming the agent who owns it: a contact missing name, mobile or address, a reply waiting that asks for a price, makes a complaint or asks something the play was not built for","readback":"the exception desk returns an exception_id, and reading that id back returns the contact, the typed reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["reactivation.not_ready","reactivation.price_question","reactivation.complaint","reactivation.reply_outside_play","reactivation.list_not_published"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.play","seam.trigger","seam.rank_reason","seam.last_outcome","seam.last_outcome_at","seam.sequence_started_at","seam.do_not_contact","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/ring-list","bot":"https://x.ai/bot/GZGvqFQRstgcLUF7sVghc"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Realtor Morning Brief","original_author":"Bryan Dunleavy","share_link":"https://x.ai/bot/uxg9lUIEGbftXKwMN4COQ","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"database-reactivation","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T12:53:44.310Z","run_id":"run-1793710424308","green":8,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"roof-desk","name":"Roof Desk","office_task":"Answers roofing calls we miss after hours, checks the address is in our area, books one inspection or repair job, and wakes the on-call roofer only when water is coming in.","verticals":["trades-building"],"standards":["booked-after-hours"],"systems_of_record":["ServiceM8","Simpro"],"consumes":[{"event":"call.received","wake":"webhook"}],"emits":[{"event":"job.created","write":"one job in the job system per caller, with the resolved address, the fixed type (emergency, routine or quote) and the caller's own words, booked for the next working slot; a repeat call from the same number updates the open job and sets duplicate_of instead","readback":"the job system returns the job id (ServiceM8 job uuid, Simpro job ID) and the open job for that number is read back with the same id before the caller is told it is booked; no id that reads back means write_failed, an alert to the office, and no job.created"},{"event":"exception.raised","write":"a hand-off to the office with a reason from the fixed list (a price question, a complaint, an address it could not confirm, a job outside the taxonomy, a failed write) and the call transcript attached","readback":"the exception desk returns an exception_id, and reading it back returns the call_id, the reason and the exception_owner; no id back means nothing was raised and the call is logged as not completed"}],"exceptions":{"raises":["unclassified","address_unresolved","out_of_scope_request","caller_distressed","price_requested","complaint","write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.duplicate_of","seam.call_id","seam.status","seam.exception_owner"]},"runtime":["office-voice-front-desk","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/roof-desk","bot":"https://x.ai/bot/6zqXAMpyu1gBbAKn-CKra"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Route missed roofing calls to a Retell AI agent with Twilio and Google Workspace","original_author":"Khadija Naeem","share_link":"https://n8n.io/workflows/18949","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"booked-after-hours","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T14:11:15.253Z","run_id":"run-1793715075253","green":8,"red":0,"with_us":1,"evidence_required":0,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:11:15.588Z","run_id":"run-1793715075587","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"route-plan","name":"Route Plan","office_task":"Each morning, suggest the order of every tech's jobs and which licensed tech takes each recurring visit so the vans drive less, and book only the lines the dispatcher accepts.","verticals":["trades-building"],"standards":["dispatch-board"],"systems_of_record":["the job system that issues the job_id and holds its schedule (ServiceM8, Simpro or Jobber)","the tech licence register the business keeps"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"one slot on the job's schedule for each line the named dispatcher accepted (tech, stop order, start, end, resolved address, the dispatcher who released it and the planning rule, what displaced it), updated in place on a change and never written twice, with the customer confirmation attached as evidence","readback":"the job system returns the slot's external id, and reading the job's slot back by job_id returns that external id and the job version it was made for; no id back is a failed write, escalated as write_failed, and nothing is sent"},{"event":"exception.raised","write":"an escalation on the job naming its owner: an address that will not resolve, no tech with a current licence for the job, a window nobody can meet, no room on any licensed tech's run, no consent to message the customer, a failed slot write, or a displaced job that could not be re-planned","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.customer_message_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/route-plan","bot":"https://x.ai/bot/z--gdO2VgtjY06Fr_0amD"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:21:20.110Z","run_id":"run-1793794880109","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"safety-cert-desk","name":"Safety Cert Desk","office_task":"When a smoke alarm and RCD job is done, draft the property's compliance pack from the tech's results for our licensed electrician to sign, and hold it if any result is missing.","verticals":["fire-electrical"],"standards":["fire-service-pack-standard"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro or similar: the completed job, its test form results and attachments)","the asset register that issues the asset_id (each smoke alarm and RCD on the property, by the tag printed on it)","the exception desk the business runs (a sheet, a task list or a ticket queue)"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"Each smoke alarm and RCD test filed as a service record on the one asset its tag resolves to, naming the obligation it discharges, the result the electrician recorded and the RCD trip time as a number; then, only when every item bound cleanly, the draft compliance pack, marked DRAFT and unsigned, attached to the job and filed in the property's pack folder for the licensed person to sign and issue.","readback":"The asset register returns a service record id per test, and reading it back returns the asset_id, the obligation_id and the queue (pass, defect or unbound); the job system returns the attachment id of the draft pack, and reading it back returns the job_id. No id back is not a write: the item is raised as record.refused and the pack waits."},{"event":"exception.raised","write":"An exception on the job naming the person who owns it: a tag that resolves to no alarm or to two, no obligation named, a missing result, the wrong evidence for the item (a trip time sent as a photo), an uncoded defect, an RCD closed without its test sheet, a missing tag photograph, an isolated circuit without a revisit date or past it, and the held pack itself.","readback":"The exception desk returns an exception_id, and reading that id back returns the job_id, the asset_id, the reason and the exception_owner. No id back means nothing was raised and the run stops."}],"exceptions":{"raises":["asset.unresolved","record.no_obligation","result.missing","evidence.wrong_for_class","defect.uncoded","close.refused","record.unbound","record.refused","isolation.no_revisit","isolation.recorded","isolation.lapsed","rule.missing_for_state","pack.held"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.records","seam.queue","seam.pack_status","seam.rule_version","seam.exception_open","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/safety-cert-desk","bot":"https://x.ai/bot/oUudvGKtUoQkVzhiBDTeN"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"fire-service-pack-standard","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:09:23.180Z","run_id":"run-1793794163179","green":11,"red":0,"with_us":1,"evidence_required":0,"total":12}]},{"slug":"seller-book","name":"Seller Book","office_task":"Each morning, show me which past sellers and appraisals in my own database to text today and why, drafted for my OK, and keep every outcome and follow-up on the contact.","verticals":["property"],"standards":["database-reactivation"],"systems_of_record":["the agency CRM (Agentbox, VaultRE, Rex or similar), or the copied Contacts sheet, that holds each contact row, its last outcome and date, its texts and the do-not-contact register","the place the agent opens each morning (CRM tasks or the Today tab), which issues the report_id for each day's list of drafted texts"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the day's list of drafted seller texts for the agent's OK: at most the cap they set, in rank order, each row with its play, the trigger that qualified it, the drafted text naming that trigger, the sender and a STOP opt-out, and the last outcome. Nothing is sent until the agent OKs it","readback":"the list store returns a report_id for the day's list, and reading that id back returns the same rows in the same order; no id back means no list was published and the run raises an exception"},{"event":"exception.raised","write":"a thing to sort out, naming the agent who owns it: a seller reply that asks for a price or an offer, a complaint, a reply the play was not built for, or a contact missing name, mobile or address","readback":"the exception desk returns an exception_id, and reading that id back returns the contact, the typed reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["reactivation.not_ready","reactivation.price_question","reactivation.complaint","reactivation.reply_outside_play","reactivation.list_not_published"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.play","seam.trigger","seam.rank_reason","seam.text_step","seam.sequence_started_at","seam.last_outcome","seam.last_outcome_at","seam.do_not_contact","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/seller-book","bot":"https://x.ai/bot/kTUz5dg5DPOwowJ8maLqS"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"database-reactivation","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T13:55:04.368Z","run_id":"run-1793714104365","green":8,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"seller-weekly","name":"Seller Weekly","office_task":"Every Monday, publish each seller a report on their listing: buyer enquiries, inspections and online views, every figure traced to its source, for the listing agent to send.","verticals":["property"],"standards":["recurring-report"],"systems_of_record":["the agency's sales CRM (such as Rex, VaultRE or Agentbox) that holds buyer enquiries and online listing views, issuing the listing_id","the inspection register the agency keeps for open homes and private inspections","the agency's report store or vendor portal the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's report per audience: each seller sees only their own listing's figures, the agency principal sees every listing; each figure carries its definition id, source and as-of time, and a correction is a new version superseding the old with the named person and the reason. Sending a seller's view to the seller stays with the listing agent","readback":"reading the week's reports back from the report store returns each report_id with its version, audience, published_at and published_by; no id back means it was not published and an exception is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared, or an incomplete correction","readback":"the exception desk returns an exception_id, and reading that id back returns the week, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.listing_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/seller-weekly","bot":"https://x.ai/bot/AQQjWBWooDc8ankV5M2-r"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Send weekly seller property reports from Google Sheets via Gmail","original_author":"Christophe REVOIRE","share_link":"https://n8n.io/workflows/20542","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:04:51.829Z","run_id":"run-1793714691828","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"service-due","name":"Service Due","office_task":"When a job is done, keep its equipment on our register, work out each unit's service and warranty dates from our schedule, draft reminders for us to release, and turn a yes into one booking request.","verticals":["trades-building"],"standards":["next-service"],"systems_of_record":["the job system that issues the job_id (ServiceM8, Simpro, Fergus, Jobber or AroFlo) and the equipment register on it that issues the asset_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"asset.service_due","write":"on the asset in the register: the service or warranty date worked out from the written schedule row (or the warranty term on the record) on this run, with the reminder drafted onto the morning list for a named person to release, never a stored due date","readback":"reading the asset back by its asset_id returns its history with the drafted entry, the derived date and the schedule row that produced it; no entry on the read means nothing was written and the run raises an exception"},{"event":"job.created","write":"one booking request in the job system after a customer's yes, against that customer and asset, carrying their reply word for word, with no time and no price; the office is told its job number to book and price it","readback":"the job system returns the job number and reading that job back returns the same asset_id and customer; the open jobs for the asset are read before every write, so a second yes or a second run finds the first request and writes nothing"},{"event":"exception.raised","write":"an exception on the asset naming the person who owns it: a missing install date, model or equipment type, an equipment type with no schedule row, a customer who agreed to neither SMS nor email, a reply that is not a yes or a stop, or a write that did not read back","readback":"the exception desk returns an exception_id, and reading the asset back shows it open with its kind; an open exception stops every reminder for that asset until the named person clears it"}],"exceptions":{"raises":["missing_install_date","missing_model","missing_equipment_type","no_schedule","no_consent","unclear_reply","write_failed","send_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.asset_id","seam.source_job_id","seam.history","seam.booking_job_id","seam.opt_out","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/service-due","bot":"https://x.ai/bot/WRZafyqFQjiUHHPNfXVHE"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"next-service","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:18:54.766Z","run_id":"run-1793794734764","green":10,"red":0,"with_us":1,"evidence_required":1,"total":15}]},{"slug":"sign-in-follow-up","name":"Sign-In Follow-Up","office_task":"Take the open-home sign-in sheet, follow up only the people who said yes with a message I approved, sort their replies, and draft the vendor's report from them.","verticals":["property"],"standards":["open-home-feedback"],"systems_of_record":["the open-home sign-in register, exported from the sign-in app or the agency CRM, or the paper sheet typed up, which issues the document_id and the listing_id each row belongs to","the agent's mail and SMS sender, which holds the approved drafts, the sends and the replies (message_id)","the report store the agent and the vendor open, which issues the report_id per version"],"consumes":[{"event":"listing.feedback_due","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the week's vendor report for one listing (attendee, follow-up, reply and class counts, price comments word for word, themes citing their replies, no names or contact details), drafted to the agent as a new version and sent to the vendor only once the agent approved that version","readback":"the report store returns a version for the listing, and reading the listing's latest report back returns that version, its counts and verbatim comments, and whether it reached the vendor; no version back means nothing was written"},{"event":"exception.raised","write":"an exception naming the agent who owns it: a register row with no name, no way to reach them or no open, a row with no consent at sign-in, the same person at two opens of one listing, an offer, a complaint, or a reply that fits no class, each with the row or the reply word for word","readback":"the exception desk returns an exception_id, and reading that id back returns the register row or reply it is about, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["open_home.incomplete_row","open_home.no_consent","open_home.duplicate_attendee","open_home.offer","open_home.complaint","open_home.unclear_reply"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.document_id","seam.listing_id","seam.consent_as_written","seam.draft_status","seam.approved_by","seam.consent_withdrawn","seam.reply_classes","seam.report_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/sign-in-follow-up","bot":"https://x.ai/bot/ws2Q7jhGDLkS9ANew6hMP"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Automate Real Estate Open House Follow-ups with SignSnapHome, HubSpot, and Twilio","original_author":"Kaden Reese","share_link":"https://n8n.io/workflows/9256","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"open-home-feedback","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-03T14:13:16.029Z","run_id":"run-1793715196028","green":9,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"site-drop","name":"Site Drop","office_task":"File every site photo, chat update and bit of paperwork the crew send onto the right job by the job number they wrote on it, and park anything with no clear job for a named person.","verticals":["trades-building"],"standards":["document-filing"],"systems_of_record":["the job system that issues the job_id and the purchase order (order_id) each item is filed on, e.g. Simpro, ServiceM8, AroFlo or Fergus","the crew chat or office mobile the photos and updates come in on, e.g. a WhatsApp group exported to the office inbox","Xero, for customer and supplier contacts"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"}],"emits":[{"event":"evidence.filed","write":"the original photo, chat update or document attached unaltered to the one job or purchase order its written number names, with a docket, quote or invoice's details typed into blank fields only, and the job_id carried","readback":"the job system returns the attachment id on the job or order; reading it back by its id returns the attachment, its fingerprint and the entered fields; no id back means it was not filed and an exception is raised"},{"event":"report.published","write":"the daily close: arrived, filed, parked and duplicates, with the open exceptions oldest first, published on quiet days too","readback":"the system the close is published into returns a report_id, and reading it back returns the day and counts that add up"},{"event":"exception.raised","write":"one parked item on the filing list with its closed-list reason, the field, both values where they disagree, and the named owner","readback":"the exception list returns an exception_id, and reading it back returns the arrival, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["filing.no_id","filing.two_matches","filing.no_match","filing.unreadable_field","filing.does_not_add_up","filing.conflicts_with_record","filing.unknown_kind"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.arrival_id","seam.file_hash","seam.job_id","seam.order_id","seam.filing_state","seam.exception_owner","seam.cleared_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/site-drop","bot":"https://x.ai/bot/rxDqu0kJatMUYnFnYO754"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"document-filing","edition":"2026-10-24","environment":"stub","ran_at":"2026-11-04T12:50:01.262Z","run_id":"run-1793796601261","green":10,"red":0,"with_us":1,"evidence_required":1,"total":14}]},{"slug":"site-orders","name":"Site Orders","office_task":"Turn the build's material list into one purchase order per supplier, from stock first and the supplier's own prices, and match every delivery docket back.","verticals":["trades-building"],"standards":["material-order"],"systems_of_record":["the job system that issues the job_id and holds its material list","the supplier portal or job-system purchasing that issues each order's external id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"an exception on the job or the order naming the person who owns it: an order waiting for a named release (over the threshold, or to a supplier not on the approved list), a code no catalogue holds, an order write with no id back, a docket that matches no sent order, and every delivery variance (short, over, wrong item, changed price, unaccepted substitution)","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the order's external id where one exists, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["material.release_needed","material.not_in_catalogue","material.write_failed","material.no_order_for_docket","material.short","material.over","material.wrong_item","material.price_changed","material.substitution_unaccepted","material.changed_after_send"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.order_external_id","seam.supplier_id","seam.catalogue_edition","seam.released_by","seam.order_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/site-orders","bot":"https://x.ai/bot/JmQEiv2Hk2ngRND-c1q1G"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Foreman","original_author":"Jonah","share_link":"https://x.ai/bot/QqtV5CQa9HRXNC6NmoOjc","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"material-order","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T11:04:55.206Z","run_id":"run-1793703895204","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"site-test-check","name":"Site Test Check","office_task":"When a fire service visit is done, check each test against the site's asset register, hold any with no tagged asset or tag photo, and draft the site report for the person who signs.","verticals":["fire-electrical"],"standards":["fire-service-pack-standard"],"systems_of_record":["the job system that issues the job_id (Simpro, ServiceM8 or similar: the completed service visit, its test results and attachments)","the asset register that issues the asset_id (every extinguisher, hydrant, fire door and exit light on the site, by the tag printed on it)","the document store that issues the report_id (the site's pack folder in SharePoint or Google Drive)","the exception desk the business runs (a sheet, a task list or a ticket queue)"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"The site's service report, compiled at request time from the bound service records only (never from a template), marked DRAFT and unsigned, naming who may attest and the retention period from the dated rule for the site's state, written into the site's pack folder for the Fire Safety Advisor or the person the state names to check and sign. It is only written when every test on the visit bound cleanly and every asset due on the visit has a test.","readback":"The document store returns a report_id; reading that id back returns the job_id, the site id and the service record ids the report was built from. No id back is not a write: report.held is raised with a named owner and the run stops."},{"event":"exception.raised","write":"An exception on the visit naming the person who owns it: a tag that resolves to no asset or to two, an asset not on this site's register, no obligation named, no result entered, the wrong evidence for the asset class, an uncoded defect, an exit or emergency light closed without its test sheet, a missing tag photograph (unbound, with its age), an asset due on the visit with no test, an isolation without a revisit date or past it, and the held report itself.","readback":"The exception desk returns an exception_id; reading it back returns the job_id, the asset_id, the reason and the exception_owner. No id back means nothing was raised and the run stops."}],"exceptions":{"raises":["asset.unresolved","asset.not_on_site_register","asset.not_tested","record.no_obligation","result.missing","evidence.wrong_for_class","defect.uncoded","record.refused","record.unbound","close.refused","isolation.no_revisit","isolation.recorded","isolation.lapsed","report.held"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.records","seam.queue","seam.report_id","seam.report_status","seam.exception_open","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/site-test-check","bot":"https://x.ai/bot/81UjI7bKTftPdDFYeDqTy"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"fire-service-pack-standard","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:37:29.888Z","run_id":"run-1793795849883","green":11,"red":0,"with_us":1,"evidence_required":0,"total":12}]},{"slug":"software-audit","name":"Software Audit","office_task":"Each month, publish what we pay for software on bills and company cards, with owners and renewals due, and flag duplicates and unused ones to a named person, every figure sourced.","verticals":["b2b-office"],"standards":["recurring-report"],"systems_of_record":["the ledger (Xero or MYOB): supplier bills and company card spend coded to the software subscriptions account","the software register the office keeps (a SharePoint list or Google Sheet): each subscription with its named owner, renewal date and whether it is still used","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the month's software subscription report per audience (owner, bookkeeper), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, duplicate or unused subscriptions past the threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/software-audit","bot":"https://x.ai/bot/RiOzEn-dg8p0JtGyMddgH"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:02:11.928Z","run_id":"run-1793793731926","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"spend-watch","name":"Spend Watch","office_task":"Every Monday, publish the builder's spend report from the job system and the ledger, every figure with its definition, source and as-of time, and say so when one cannot be read.","verticals":["trades-building"],"standards":["recurring-report"],"systems_of_record":["the job system (Buildertrend, or Simpro and the like): supplier bills, subcontractor invoices, variations and bills awaiting approval, against each job","the ledger (Xero or MYOB): bills posted with a job tracking category","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's spend report per audience (owner, external accountant), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/spend-watch","bot":"https://x.ai/bot/kC-hc2Z5eMmiJOeiD5oGF"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Buildertrend Invoice Desk","original_author":"Brian Payton","share_link":"https://x.ai/bot/igyfOAUWRXvTZbDj2J__S","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:00:38.052Z","run_id":"run-1793714438051","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"stage-billing","name":"Stage Billing","office_task":"When a building job reaches a stage on its payment schedule, deposit included, draft that stage's invoice in Xero at the contract amount, park what it can't bill, and hold it for a named person.","verticals":["trades-building"],"standards":["invoice-out"],"systems_of_record":["the job system that holds each building job's payment schedule as one stage record per instalment and marks a record complete when the supervisor signs that stage off (Simpro, ServiceM8, Buildxact or the job sheet the builder runs), issuing the stage record's id (carried as job_id)","Xero, which holds the agreed payment schedules as items and issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft stage invoice in Xero per stage record, referenced job:<stage record id> and naming the stage as the contract writes it (Deposit, Base stage, Frame stage and so on), every line the record carries at the dollar amount the signed payment schedule sets, read at draft time and never worked out from a percentage, with any signed variation attached. It is a stage invoice and never called a progress claim. A second stage-reached event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<stage record id>, and that id is stamped on the stage record as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The stage invoice leaves only after a release naming the contracts administrator, or naming a release rule that person wrote down and showing the total is under its threshold; with no rule set, every stage invoice waits for the person. The release and the send time are recorded against the stage record. The bot never approves or emails in Xero on its own judgement.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the stage record read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting stage invoice as an exception on the stage record: the reason (no_stage, not_in_pricebook, unsigned_variation, write_failed, or over_threshold), the stage record id, the invoice id, the codes left unbilled, and exception_owner set to the person the builder named for stage invoices.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.no_stage","invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.stage","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/stage-billing","bot":"https://x.ai/bot/cYaiXWqadSG6VrV2BJrlR"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T12:25:08.004Z","run_id":"run-1793795108003","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:25:08.362Z","run_id":"run-1793795108361","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"starter-pack","name":"Starter Pack","office_task":"Chase each new starter for the TFN declaration, super choice, bank details and work rights evidence they still owe, file each as it arrives, and hold the pack for payroll to set up.","verticals":["b2b-office"],"standards":["follow-up"],"systems_of_record":["the payroll system (Xero Payroll, KeyPay or MYOB), where each new starter has an employee record id before their first pay","the starter register kept beside it, one open item per document a starter still owes against their employee record, owed by the starter","the business's mailbox (Gmail or Outlook) and document store, where a document sent back on the chase thread or through the item's upload link arrives with its message id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"email.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the returned document (the signed TFN declaration, the super standard choice form, the bank details form or the right to work evidence) filed against its open item on the starter's employee record, which marks the item arrived; when the last item for a starter is filed the payroll officer is told the pack is complete and held for them, with nothing entered into payroll","readback":"reading the item back by its id returns status arrived with an evidence reference naming the message_id the document came in on; no evidence reference back means it was not filed, and the item stays on the register with no touch until a person looks"},{"event":"exception.raised","write":"an escalation on the item naming the payroll officer: the starter said no, disputed it or asked us to stop, or the item reached its cap with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading it back returns the item id, the employee record id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.item_id","seam.employee_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/starter-pack","bot":"https://x.ai/bot/Rz15paIKgA9diCxxMAZLS"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-04T12:00:01.676Z","run_id":"run-1793793601675","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"sub-pay-check","name":"Sub Pay Check","office_task":"Before a subbie's payment claim is approved, check their licence, insurance, cover and statements are on file and current, file each one, and hold the payment for a named person.","verticals":["trades-building"],"standards":["rejected-pack"],"systems_of_record":["Xero (the subcontractor's bill, which issues the bill_id)","Gmail (the message each statement or certificate arrived on)","Google Drive (the document store that issues each document_id)","a Google Sheet as the exception desk (exception_id, exception_owner)"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"email.received","wake":"poll"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"each statement, licence and certificate of currency filed against the bill_id it supports, by reference to the subbie's facts in the graph","readback":"the document store returns the document_id, and reading that id back returns the bill_id and the message_id it arrived on; no id back means it was not filed and the pack stays on Hold"},{"event":"bill.checked","write":"the bill marked as pack checked, with the as-of, the rule versions cited and the named person who accepted the pack; nothing is paid","readback":"GET the bill by bill_id from the ledger returns the pack-checked status, as-of and accepted_by; the status is only stamped after the handover returned ok"},{"event":"exception.raised","write":"an exception on the bill naming its owner: a check failed (do not pay), paperwork missing (Hold), a release with no name, or a pack waiting for a named person to accept it","readback":"the exception desk returns an exception_id, and reading it back returns the bill_id, the check it stopped at and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["pack.fail","pack.hold","pack.awaiting_release","pack.release_unnamed","pack.handover_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.pack_queue","seam.stopped_at","seam.as_of","seam.rule_versions","seam.accepted_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/sub-pay-check","bot":"https://x.ai/bot/TD6otTZ6m_f81IicgI7-o"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:24:13.844Z","run_id":"run-1793712253842","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"swms-desk","name":"SWMS Desk","office_task":"Draft each job's SWMS or risk assessment from its scope and our approved templates, list who on the crew has not signed, and hold the pack until the supervisor accepts it.","verticals":["trades-building"],"standards":["rejected-pack"],"systems_of_record":["the job system that issues the job_id the pre-start pack belongs to, with its scope, site, start date, supervisor and crew (Simpro, ServiceM8 or Tradify's job export)","the document store that holds the approved SWMS and risk assessment templates and receives the accepted pre-start pack (SharePoint, OneDrive or Google Drive)","the exception desk the business runs, holding each held or failed pre-start pack with its named owner"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the job's pre-start pack, written into the job's folder in the document store only after the supervisor accepts it by name: the SWMS for each item of high risk construction work under WHS Regulation 2011 (Qld) s291 drafted from the approved template, the general job risk assessment, every written does-not-apply with its rule, the sign-on sheet showing each worker on the crew signed the current revision, the on-site review date derived from the dated rule, the as-of date and the version record naming who accepted it","readback":"the document store returns a report_id, and reading that id back returns the job_id, the SWMS revision, seam.queue, seam.accepted_by and seam.as_of; no report_id back means nothing was published and the run raises an exception instead"},{"event":"exception.raised","write":"an exception on the job naming its supervisor: a pack on hold because a worker has not signed the current revision or an approved template is missing, the first check that failed (no supervisor or site on the job, insurance or a worker's ticket lapsed, a scope that does not say whether high risk work is involved, two ABNs on one pack), scope fields waiting for a person to confirm, or a pack waiting for the supervisor's named acceptance","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason, the unsigned workers where there are any and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["swms.hold_missing","swms.identity","swms.tickets","swms.applicability","swms.field_reuse","swms.source_and_as_of","swms.yellow_scope","swms.awaiting_acceptance"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.swms_rev","seam.queue","seam.failed_check","seam.unsigned","seam.rule_version","seam.review_due","seam.as_of","seam.accepted_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/swms-desk","bot":"https://x.ai/bot/EVVdbcDhfoaSfHz8alCr9"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:46:32.275Z","run_id":"run-1793796392273","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"takeoff-quote","name":"Takeoff Quote","office_task":"Count the fittings and cable runs on a tender job's current drawings, draft the quote from our own pre-builds and price list, park anything the book misses, and leave it for us to send.","verticals":["trades-building"],"standards":["quote-out"],"systems_of_record":["Simpro","ServiceM8","Xero (Items as the price list and pre-builds, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the tender job it was drafted from, ex GST. One line per catalogue item: the pre-build or part id from the business's own price list, the unit it is sold by (each or lm), the quantity taken off the current drawing sheets (a count of that item's symbol, or the summed length of that item's run layer at each sheet's own scale, rounded once to the centimetre), the sheets it came off, and the item's rate as read at draft time. The amount is quantity times rate and nothing else: no waste allowance, no assumed scale, and no pre-build priced from its parts. It is left in draft, editable, for the person who owns quotes; this node has no way to send it.","readback":"The quote is read back by the id the system returned (Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote, or a tender sent back because its drawings cannot be counted, as an exception on the job: the park reason from the standard's fixed list (or takeoff_missing, takeoff_unscaled, takeoff_revision_conflict, legend_unit_mismatch), the lines that did price with their catalogue ids and sheets, each symbol or run the book does not cover with its count or length, no total, and exception_owner set to the person the business named for quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.takeoff_missing","quote.takeoff_unscaled","quote.takeoff_revision_conflict","quote.legend_unit_mismatch","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/takeoff-quote","bot":"https://x.ai/bot/tPpYNnQxX1raH2X_kBoxn"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:55:12.530Z","run_id":"run-1793796912528","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:54:28.636Z","run_id":"run-1793796868635","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"task-clock","name":"Task Clock","office_task":"Keep one list of office follow-up tasks on each job, quote or invoice, with an owner and due time from our table, nudge once when one goes late, and leave ticking off to a person.","verticals":["b2b-office"],"standards":["exception-desk"],"systems_of_record":["the job system that issues the job_id (ServiceM8), which each task is read back against","the ledger that issues the invoice_id or quote_id (Xero), for tasks about an invoice or a quote","the task list the business runs (a sheet with Tasks and Routing tabs, a SharePoint list, or Office Voice's exception queue), which issues the exception_id","the office's email or Teams channel, where the morning list lands"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"exception.raised","write":"One task per record and kind on the list: the job, quote or invoice it is about by the id its system issued, the kind from the closed list (an office follow-up label off the list lands as other with the label kept in its reason), the owner and due time from the routing table the owner wrote, a raise count that a repeat bumps without restarting the clock, and the chase stop on a dispute or hardship task.","readback":"the task list returns an exception_id, and reading it back returns the job_id or invoice_id, the type, the reason, the owner and the due time. No id back means nothing was added: whoever added the row is told and the run stops"},{"event":"report.published","write":"the morning list, once a day at the set time and also when nothing is open: open tasks by kind and by owner, each owner's tasks with their due times, the late ones, and the labels that arrived as other","readback":"the place the office reads it (an email, a Teams channel or a sheet tab) returns a report_id for that day, and a second run that morning reads it back and publishes nothing"}],"exceptions":{"raises":["price_not_in_book","variation","parts_shortfall","write_failed","address_unresolved","promise_broken","dispute","hardship","other"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.exception_id","seam.exception_type","seam.exception_owner","seam.due_at","seam.raise_count","seam.stop_chase","seam.escalated_at"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/task-clock","bot":"https://x.ai/bot/ESsaX-AyWO0R8wXIj4Kn9"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"exception-desk","edition":"2026-11-01","environment":"stub","ran_at":"2026-11-04T12:32:17.772Z","run_id":"run-1793795537771","green":6,"red":0,"with_us":1,"evidence_required":0,"total":9}]},{"slug":"tenant-inbox","name":"Tenant Inbox","office_task":"Read the agency's shared inbox, file every tenant, landlord and tradie message against its tenancy, work order or creditor, and hand each tenant complaint whole to its property manager.","verticals":["property"],"standards":["inbox-triage"],"systems_of_record":["the mail system that issues the message_id (the agency's shared Gmail or Outlook mailbox)","the property management system that issues the tenancy_id and holds the maintenance work orders and creditor records messages are filed against (PropertyMe, Console Cloud or similar)","the exception desk the agency runs, holding the queue table and its items"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the message filed against the tenancy, maintenance work order or creditor it belongs to, by that record's own id; for a tradie's invoice, each attachment filed as evidence on the creditor record with its hash and the message_id, where a bill check reads it next","readback":"reading the record back by message_id returns the filing with its record_ref (tenancy:<tenancy_id>, job:<work order id> or supplier:<creditor id>) and every evidence row with its hash; no record_ref back means nothing was filed and the message stays an open task for the other queue's owner"},{"event":"exception.raised","write":"an item on the exception desk naming the person who owns it, one per thread: a message waiting on its queue owner's reply, an unmatched message left as a task, a tenant complaint handed whole to its property manager with nothing sent to the tenant, or an item past its kind's clock handed to the owner's manager","readback":"the exception desk returns an exception_id (the item id), and reading the record back by message_id returns the item with its kind, record_ref, owner, due date and every outbound with who released it; no item back means nothing was raised and the message is escalated to the other queue's owner"}],"exceptions":{"raises":["inbox.awaiting_release","inbox.unmatched_task","inbox.complaint","inbox.past_clock","inbox.readback_failed"],"owner_field":"owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.message_id","seam.thread_id","seam.kind","seam.record_ref","seam.owner","seam.due","seam.status","seam.released_by"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/tenant-inbox","bot":"https://x.ai/bot/Ffz42iAER2J9-HYW7AIRC"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Triage tenant complaints with GPT-4.1, Slack, email and Google Sheets","original_author":"Hyrum Hurst","share_link":"https://n8n.io/workflows/12428","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"inbox-triage","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:07:19.068Z","run_id":"run-1793711239066","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"terms-watch","name":"Terms Watch","office_task":"Each business day, chase the customers whose invoices are past their due date, biggest risk first, inside the calling rules, and turn each reply with a date into a promise.","verticals":["b2b-office"],"standards":["debtor-chasing"],"systems_of_record":["the ledger that issues the invoice_id (Xero, MYOB or QuickBooks): its invoices, contacts and invoice history","the mail system that issues the message_id of a debtor's reply (Gmail, Outlook)"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"invoice.overdue","wake":"webhook"},{"event":"email.received","wake":"webhook"},{"event":"payment.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"promise.recorded","write":"a dated promise to pay on the invoice in the ledger, from a debtor's reply: the date (required), the amount (empty when none was given) and when it was captured; the promised date becomes the follow-up date, and a logged dispute is never overwritten","readback":"the promise is read back from the ledger by invoice_id (Xero: GET /api.xro/2.0/Invoices/{InvoiceID} returns ExpectedPaymentDate, and GET .../Invoices/{InvoiceID}/History returns the promise note); no read-back means debtor.promise_write_failed is raised and no promise.recorded is emitted"},{"event":"exception.raised","write":"an exception on the invoice naming the person who owns it: a dispute, a relationship-sized balance, hardship stated, a reply with no date, an override with no named approver, a promise that did not read back, or late-payment interest worked out from a rate the invoice's own terms cite and held for a person to decide","readback":"the exception desk returns an exception_id, and reading that id back returns the invoice_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["debtor.dispute_open","debtor.relationship_account","debtor.hardship_stated","debtor.no_date_given","debtor.override_refused","debtor.promise_write_failed","debtor.interest_held_for_person","debtor.customer_unreadable"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.invoice_id","seam.bucket","seam.promise_date","seam.promise_captured_at","seam.gate_reason","seam.interest_basis","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/terms-watch","bot":"https://x.ai/bot/idNTCkR2kEhvjf5Myzk44"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"debtor-chasing","edition":"2026-10-06","environment":"stub","ran_at":"2026-11-03T13:22:12.878Z","run_id":"run-1793712132876","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:21:51.375Z","run_id":"run-1793712111374","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"test-sheet-check","name":"Test Sheet Check","office_task":"When a job's test result sheet comes in, check every test is filled in and in range before the certificate is written, and put any failed or blank test in front of the licensed electrician.","verticals":["fire-electrical"],"standards":["rejected-pack"],"systems_of_record":["the job system that issues the job_id the test sheet belongs to (ServiceM8, Simpro or Tradify's job export)","the mail system that issues the message_id the test sheet arrived on (the office's Gmail or Outlook mailbox)","the document store that holds the filed original sheet (SharePoint, OneDrive or Google Drive)","the exception desk the business runs, holding each stopped test sheet with its named owner"],"consumes":[{"event":"email.received","wake":"webhook"},{"event":"job.completed","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the test result sheet from the message, filed against the job by its job_id, with each reading (insulation resistance, earth continuity, polarity, circuit connections, fault loop impedance, RCD trip time where an RCD is in scope) as a graph field carrying its confidence, the instrument serial and calibration date, every written not-applicable with its rule, the queue after the eight checks in order, the certificate due date derived from the dated rule, and the as-of date; after the licensed electrician releases it, the self-contained test record the certificate is written from","readback":"reading the job by its job_id from the job system returns the filed sheet with the message_id and seam.queue, seam.failed_check, seam.certificate_due and seam.as_of; no document back with that message_id means it was not filed and the run raises an exception instead"},{"event":"exception.raised","write":"an exception on the job naming the licensed electrician who tested it: the first check that failed (the sheet is for another job, a licence or the instrument's calibration out of date, no procedure loaded, a blank test, a reading out of range, or two contractor licence numbers), readings waiting for a person to confirm, or a test record waiting for the electrician's named release","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the message_id, the failed check with its reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["testsheet.wrong_job","testsheet.licence_or_calibration_lapsed","testsheet.no_procedure_for_state","testsheet.test_blank","testsheet.reading_out_of_range","testsheet.two_licence_numbers","testsheet.yellow_readings","testsheet.awaiting_release"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.message_id","seam.queue","seam.failed_check","seam.rule_version","seam.certificate_due","seam.as_of","seam.accepted_by","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/test-sheet-check","bot":"https://x.ai/bot/zKr0KmcdFwPEyOXfc9CgP"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:12:08.692Z","run_id":"run-1793794328690","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"threshold-watch","name":"Threshold Watch","office_task":"Every Monday, check job margin, debtors and cash, and when one has moved past the line we set since last week, tell the person we named, with both weeks' figures and where they came from.","verticals":["accounting-bookkeeping"],"standards":["recurring-report"],"systems_of_record":["the job system (Simpro, ServiceM8 and the like): gross margin on jobs completed in the week, read only","the ledger (Xero or MYOB): debtors outstanding, debtors over sixty days and the reconciled bank balance, read only","the system the report is published into, which issues the report_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"one view of the week's key numbers per audience (owner, external accountant), each figure carrying its definition id, source and as-of time, or published as unavailable with the reason; a correction is a new version superseding the old, with the named person and the reason","readback":"reading the period's reports back returns each report_id with its version, published_at and published_by; no id back means it was not published and report.publish_failed is raised"},{"event":"exception.raised","write":"an exception naming the definition's owner or the threshold's person: a source that could not be read, a measure with no definition or two, a threshold that could not be compared because a week's figure is unavailable, a correction missing a person or reason, or a view that did not read back","readback":"the exception desk returns an exception_id, and reading that id back returns the period, the measure, the reason and the exception_owner"}],"exceptions":{"raises":["report.source_unreadable","report.no_definition","report.conflicting_definitions","report.threshold_not_comparable","report.correction_incomplete","report.correction_unknown_measure","report.publish_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.report_id","seam.period","seam.version","seam.supersedes","seam.published_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/threshold-watch","bot":"https://x.ai/bot/bTxdzi3mlQIkKA4n3ILlr"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"recurring-report","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:57:44.202Z","run_id":"run-1793797064201","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"tier-quote","name":"Tier Quote","office_task":"When a job is booked, draft one quote with good, better and best options from our own tier list, each line at our own price-list rate, or park it, and leave it for us to send.","verticals":["trades-building"],"standards":["quote-out"],"systems_of_record":["ServiceM8","Simpro","Xero (Items as the price list, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"One draft quote on the job it was drafted from, ex GST, holding two or three named options (Good, Better and Best unless the business renames them), in the tier list's order and under its labels. Every line in every option is a catalogue id the tier list names for that kind of work, at the rate read from the business's own price list at draft time; each option carries its own total and there is no sum across options. Where the system cannot hold options on one quote, one draft per option carries the job id and the option label and the set counts as the one quote. It is left in draft for the person who owns quotes; this node has no way to send it, mark the customer's choice or void an option.","readback":"The quote is read back by the id the system returned (ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id and every option label. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote as an exception on the job: the park reason from the standard's fixed list (not_in_pricebook, variation_to_accepted_quote, discount_requested, pricebook_unreadable, no_tier_map, too_many_options), each option's priced lines, the line that did not price and the option it was in, no total, and exception_owner set to the person the business named for quotes. Once a person marks the option the customer chose, the same owner is told which other options to void or decline.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.no_tier_map","quote.too_many_options","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/tier-quote","bot":"https://x.ai/bot/eN8USgnAZwBkifScDWp1L"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-11-05","environment":"stub","ran_at":"2026-11-04T22:24:38.013Z","run_id":"run-1793831078011","green":10,"red":0,"with_us":1,"evidence_required":0,"total":15},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T22:25:00.114Z","run_id":"run-1793831100112","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"timesheet-billing","name":"Timesheet Billing","office_task":"When a client's timesheet period closes, draft its invoice in Xero from the hours at our rate card, park what it cannot price, and hold it for a named person to release.","verticals":["b2b-office"],"standards":["invoice-out"],"systems_of_record":["the job system that holds each client engagement's billing periods, with the time entries filed from the staff's emailed timesheets, and issues the period's id (carried as job_id)","Xero, which issues the invoice_id"],"consumes":[{"event":"job.completed","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"invoice.raised","write":"One draft invoice in Xero per closed billing period, referenced job:<period id> (and the stage under a fixed-stage contract), every line one of the period's time entries or expenses with its timesheet entry reference in the notes, every rate read from the rate card at draft time, and the client's signed approval attached for out-of-scope hours. A second completion event updates the same draft.","readback":"Xero returns the InvoiceID; GET /api.xro/2.0/Invoices/{InvoiceID} must return the invoice with Reference job:<period id>, and that id is stamped on the period as seam.invoice_id. No id back is not a write: it raises invoice.write_failed and the run stops."},{"event":"invoice.sent","write":"The invoice leaves only after a release naming the accounts officer, or naming the rule they set and showing the total is under its threshold; the release and the send time are recorded against the period.","readback":"GET /api.xro/2.0/Invoices/{InvoiceID} returns it AUTHORISED and sent to the contact, and the period read by its id shows seam.released_by (a person or a rule) before the send time. A send with no release on the record is refused."},{"event":"exception.raised","write":"A parked or waiting invoice as an exception on the billing period: the reason from the standard's fixed list (not_in_pricebook, unsigned_variation, write_failed) or over_threshold, the period id, the invoice id, the codes left unpriced, and exception_owner set to the person the firm named for billing.","readback":"The exception desk returns an exception_id, and reading it back returns the job_id, the invoice_id, the reason and the exception_owner; the next run reads it there and stops until exception.closed."}],"exceptions":{"raises":["invoice.not_in_pricebook","invoice.unsigned_variation","invoice.write_failed","invoice.over_threshold"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.invoice_id","seam.quote_id","seam.book_edition","seam.status","seam.park_reason","seam.released_by","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/timesheet-billing","bot":"https://x.ai/bot/ixPMMQ4E7sdw7XaiysbQ3"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Convert emailed timesheets into QuickBooks invoices with OCR, AI, Gmail and Sheets","original_author":"DIGITAL BIZ TECH","share_link":"https://n8n.io/workflows/13092","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-out","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T13:13:58.619Z","run_id":"run-1793711638617","green":7,"red":0,"with_us":1,"evidence_required":1,"total":12},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:13:44.225Z","run_id":"run-1793711624224","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"trim-quote","name":"Trim Quote","office_task":"When a finish-carpentry job has its labour hours on it, draft the quote as hours times our own sell-rates, or park it with a reason, and leave it for us to send.","verticals":["trades-building"],"standards":["quote-out"],"systems_of_record":["ServiceM8","Simpro","Xero (Items as the price list, Quotes)"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"}],"emits":[{"event":"quote.drafted","write":"A draft quote on the job it was drafted from, ex GST. Each line carries a catalogue id from the business's own price list, that item's sell-rate as read at draft time, and the quantity from the job: labour hours for an hourly line. The amount is quantity times rate and nothing else. It is left in draft, editable, for the person who owns quotes; this node has no way to send it.","readback":"The quote is read back by the id the system returned (ServiceM8 GET /api_1.0/jobquote/{uuid}.json, Simpro GET /api/v1.0/companies/{companyID}/quotes/{quoteID}, Xero GET /api.xro/2.0/Quotes/{QuoteID}) and must carry the job id. No id back is not a write: it raises quote.write_failed."},{"event":"exception.raised","write":"A parked quote, or a job sent back for hours, as an exception on the job: the park reason from the standard's fixed list (or hours_missing), the lines that did price with their catalogue ids, the work that did not, no total, and exception_owner set to the person the business named for quotes.","readback":"The exception desk returns an exception_id; reading the job by its id shows the open exception with its exception_owner, and the next hop reads it there and stops."}],"exceptions":{"raises":["quote.not_in_pricebook","quote.variation_to_accepted_quote","quote.discount_requested","quote.pricebook_unreadable","quote.hours_missing","quote.write_failed"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.quote_id","seam.status","seam.exception_owner"]},"runtime":["node","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/trim-quote","bot":"https://x.ai/bot/nD6lItLwTVA0sYoWoMbwI"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Estimator","original_author":"Mike A","share_link":"https://x.ai/bot/NOh5kiDUMNc7AJrAJSsI0","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"quote-out","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:52:19.223Z","run_id":"run-1793713939222","green":7,"red":0,"with_us":1,"evidence_required":0,"total":11},{"standard":"cash-seam","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:53:12.189Z","run_id":"run-1793713992188","green":4,"red":0,"with_us":1,"evidence_required":1,"total":9}]},{"slug":"van-board","name":"Van Board","office_task":"Turn each service work order into a dispatch package: verified address, a licensed tech at a time that fits, customer and tech told once, the rest handed to the dispatcher.","verticals":["trades-building"],"standards":["dispatch-board"],"systems_of_record":["the job system that issues the job_id and holds its schedule (ServiceM8, Simpro or Jobber)","the tech licence register the business keeps"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"the dispatch package on the work order: one slot on the job's schedule (tech, start, end, resolved address, the rule or named dispatcher that set it, what displaced it), updated in place on a change and never written twice, with the customer confirmation attached as evidence","readback":"the job system returns the slot's external id, and reading the job's slot back by job_id returns that external id and the job version it was made for; no id back is a failed write, escalated as write_failed, and nothing is sent"},{"event":"exception.raised","write":"an escalation on the work order naming its owner: an address that will not resolve, no tech with a current licence for the work, a window too short for the job, no capacity, no consent to message the customer, a failed slot write, or a displaced job that could not be re-slotted","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.customer_message_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/van-board","bot":"https://x.ai/bot/hwn40Cr23iScTLc2fBXaS"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Claire","original_author":"Thomas Matteson","share_link":"https://x.ai/bot/G6MW63VZ6uLP6tPnL0nCR","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:44:05.198Z","run_id":"run-1793713445197","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"van-stock","name":"Van Stock","office_task":"Reserve what the van and store already hold for each job, order only the shortfall from the approved wholesaler at catalogue price, and match every docket back.","verticals":["trades-building"],"standards":["material-order"],"systems_of_record":["the job system that issues the job_id, holds its material list and its van and store stock (ServiceM8, Simpro, Tradify, Fergus or similar)","the wholesaler portal or job-system purchasing that issues each order's external id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.updated","wake":"webhook"},{"event":"document.received","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"order.sent","write":"one purchase order per job and supplier, for the lines van and store stock do not cover, priced from that supplier's catalogue read at order time, released by the threshold rule or a named person and sent against the job","readback":"the ordering system returns the order's external id, and reading that id back returns the job_id, the supplier, the lines, the catalogue edition and the release; no id back means it was not written and it is parked with a person named"},{"event":"delivery.recorded","write":"the delivery docket matched to its sent order on the job, line by line, with the quantity received and a reason (short, damaged, substituted) on any line that differs","readback":"reading the job's record by job_id returns the delivery against the order's id with its docket id and every line; a docket that matches no sent order is not recorded and is raised instead"},{"event":"exception.raised","write":"an exception on the job or the order naming the person who owns it: an order waiting for a named release (over the threshold, or to a supplier not on the approved list), a code no catalogue holds, an order write with no id back, a docket that matches no sent order, and every delivery variance (short, over, wrong item, changed price, damage, unaccepted substitution)","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the order id where one exists, the kind and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["material.release_needed","material.not_in_catalogue","material.write_failed","material.no_order_for_docket","material.short","material.over","material.wrong_item","material.price_changed","material.damaged","material.substitution_unaccepted"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.stock_reserved","seam.order_external_id","seam.supplier_id","seam.catalogue_edition","seam.released_by","seam.order_status","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/van-stock","bot":"https://x.ai/bot/Wd16GWgJapSjLeCaGCj9j"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"material-order","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T14:00:58.649Z","run_id":"run-1793714458647","green":9,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"variation-chase","name":"Variation Chase","office_task":"Each weekday, chase the signature on every variation the office has approved, stop the day it comes back signed, and hand a no or a silent party to a named person.","verticals":["trades-building"],"standards":["follow-up"],"systems_of_record":["the job system's variation register, one open item per approved variation awaiting signature on the job (Simpro, ServiceM8 or a Google Sheet kept beside the job system), which issues the job_id and the item id","the office mailbox (Gmail or Outlook) the signed variation comes back to, which issues the message_id"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"evidence.filed","write":"the signed variation (or the certificate, PO number or form the job waited on) filed as evidence against its open item on the job, which marks the item arrived so the variation can go on the next progress claim","readback":"reading the item back by its id returns status arrived with the arrival's evidence reference, which names the message_id of the email that carried the signed copy and the job_id it belongs to; no evidence reference back means it was not filed, and the item gets no touch until a person looks"},{"event":"exception.raised","write":"an escalation on the item naming the cadence's person: the other side said no, disputed the variation or asked us to stop, or the item reached its cap with nothing back, carrying every touch so far","readback":"the exception desk returns an exception_id, and reading that id back returns the item id, the job_id, the reason, the touch history and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["followup.declined","followup.dispute","followup.cap_reached"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.item_id","seam.item_status","seam.touches","seam.outcome","seam.evidence_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/variation-chase","bot":"https://x.ai/bot/MBVYk59wJRwH4Rn8Vt_e_"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Review, approve, and chase subcontractor change orders with forms, DeepSeek, Gmail, and Google Sheets","original_author":"Khaisa Studio","share_link":"https://n8n.io/workflows/21993","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"follow-up","edition":"2026-10-05","environment":"stub","ran_at":"2026-11-03T13:53:08.721Z","run_id":"run-1793713988719","green":10,"red":0,"with_us":1,"evidence_required":1,"total":13}]},{"slug":"vendor-actuals","name":"Vendor Actuals","office_task":"Check each supplier invoice against its purchase order and what the supplier has claimed to date, clear what matches for a person to approve, and hand the rest to a named owner.","verticals":["b2b-office"],"standards":["invoice-check"],"systems_of_record":["Xero or MYOB (the ledger that issues the bill_id and holds the purchase orders)","the record of work marked complete against each purchase order (the job system or schedule of rates)","the document store where the invoice copies and written variation approvals live (Google Drive or SharePoint)"],"consumes":[{"event":"bill.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"bill.checked","write":"a clean match stamped on the bill: the purchase order it names, the four check records with what each saw (agreed and invoiced rate, quantity complete less claimed before, written variation approvals, claimed to date against the contract sum plus approved variations), the dated tolerances used, and queue done_reversible, waiting for a named person to approve. Nothing is approved or paid.","readback":"the bill read back from the ledger by its bill_id returns seam.order_ref, seam.queue = done_reversible and the four passed check records; no bill back by that id means nothing was stamped, an exception is raised and the run stops"},{"event":"exception.raised","write":"an exception on the bill naming the person who owns supplier invoices: the check that failed and the checks that never ran, the difference in dollars, the cumulative position, the source document, and its queue (needs a decision, sorted by dollars at risk; waiting on the supplier for a copy; or blocked: no purchase order named, or scope with no written approval)","readback":"the exception desk returns an exception_id, and reading that id back returns the bill_id, the failed check, the dollar difference, the source document and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["bill.no_purchase_order","bill.purchase_order_not_found","bill.no_source_document","bill.rate_mismatch","bill.quantity_over_complete","bill.unapproved_scope","bill.contract_sum_overrun"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.bill_id","seam.order_ref","seam.queue","seam.failed_check","seam.never_ran","seam.difference","seam.claimed_to_date","seam.tolerance_version","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/vendor-actuals","bot":"https://x.ai/bot/gzi6APvcNStap7wSV_zpw"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Invoice Coordinator","original_author":"SpaceX","share_link":"https://x.ai/bot/s072bae9387b9fc03cac8","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"invoice-check","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:19:51.162Z","run_id":"run-1793711991161","green":7,"red":0,"with_us":1,"evidence_required":1,"total":11}]},{"slug":"vendor-pack","name":"Vendor Pack","office_task":"Read each vendor's licence and insurance papers as they land, log the key fields and expiry dates, and hold anything unsure, missing or expired for a named person.","verticals":["b2b-office"],"standards":["rejected-pack"],"systems_of_record":["the document store that issues the document_id (Google Drive or SharePoint)","the vendor register that holds the graph and the pack queues, issuing the report_id and exception_id"],"consumes":[{"event":"document.received","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"report.published","write":"the vendor's pack: one handover artefact derived from the graph (ABN, legal name, address, each document's class, number and expiry), every clause citing its dated rule, an as-of date and the named person's version record, released only after that person accepted this exact version","readback":"the vendor register returns a report_id for the pack, and reading that id back returns the pack's queue, its as-of date and the version record naming the person; a refused handover returns no id and nothing was published"},{"event":"exception.raised","write":"the pack moved to Yellow (a field read below the confidence gate), Hold (an applicable document missing) or Fail (ABN not active, a name or ABN mismatch, an expired document, no rule in force), with the reason and the vendor's exception_owner","readback":"the vendor register returns an exception_id, and reading it back returns the pack id, the queue, the first check that stopped it with the reason, and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["pack.low_confidence_field","pack.identity_failed","pack.document_expired","pack.applicability_unknown","pack.document_missing","pack.abn_mismatch","pack.no_rule_in_force","pack.awaiting_release","pack.handover_refused"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.document_id","seam.queue","seam.failed_check","seam.yellow_fields","seam.rule_version","seam.as_of","seam.accepted_by","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/vendor-pack","bot":"https://x.ai/bot/DBI5zuebNwuCO37cXQhfl"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Monitor vendor compliance documents and expiries with Google Drive, OpenAI, Sheets, Gmail, and Slack","original_author":"Javed Iqbal","share_link":"https://n8n.io/workflows/20324","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"rejected-pack","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:28:48.806Z","run_id":"run-1793712528805","green":9,"red":0,"with_us":1,"evidence_required":0,"total":13}]},{"slug":"visit-offer","name":"Visit Offer","office_task":"Offer the customer real visit times off the licensed tech's calendar, book the one they pick as the job's single slot, and tell the customer and the tech once.","verticals":["trades-building"],"standards":["dispatch-board"],"systems_of_record":["the job system that issues the job_id and holds its schedule (ServiceM8, Simpro or Jobber)","the tech licence register the business keeps"],"consumes":[{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"schedule.tick","wake":"schedule"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"the visit the customer picked, as one slot on the job's schedule in the job system (tech, start, end, resolved address, the rule or person that set it, the job version it was made for), moved in place on a change and never written twice","readback":"the job system returns the slot's external id, and reading the job's slot back by job_id returns that external id and job version; no id back is a failed write, escalated as write_failed, and nothing is sent to the customer or the tech"},{"event":"exception.raised","write":"an escalation on the job naming the dispatcher as owner: an address that will not resolve, no tech with a current licence, a window shorter than the visit, no free time to offer, no consent to message the customer, a failed slot write, or a displaced job that could not be re-slotted","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.customer_message_ref","seam.exception_owner"]},"runtime":["node","webhook","schedule","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/visit-offer","bot":"https://x.ai/bot/CYrVJ7xSzcsGLsVsYaHSe"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":{"credited":true,"original_name":"Offer and confirm technician visit slots with Google Calendar, Gmail, Sheets, and Telegram","original_author":"Dmytro","share_link":"https://n8n.io/workflows/18092","licence_or_permission":"reimplementation"},"status":"listed","listed_at":"2026-11-03","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-03T13:45:18.060Z","run_id":"run-1793713518058","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]},{"slug":"visit-round","name":"Visit Round","office_task":"Each period, book the next visit on every maintenance contract with a licensed tech inside the customer's window, and hand lapsed contracts and visits no tech is free for to a named person.","verticals":["trades-building"],"standards":["dispatch-board"],"systems_of_record":["the job system that issues the job_id, raises each contract's next visit job and holds its schedule (ServiceM8, Simpro or Jobber)","the tech licence register the business keeps"],"consumes":[{"event":"schedule.tick","wake":"schedule"},{"event":"job.created","wake":"webhook"},{"event":"job.updated","wake":"webhook"},{"event":"exception.closed","wake":"webhook"}],"emits":[{"event":"job.updated","write":"the contract visit's booking on its job: one slot on the job's schedule (licensed tech, start, end, resolved address, the rule or named dispatcher that set it, what displaced it), updated in place when the visit changes and never written twice, with the customer confirmation attached as evidence","readback":"the job system returns the slot's external id, and reading the job's slot back by job_id returns that external id and the job version it was booked for; no id back is a failed write, escalated as write_failed, and nothing is sent"},{"event":"exception.raised","write":"an escalation on the visit job naming its owner: a contract that has lapsed (to the contract owner), an address that will not resolve, no tech with a current licence for the work, a window too short for the visit, no tech free in the window, no consent to message the customer, a failed slot write, or a visit moved off by an emergency that could not be re-booked","readback":"the exception desk returns an exception_id, and reading that id back returns the job_id, the reason and the exception_owner; no id back means nothing was raised and the run stops"}],"exceptions":{"raises":["visit.contract_lapsed","dispatch.address_unresolved","dispatch.no_licensed_tech","dispatch.window_impossible","dispatch.no_capacity","dispatch.no_consent","dispatch.write_failed","dispatch.displaced"],"owner_field":"exception_owner","halts_on_open":true},"durable_state":{"writes_to":"system-of-record","fields":["seam.job_id","seam.contract_id","seam.slot_external_id","seam.job_version","seam.updated_by","seam.displaced_by","seam.customer_message_ref","seam.exception_owner"]},"runtime":["node","schedule","webhook","grok-bot-template"],"links":{"repo":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh/nodes/visit-round","bot":"https://x.ai/bot/FvrBJqMOMxlR0j8qzJzkd"},"maintainer":{"name":"AI Pathway","github":"digitalgym"},"port_of":null,"status":"listed","listed_at":"2026-11-04","routable":true,"evidence_kind":"self-run","evidence":[{"standard":"dispatch-board","edition":"2026-10-03","environment":"stub","ran_at":"2026-11-04T12:18:38.414Z","run_id":"run-1793794718411","green":8,"red":0,"with_us":1,"evidence_required":1,"total":12}]}],"routable":["after-hours-desk","ageing-monday","agent-rules-desk","agreement-chase","arrears-desk","arrival-brief","backflow-watch","balance-proof","bank-questions","bill-check","billing-match","branch-drift","buy-desk","cash-ahead","chase-book","chase-desk","chase-list","claim-check","claim-clock","claim-match","client-review-watch","client-site-report","close-check","comeback-list","comp-check","comp-report","company-review-watch","consultant-hours","contract-billing","cost-desk","cover-check","crew-board","danger-tag-desk","day-desk","deadline-desk","deal-match","defect-desk","defect-quote","delivery-billing","deposit-match","design-quote","docket-billing","docs-due","draw-match","drawing-register","dropped-ball","estimate-desk","expense-check","fact-library","fault-desk","feed-match","fire-code-desk","fire-round-watch","fix-book","folder-brief","gas-tally","goods-match","handbook-desk","handover-manual","hours-audit","hours-check","inbox-desk","install-book","intercompany-match","invoice-desk","invoice-hold","invoice-pair","job-files","job-hours","job-sheet","job-wip","jobs-weekly","late-rent-desk","lead-payback","lead-sort","lease-dates","licence-watch","loan-intake","lodgement-watch","manual-desk","margin-watch","matter-billing","measure-quote","meeting-notes","month-pack","notice-check","nudge-desk","open-home-desk","ops-map","order-release","outgoings-book","outgoings-desk","owing-today","parts-check","parts-quote","payment-watch","permit-answers","plant-watch","po-match","policy-desk","portal-match","practice-desk","prestart-desk","price-creep","price-sheet","progress-desk","promise-watch","proposal-desk","quote-desk","quote-keeper","quote-nudge","rack-watch","receipt-chase","recharge-desk","renewal-watch","rent-watch","rental-safety-watch","repair-board","retention-book","review-ask","ring-list","roof-desk","route-plan","safety-cert-desk","seller-book","seller-weekly","service-due","sign-in-follow-up","site-drop","site-orders","site-test-check","software-audit","spend-watch","stage-billing","starter-pack","sub-pay-check","swms-desk","takeoff-quote","task-clock","tenant-inbox","terms-watch","test-sheet-check","threshold-watch","tier-quote","timesheet-billing","trim-quote","van-board","van-stock","variation-chase","vendor-actuals","vendor-pack","visit-offer","visit-round"],"edges":[{"from":"after-hours-desk","to":"crew-board","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"design-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"repair-board","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"route-plan","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"van-board","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"after-hours-desk","to":"visit-round","event":"job.created","id":"job_id"},{"from":"crew-board","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"order-release","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"van-board","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"crew-board","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"crew-board","event":"job.created","id":"job_id"},{"from":"day-desk","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"design-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"day-desk","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"day-desk","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"day-desk","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"day-desk","to":"repair-board","event":"job.created","id":"job_id"},{"from":"day-desk","to":"route-plan","event":"job.created","id":"job_id"},{"from":"day-desk","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"day-desk","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"day-desk","to":"van-board","event":"job.created","id":"job_id"},{"from":"day-desk","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"day-desk","to":"visit-round","event":"job.created","id":"job_id"},{"from":"day-desk","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"order-release","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"van-board","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"day-desk","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"deposit-match","to":"chase-book","event":"payment.received","id":"payment_id"},{"from":"deposit-match","to":"chase-desk","event":"payment.received","id":"payment_id"},{"from":"deposit-match","to":"invoice-pair","event":"payment.received","id":"payment_id"},{"from":"deposit-match","to":"owing-today","event":"payment.received","id":"payment_id"},{"from":"deposit-match","to":"payment-watch","event":"payment.received","id":"payment_id"},{"from":"deposit-match","to":"terms-watch","event":"payment.received","id":"payment_id"},{"from":"fault-desk","to":"crew-board","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"design-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"repair-board","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"route-plan","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"van-board","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"visit-round","event":"job.created","id":"job_id"},{"from":"fault-desk","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"order-release","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"van-board","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"fault-desk","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"install-book","to":"crew-board","event":"job.created","id":"job_id"},{"from":"install-book","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"design-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"install-book","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"install-book","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"install-book","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"install-book","to":"repair-board","event":"job.created","id":"job_id"},{"from":"install-book","to":"route-plan","event":"job.created","id":"job_id"},{"from":"install-book","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"install-book","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"install-book","to":"van-board","event":"job.created","id":"job_id"},{"from":"install-book","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"install-book","to":"visit-round","event":"job.created","id":"job_id"},{"from":"job-sheet","to":"contract-billing","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"day-desk","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"delivery-billing","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"docket-billing","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"fix-book","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"handover-manual","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"install-book","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"invoice-desk","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"invoice-hold","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"job-hours","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"matter-billing","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"outgoings-desk","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"recharge-desk","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"review-ask","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"safety-cert-desk","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"service-due","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"site-test-check","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"stage-billing","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"test-sheet-check","event":"job.completed","id":"job_id"},{"from":"job-sheet","to":"timesheet-billing","event":"job.completed","id":"job_id"},{"from":"portal-match","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"order-release","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"van-board","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"portal-match","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"order-release","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"van-board","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"practice-desk","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"quote-desk","to":"quote-keeper","event":"quote.sent","id":"quote_id"},{"from":"quote-desk","to":"quote-nudge","event":"quote.sent","id":"quote_id"},{"from":"repair-board","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"order-release","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"van-board","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"repair-board","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"roof-desk","to":"crew-board","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"design-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"repair-board","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"route-plan","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"van-board","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"roof-desk","to":"visit-round","event":"job.created","id":"job_id"},{"from":"route-plan","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"order-release","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"van-board","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"route-plan","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"service-due","to":"crew-board","event":"job.created","id":"job_id"},{"from":"service-due","to":"defect-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"design-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"estimate-desk","event":"job.created","id":"job_id"},{"from":"service-due","to":"manual-desk","event":"job.created","id":"job_id"},{"from":"service-due","to":"measure-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"parts-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"proposal-desk","event":"job.created","id":"job_id"},{"from":"service-due","to":"quote-desk","event":"job.created","id":"job_id"},{"from":"service-due","to":"repair-board","event":"job.created","id":"job_id"},{"from":"service-due","to":"route-plan","event":"job.created","id":"job_id"},{"from":"service-due","to":"swms-desk","event":"job.created","id":"job_id"},{"from":"service-due","to":"takeoff-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"tier-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"trim-quote","event":"job.created","id":"job_id"},{"from":"service-due","to":"van-board","event":"job.created","id":"job_id"},{"from":"service-due","to":"visit-offer","event":"job.created","id":"job_id"},{"from":"service-due","to":"visit-round","event":"job.created","id":"job_id"},{"from":"van-board","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"van-board","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"van-board","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"van-board","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"order-release","event":"job.updated","id":"job_id"},{"from":"van-board","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"van-board","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"van-board","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"van-board","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"van-board","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"van-board","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"van-board","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"van-board","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"van-board","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"van-board","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"van-board","to":"visit-offer","event":"job.updated","id":"job_id"},{"from":"van-board","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"order-release","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"van-board","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"visit-offer","to":"visit-round","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"arrival-brief","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"buy-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"crew-board","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"danger-tag-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"day-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"defect-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"design-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"estimate-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"hours-check","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"measure-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"order-release","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"parts-check","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"parts-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"proposal-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"quote-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"repair-board","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"retention-book","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"review-ask","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"route-plan","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"safety-cert-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"site-orders","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"site-test-check","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"swms-desk","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"takeoff-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"tier-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"trim-quote","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"van-board","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"van-stock","event":"job.updated","id":"job_id"},{"from":"visit-round","to":"visit-offer","event":"job.updated","id":"job_id"}],"source":"https://github.com/digitalgym/aipathway-standards/tree/main/mesh"}