Two questions to settle before the function review, and they are not the same question. Does onboarding hold? — the fix is proven here and unproven on FerroSpring. And what does the SEO/AEO function actually do on its own? — the honest answer got smaller today, which is better found now than in the room.
| Discipline | Pass | Warn | Fail |
|---|---|---|---|
| SEO | 6 | 2 | 1 |
| Content | 3 | 3 | 2 |
| AI Search | 7 | 5 | 5 |
| Technical | 11 | 0 | 0 |
| Social | 3 | 1 | 1 |
| Reach | 0 | 1 | 0 |
| total | 30 | 12 | 9 |
| Setting | Value |
|---|---|
| Overall score | 66 — SEO 75, Content 50, AI Search 52, Technical 90, Social 58 |
| Intake fields filled | 13 of 13 |
| New fields never yet used | top_ideas, good_leads, time_budget, original_content |
| On the publish whitelist | no — cannot publish |
| Webroot on our server | yes |
| Meeting booked | 2026-08-24 at 08:00, Every week |
| Status | Type | Item | Origin |
|---|---|---|---|
| shipped | Page | Enquiry form — maxelmagnets.com | generator |
| pending | Content brief | Designing with Polymagnets 101 | engine queue |
| pending | Content brief | Reducing rare earth use with polymagnets | engine queue |
| pending | Lead magnet | Lead magnet — How to Choose Between Align, Latch and | engine queue |
| pending | Positioning | Angles to test — 5 the site can back | engine queue |
Run them in order. T1 is the one that matters most; T9 is the one most likely to embarrass us if it is found by somebody else first.
This is the whole reason the plan exists. Tim onboarded FerroSpring six times and lost it every time. Two separate causes were fixed: an exact-match filter that binned any answer a human would actually type, and three screens that kept answers in the browser instead of on the server. Both fixes are proven on this site and unproven on Tim's.
Every field is still there after the cache is cleared, because it was stored on the server.
python3 -c "import io,json;w=json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'));ik=w['intake'];print(len(ik),sorted(ik))"The reason these four had never been stored has been found and fixed, 20 Aug. The submit step built its payload by hand and simply left them out, so they were collected and then dropped on the floor. The parser has since been exercised directly with all four and returns 17 stored fields. This is still their first run through the actual interface, which is the half worth watching.
This card silently wrote to localStorage. Tim named four competitors aloud on the 19 Aug call — Bunting, Foresee, Quadrant and Hirst — that our own 23-company research had missed. Typed into the old card, all four would have died in his browser.
ZZ Test Magnetics.The new name appears in intake.competitors on disk within a second or two.
python3 -c "import io,json;print(json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'))['intake']['competitors'])"Use a junk name you can recognise and remove. Do not test this on someone else's site. A test value was written into Tim's FerroSpring workspace on 19 Aug and had to be cleaned out by hand.
Cadence, team roles and the meeting schedule were browser-only. Everything Tim defined Operations to be would have vanished on a cleared cache, and the server-built dashboard could never have read it.
The change is on the workspace and the dashboard reflects it without a re-onboard.
python3 -c "import io,json;print(json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json')).get('ops'))"
Tim's clearest instruction: “You keep mixing the work output in the setup.” Phase 4 used to render a readiness score, a strongest/weakest discipline and a “next 10X” recommendation — generated work, inside setup. It was rebuilt as an order-review screen.
You see only what you entered, plus the booked meeting. No score, no ranking, no recommendations, no proposed work. If any generated output appears, the test fails and the item goes straight back on the huddle.
Visual check. Confirm the summary matches the SERVER record, not a browser draft:
python3 -c "import io,json;print(json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'))['intake'])"
A score that moves on its own is worse than no score. Tim will re-run this in front of everyone, and it has to land in the same place.
51 checks again, and the same pass/warn/fail split unless the site genuinely changed. Current baseline: 30 pass, 12 warn, 9 fail, overall 66.
python3 -c "import io,json,collections;a=json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'))['analysis'];print(a['scores']);print(collections.Counter(c['state'] for c in a['checks']))"
maxelmagnets.com is not on the publish whitelist. Shipping requires both a whitelist entry and a webroot on our server. The whitelist holds the near-identical maxelmag.com, which is exactly the kind of pair that hides a mistake.
A clear message that this site is not hosted here, and no write to /var/www/maxelmagnets.com/. A silent success would be the serious failure.
ls -la --time-style=full-iso /var/www/maxelmagnets.com/ | head -20
This is a negative test. Passing means nothing happened.
T6 proves it refuses. This proves it can. Without both, a refusal is indistinguishable from the feature being broken.
maxelmag.com or polymagnets.com — and approve one technical fix (a title, a meta description, or schema).The live page changes, a snapshot exists from before the change, the sitemap is newer than the page, and rollback restores it exactly.
ls -la /opt/autoengine/snapshots/ | tail -5 curl -sI https://maxelmag.com/sitemap.xml | head -3
Rollback is the half nobody tests. If it cannot be undone, it should not be sold as safe.
Both ownership helpers used to let admins through unconditionally, and Paul is an admin. That is how one session could have overwritten Tim's FerroSpring. It now returns 409 and demands an explicit confirmation, and logs every crossing that is confirmed.
ferrospring.com (owned by Tim) without a confirmation flag.confirm_owner=true and confirm it proceeds AND is logged.First attempt: 409 with needs_confirm. Second: succeeds, and an entry naming the admin appears in that workspace's activity.
python3 -c "import io,json;print([r for r in json.load(io.open('/opt/autoengine/workspaces/ferrospring.com.json'))['activity'] if r.get('kind')=='admin'])"Only run the confirmed half if Tim is happy for a marker row to sit in his activity log.
Found on 20 Aug while writing this plan. The enquiry form on this site is marked shipped, but its own record says a site generator built it and it was back-recorded so the ledger matched reality. 47 deliverables network-wide are in that category. Counting them put the headline at 302 when the true engine figure is 255.
origin field.Every shipped row carries a provenance. Generator rows are visibly distinguished, and are excluded from any count of what the engine did unaided.
python3 -c "import io,json;[print(d.get('status'),'|',d.get('origin'),'|',d.get('title')) for d in json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'))['deliverables']]"This is the one most likely to embarrass us in the room, because the flattering number is the one already written down.
Both are open on the huddle and both are the kind of thing a first-time customer hits in their first ten minutes.
Adding works, or fails with a reason and a retry. Removing is possible at all — currently there is no path.
journalctl -u autoengine --since '10 min ago' | tail -40