Skip to content

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-tasks turns the warning into one task, so drafts can no longer sit unreleased without anyone noticing. 34 drafts are flagged today.
  • sop-audit is 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.md and 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: DENY in ~/assistant/job_failure.py still 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)

  1. Net 30 vs Net 14. Net 30 was decided on 2026-10-14. These still say Net 14:
  2. SOP-007 lines 55 and 71, and SOP-010 line 100.
  3. ~/assistant/actions.py DEFAULT_TERMS, and static/invoice.html lines 324 and 674.
  4. 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-pack does 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-audit does 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 --json takes 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.