WAC codes enforced in code, not in a binder.
Audit-log on every keystroke. Vertical-ID stop at the cart. Manager-PIN prompts cite the WAC code. WA excise + LIQ-1295 math at $0.01 precision, pulled direct from line items. Document vault with WSLCB-grade retention. The auditor’s first stop — you grep, you don’t reconstruct.
Four ways compliance breaks on a cannabis floor.
‘We’ll figure it out when they show up’ doesn’t survive the inspector knock.
WSLCB walks in. They want the void log for the last 90 days. They want the under-21 attempt log. They want the manifest variance log on the last six wholesale receipts. If your answer is ‘let me reconstruct it,’ the answer is wrong. CannAgent writes audit_log on every keystroke. You grep, you don’t reconstruct.
WAC 314-55-155 isn’t a poster, it’s the cart.
‘No false or misleading statements’ / ‘no medical claims’ isn’t enforced by a sign — it’s enforced where the language renders. Vertical-ID stop runs at the cart with DOB + under-21 logging. Brand-voice rules block efficacy claims at write-time on every customer-facing surface. The WAC code rides next to the rule in code, so the ‘why’ is one click away from the ‘what.’
Excise + sales tax math at $0.01 precision, not ‘close enough.’
37% WA cannabis excise + ~8.7% local sales tax = 1.458 multiplier on the final bill. Every line item carries the breakdown at write-time. LIQ-1295 monthly filing pulls direct from sale_line_items.pre_tax_revenue, not a back-out estimate. When the auditor asks for the receipt-to-form trace, you have it.
Document vault, not document email-thread.
Vendor licenses, manifest copies, COAs, security logs, training-completion records, age-verification photos — all live in one searchable vault with retention rules per WAC 314-55-083 (3-year minimum). Expiry alerts fire 30 days out. Doug doesn’t hunt through Gmail when WSLCB asks.
Eight surfaces, audit-traceable end to end.
Audit-log on every keystroke
Every transaction, void, override, age-verification, manifest receive, employee record edit — actor + reason + before/after delta written to audit_log at write-time. Searchable by /admin/audit-log, exportable as CSV per case-ID.
Vertical-ID stop at the cart
DOB-mismatch + under-21 + missing-document blocks fire on the cart screen, not on a poster. Each attempt logged. Surfaces on /admin/age-verification with photo + outcome.
Manager-PIN gates with WAC citations
Voids, returns, manual prices, discount overrides — all gated. The PIN-prompt UI cites the WAC code that drives the gate so the budtender learns the rule, not just the click.
Automated WA excise + sales tax math
37% excise + locality-aware sales tax computed at write-time per line. LIQ-1295 monthly filing pulls direct from line items. Tax-basis math respects 280E for write-offs.
Document vault with WSLCB retention
Vendor licenses, manifests, COAs, security logs, age-verification photos, training records — searchable + retention-tagged per WAC 314-55-083. Expiry alerts fire 30 days out.
Brand-voice + medical-claims gate
Customer-facing copy passes through a write-time check that flags efficacy claims (WAC 314-55-155) before they ship. Catches drift before the regulator does.
POS audit trail tied to seed-to-sale
Cultivera/LeafLink wholesale receive ties to inventory_snapshots, then to sale_line_items, then to audit_log. The chain of custody is queryable end to end.
Training + cert-expiry tracker
Mandatory trainings (RCW 69.50.354 / WAC 314-55-079) tracked per employee with expiry alerts. PIN gates won’t fire for staff with expired training.
CannAgent vs. the alternatives.
Operator-reported. Full deep-dives at /vs/dutchie, /vs/blaze, /vs/treez.
| Capability | CannAgent | Dutchie | BLAZE | Treez |
|---|---|---|---|---|
| Audit-log on every keystroke | Built-in, write-time | Limited | Limited | Limited |
| WAC code citations in UI | In manager-PIN prompts | Not present | Not present | Not present |
| WA LIQ-1295 monthly filing pull | Direct from line items | External tool | External tool | External tool |
| Document vault with retention rules | WAC 314-55-083 ready | Available | Available | Available |
| Brand-voice / medical-claims gate | Write-time check | Not present | Not present | Not present |
| Training-expiry → PIN gate | Automatic | Manual track | Manual track | Manual track |
| Source available to your team | Yes | No | No | No |
Want to see the audit trail?
30-minute walkthrough on a real Washington-store deployment. We’ll grep audit_log live for an under-21 attempt, a void, a manifest-variance dispute — pick one.
Request a demo