SOP audit — October 2026¶
All 50 SOPs checked against the live system: ERP (read only), timers and cron, registers, project-note logs, and git.
sop-audit covers the ERP data. This audit covers the documents themselves.
Done today¶
- Released 10 SOPs. Each one has a history row naming the job that proves it is in use: 001, 004, 005, 019, 022, 039, 040, 046, 048, 049. SOP-000 was already active, so 11 are active now.
- SOP-000 v2.3.
- Releasing is a minor version bump plus a history row starting "Released:" that names the real job.
- Administration approves (the old text named the owner field, Engineering).
- New section: reading SOPs by index and section.
- New audit check
SOP-000.draft-overdue. It warns on any draft whose first history row is more than 30 days old.sop-tasksturns the warning into one task, so drafts can no longer sit unreleased without anyone noticing. 34 drafts are flagged today. sop-auditis back to 0 fail. SOP-047's revision history rows were newest-first; they are now oldest-first. Model names were removed from the By column in 6 SOPs.- Token routing.
rules/CLAUDE.md,full-rules.mdand the engineering, production and purchasing agents now read the SOP this way: - Read
sops/docs/index.md(about 1.7k tokens). - Run
grep -n '^## 'on the chosen SOP. - Read only the needed section.
Before, the routing pointed at the folder. Reading every SOP costs about 120k tokens; one section costs a few hundred.
Pass 2 — 2026-10-26 (fix and release)¶
23 of 50 SOPs are active now. The corpus dropped from 475 KB to 425 KB, and sop-audit shows 0 fail.
- Released with fixes:
- 002: legacy-import section and kit paragraph shortened.
- 003: Shipped bullet removed; Failed Robot boards moved to SOP-006.
- 006: the mistakes list now matches the steps; BOM steps are pointers.
- 008: dead tools and citations removed; §8 is now a pointer; 21 → 17.7 KB.
- 009: Administration does it; the hand-copied departments were replaced by
departments.yml. - 011: supplier list and email contradiction fixed.
- 017: Review and Verify text removed; mail cap is 300 (relay).
- 018: 47 → 13 KB. Social sections deleted; website pipeline only.
- 029: Zebra labels are uploaded by hand.
- 035: expired window and wrong timers fixed; 18.4 → 14.6 KB.
- 042: real daily schedule; the 5-a-week cap is confirmed in code.
- 043: deny-list now points to the code.
- Kept draft after fixes:
- 020 Credentials: the two human checks are still open. Is the safe in a different building? Does the Cloudflare login work without the vault?
- 031 Tool Interfaces: the tiles page is gone and Lucide is no longer referenced by the app. Decide what this SOP should describe.
- Still waiting on decisions above: 007, 010 (Net 30); 021 (CI path); 025 (helper ceiling); 047 (after 11-05).
- History tables repaired: 007, 010, 025, 027 (a blank line split the table).
- Code note:
DENYin~/assistant/job_failure.pystill lists the retired social jobs. It is harmless, so I left it alone.
Notes pipeline (fixed). At 00:07 the new draft's 61-character title failed check-seo. weekly-research left the draft uncommitted, and content-daily-prepare failed on it every hour after that.
- Today: the title was shortened to 54 characters and the draft committed to notes-queue. Prepare and reconcile are green, with 7 queued days.
- For good: a failed build now rejects the draft the same way a failed check does (assistant e4f182a).
Decisions needed (owner)¶
- Net 30 vs Net 14. Net 30 was decided on 2026-10-14. These still say Net 14:
- SOP-007 lines 55 and 71, and SOP-010 line 100.
~/assistant/actions.pyDEFAULT_TERMS, andstatic/invoice.htmllines 324 and 674.- The printed invoice template already says Net 30, so today the tool default and the printout disagree.
Recommend: change the code and the SOPs in one release. 2. Retire SOP-041 Android Account Setup. story-android was cancelled on 2026-10-25, and the map card already documents the tool. 3. Merge SOP-023 Opening Stock Count into SOP-005 as a short "first count" note. It was a one-off (2026-09-14 to 09-19), and the Intake / Stock count page it points to was parked on 2026-10-02. 4. Shipping tool. SOP-038 assumes a carrier API plugin, but SOP-044 says Pirate Ship click-to-buy. Your 10-13 log line wants automatic shipping (ShipEngine/ShipStation, undecided). Recommend: keep both as drafts and rewrite them as one SOP once the tool is chosen. 5. SOP-021 and GitHub Actions. Revision 1.4 says Actions were removed, but board repos still run them: Cow CI was green on 10-06 and Project_Template on 10-16. Which path is real? 6. SOP-033 Newsletter. Real imports ran on 09-11 and 09-14 with 0 errors. Do those count as the walkthrough? If yes, release it. 7. Retention gaps. - SOP-030 says chat transcripts are kept 30 days, but rows from 09-12 still exist because the sweep runs monthly. Fix the cadence or the period. - Recordings (SOP-048) and the Real Cow activity log (SOP-047) have no retention period set. 8. SOP-025: helper ceiling. SOP-025 says 6 parallel helpers; CLAUDE.md says 3. Which one is right?
Ready to release after small fixes (no decision needed)¶
These are in real use. Each needs the listed corrections, a minor bump, and a "Released:" row.
| SOP | Evidence | Fix before release |
|---|---|---|
| 002 Part Creation | Intake route and real parts, 2.4–2.7 | Shorten the legacy-import section and the kit paragraph (about 2.5 KB) |
| 003 Stock Locations | Counts 09-16 to 09-19; BO-0002 kitting | Drop the "Shipped" location bullet (SOP-007 forbids it); move "Failed Robot boards" to SOP-006 |
| 006 Assembly Builds | BO-0001 Complete, 5 more builds | Common-mistakes lines 75–83 contradict steps 9, 15, 17 and 18; the trackable check should exclude kits |
| 007 Sales Orders | SO-0001 invoiced and shipped 10-19 | Net 30 (decision 1); point to SOP-030 and SOP-026 instead of restating them |
| 008 KiCad Library | 148 symbols matched, BOM import 10-01 | Symbol count; step 27 is on an unmerged branch; bom-resolve does not exist; §8 is a plan, cut it to a pointer (about 5 KB) |
| 009 Onboarding | access-sync hourly | Department mapping is stale against departments.yml; step numbering jumps; onboard list --json times out (5 checks skip) |
| 010 Assistant Use | 646 chat turns, daily canary | Net 30; point to SOP-007 for terms |
| 011 Supplier Setup | 8 suppliers | Delete the stale supplier list; email is optional in one step and required in another |
| 017 Task Register | Daily timers, tasks #298 onward | Remove the stale Review and Verify text; the mail cap is 300 (Google relay), not Resend's 100 |
| 018 Content Publishing | Website pipeline live | Cut the social sections: about 29.5 KB of 47 KB (62%). This is the biggest token win. |
| 020 Credentials | Register and checks pass | The danger box and success box contradict each other; 35 unregistered keys; vault-audit not set up |
| 021 New PCB Design | hw/Robot-Cow-004B/A 09-16 |
Decision 5; fix step references; move the routing order to the README (about 3 KB) |
| 025 AI Work Allocation | Weekly budget line 10-19 | History rows sit outside the table; trial review overdue; decision 8; trim about 6 KB |
| 029 Print Templates | PO bug fix 09-17, 7 templates | The Zebra labels are uploaded by hand, not by erp-templates |
| 031 Tool Interfaces | Lucide, tests, sandbox | Kitchen-hub carve-out; the tiles page was removed on 10-02 |
| 042 Etsy POD | Shop live since 09-27, 162 listings | The weekly-run section is dead (it is daily now); demand-numbers line is stale |
| 043 Job Failures | Incidents #330 and #331 today | The example and deny-list name retired social jobs |
| 047 Real Cow Access | Live 10-15, 1 distributor | "Not on public GitHub" becomes true only on 11-05 (the timer); release after that date |
| 035 Store Sandbox | Sandbox up | Needs a rewrite: the public window expired 09-27; timers are described wrongly; it overlaps SOP-040 |
Keep as draft (not used yet, which is the correct state)¶
- No real job yet:
- 012 Files and Network: Storage-snapshots share mode to verify.
- 013 Feedback: 0 items ever; its "not built yet" text is stale.
- 014 Returns: 0 RMAs; its warranty line is stale; its audit ids are not implemented.
- 015 Quarterly Review: no meeting held yet. It says
quarterly-packdoes not exist, but it does. - 016 Quality Objectives: release together with 015.
- 026 Correspondence: no logged send.
- 032 Website Care: no customer enrolled.
- 034 Lifecycle Watch: no finding worked end to end yet. It is a systemd timer, not crontab.
- Store not trading yet (no real order; the gateway is off): 036, 037, 038, 044. 036 describes the sandbox catalogue, not the Cricket listing. 044 can absorb the USPS answer from 10-13.
- Waiting on a physical step:
- 024 Enclosure Design: one print trial.
- 045 KiCad Design Blocks: walk it once on a real board.
- Low-value activity: 027 BOM Cost and 028 Build Planning depend on the parked Intake page and have no walkthrough. 027 also carries about 4 KB of a one-off LCSC import; move it to a project note.
Structural findings¶
- Audit ids that never run. These sit in front matter but
sop-auditdoes not implement them: - SOP-014
open-rma-age,rma-no-outcome - SOP-015
overdue-review - SOP-016
objective-stale,objective-unmeasured - SOP-021
board-has-dru,board-erc-drc-clean - SOP-022
product-yml-valid,shipping-has-compliance
SOP-007.customer-no-address can never fail (/api/address/ returns 404). Either implement each one or drop the id.
- Hardcoded status in the doc-control line. SOP-027 and SOP-028 hardcode **draft**, so they will be wrong after release. SOP-032, 033, 034 and 049 have no doc-control block at all.
- Broken tables. A blank line inside the revision table splits it in SOP-007, SOP-025 and SOP-027.
- Title rule (≤5 words, no verb or brand): 036, 037, 045 and 047 break it. Several filenames no longer match their titles (003, 007, 008, 009, 012, 019, 020, 028, 034, 042).
Leave the filenames alone: links depend on them. Shorten the titles only.
- Revision history is about 10% of the bytes. Reading by section skips it, so it does not need trimming. SOP-018's rows 2.0–6.4 and SOP-021's rows 1.5–1.14 could each collapse into one row.
Live problems found in passing (not SOP text)¶
- ~~The content pipeline is red~~: fixed, see Pass 2.
onboard list --jsontakes more than 25 s and times out, so the SOP-009 checks and the SOP-015 access review cannot run.- SOP-005: stock item 282 has no batch code. Fix the data, or relax the rule.
Token budget, after this audit¶
| Read | Before | After |
|---|---|---|
| Find the right SOP | ls plus guessing, or a grep across 475 KB |
index.md, 6.9 KB (~1.7k tokens) |
| Do one step | the whole SOP (5–47 KB) | one section (~0.5–3 KB) |
| SOP-018 in full | 47 KB | ~17 KB once the social sections are cut |
| Planned trims (018, 025, 008, 035, 038, 017, 002, 021) | — | about 60 KB less across the set |
Task #350 — November 4 verification¶
Corrected out-of-order revision rows in SOP-018 / SOP-049, bumped to 7.5 / 1.4, and aligned updated dates (commit d4d5d0c9). Fresh cron-run sop-audit completed 06:18 Eastern: 41 pass, 16 warn, 0 fail, 8 skip, rc=0. Existing warnings/skips remain, including onboard-list timeouts; none were waived. Refreshed Home catalogue: sop-audit no longer failing. Published main via sop-deploy: https://19801f99.embeddedera-sop.pages.dev; built pages verified for versions/date/task reference. Task #350 closed with verification comment.
Publication initially stopped on Git LFS Unable to verify locks (unsupported locking API). Confirmed changed files have no LFS filter or lockable attribute; used a command-scoped locksverify=false for this text-only publication. No persistent Git setting changed.