Test plan — maxelmagnets.com

Ten tests, in order · preconditions read live from the system, 20 August 2026

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.

Read this before anything else. FerroSpring — Tim's own site — currently holds 2 of 13 intake fields. This site holds 13 of 13. The difference is not a bug: it is that nobody has re-onboarded FerroSpring since the fix landed. If Tim opens his own site during the review and finds it blank for the seventh time, no amount of correct engineering survives that moment. T1 should be run on FerroSpring, with Tim, before the meeting.

Preconditions — the state these tests start from

DisciplinePassWarnFail
SEO621
Content332
AI Search755
Technical1100
Social311
Reach010
total30129
SettingValue
Overall score66 — SEO 75, Content 50, AI Search 52, Technical 90, Social 58
Intake fields filled13 of 13
New fields never yet usedtop_ideas, good_leads, time_budget, original_content
On the publish whitelistno — cannot publish
Webroot on our serveryes
Meeting booked2026-08-24 at 08:00, Every week
Two different meetings, and they are easy to confuse. 2026-08-24 at 08:00, a Monday is this site's own recurring marketing meeting — the first run of the operating loop, weekly from then on. Tuesday 25 August is the team function review, which is where this test plan gets discussed. Both dates are correct. The workspace date is not the review date, and neither one is a mistake.

Deliverables as they stand

StatusTypeItemOrigin
shippedPageEnquiry form — maxelmagnets.comgenerator
pendingContent briefDesigning with Polymagnets 101engine queue
pendingContent briefReducing rare earth use with polymagnetsengine queue
pendingLead magnetLead magnet — How to Choose Between Align, Latch andengine queue
pendingPositioningAngles to test — 5 the site can backengine queue

The tests

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.

T1

Onboarding survives a full pass - all seventeen fields

Why this test exists

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.

Steps
  1. Sign in as the owner of maxelmagnets.com and start onboarding from phase 1.
  2. Answer every field, including the four newest: your top three ideas, your last 5–10 good leads, how much time you will spend, and whether you will write original content.
  3. Deliberately type natural phrases, not menu words — “Leads”, “Email marketing”. The old filter discarded exactly these.
  4. Finish the phase. Do not clear your browser first — that would mask the bug.
  5. Then sign out, clear site data, and sign back in. Anything kept only in the browser dies here.
Expected

Every field is still there after the cache is cleared, because it was stored on the server.

How to verify it really happened
python3 -c "import io,json;w=json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'));ik=w['intake'];print(len(ik),sorted(ik))"
Known risk

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.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T2

Feed the engine writes to the server, not the browser

Why this test exists

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.

Steps
  1. Open the feed-the-engine card at the end of onboarding.
  2. Add one competitor with an obviously unique name, e.g. ZZ Test Magnetics.
  3. Do not reload. Check the file on disk first, then reload and confirm it is still shown.
Expected

The new name appears in intake.competitors on disk within a second or two.

How to verify it really happened
python3 -c "import io,json;print(json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json'))['intake']['competitors'])"
Known risk

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.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T3

Operations settings persist - the whole of phase 3

Why this test exists

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.

Steps
  1. Open phase 3 and change the meeting time to something distinctive, e.g. 07:45.
  2. Save, then clear site data and sign back in.
  3. Confirm the dashboard header shows the changed time, not the old one.
  4. Set it back to 08:00 when finished.
Expected

The change is on the workspace and the dashboard reflects it without a re-onboard.

How to verify it really happened
python3 -c "import io,json;print(json.load(io.open('/opt/autoengine/workspaces/maxelmagnets.com.json')).get('ops'))"
Result: pass / fail  ·  Tester: ________  ·  Notes:
T4

Phase 4 is a confirmation screen and nothing more

Why this test exists

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.

Steps
  1. Reach phase 4 after completing 1–3.
  2. Read every element on the page.
Expected

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.

How to verify it really happened
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'])"
Result: pass / fail  ·  Tester: ________  ·  Notes:
T5

The audit is stable and repeatable

Why this test exists

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.

Steps
  1. Note the current scores below.
  2. Run the SEO/AEO analysis again without changing the site.
  3. Compare check-by-check, not just the headline number.
Expected

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.

How to verify it really happened
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']))"
Result: pass / fail  ·  Tester: ________  ·  Notes:
T6

This site must NOT be able to publish - and that is correct behaviour

Why this test exists

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.

Steps
  1. Approve any deliverable that would normally publish.
  2. Confirm the engine offers a preview or a manual instruction rather than shipping.
  3. Confirm no file appears or changes under the webroot.
Expected

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.

How to verify it really happened
ls -la --time-style=full-iso /var/www/maxelmagnets.com/ | head -20
Known risk

This is a negative test. Passing means nothing happened.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T7

Positive control - a real publish, on a site that is allowed

Why this test exists

T6 proves it refuses. This proves it can. Without both, a refusal is indistinguishable from the feature being broken.

Steps
  1. Pick a whitelisted magnetics site — maxelmag.com or polymagnets.com — and approve one technical fix (a title, a meta description, or schema).
  2. Watch for the snapshot, the sitemap rebuild and the IndexNow ping.
  3. Then roll it back and confirm the page returns to its previous state.
Expected

The live page changes, a snapshot exists from before the change, the sitemap is newer than the page, and rollback restores it exactly.

How to verify it really happened
ls -la /opt/autoengine/snapshots/ | tail -5
curl -sI https://maxelmag.com/sitemap.xml | head -3
Known risk

Rollback is the half nobody tests. If it cannot be undone, it should not be sold as safe.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T8

An admin is warned before writing into someone else's site

Why this test exists

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.

Steps
  1. Signed in as an admin, attempt a write against ferrospring.com (owned by Tim) without a confirmation flag.
  2. Confirm the refusal explains whose site it is.
  3. Re-send with confirm_owner=true and confirm it proceeds AND is logged.
Expected

First attempt: 409 with needs_confirm. Second: succeeds, and an entry naming the admin appears in that workspace's activity.

How to verify it really happened
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'])"
Known risk

Only run the confirmed half if Tim is happy for a marker row to sit in his activity log.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T9

Ledger provenance - a generator page is not an engine publish

Why this test exists

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.

Steps
  1. Open the deliverables list for this site.
  2. For every row marked shipped, read the origin field.
  3. Confirm the interface does not present a generator page as the engine's own work.
Expected

Every shipped row carries a provenance. Generator rows are visibly distinguished, and are excluded from any count of what the engine did unaided.

How to verify it really happened
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']]"
Known risk

This is the one most likely to embarrass us in the room, because the flattering number is the one already written down.

Result: pass / fail  ·  Tester: ________  ·  Notes:
T10

The two dead ends Dawn already found

Why this test exists

Both are open on the huddle and both are the kind of thing a first-time customer hits in their first ten minutes.

Steps
  1. Add a domain that is reachable and ordinary. Watch for “it doesn't look like a readable site” with no way forward.
  2. Then try to remove a domain you added by mistake.
Expected

Adding works, or fails with a reason and a retry. Removing is possible at all — currently there is no path.

How to verify it really happened
journalctl -u autoengine --since '10 min ago' | tail -40
Result: pass / fail  ·  Tester: ________  ·  Notes:

What to write down