Heuristic: manual fallback wins when ≤5 min and reliable

Don’t autonomous-tool what AJ already does fast manually

When AJ has a manual fallback that’s ≤5 min/instance + reliable + vendor-supported, do NOT build complex autonomous tooling. The maintenance overhead doesn’t amortize at low volume.

Real incident (2026-05-03)

Built a Tier-3 Playwright autonomous publish path for Tableau Cloud keypair workbooks: publish_workbook_with_saved_credential MCP tool + tier3_delegate.py + workbook publish CLI subcommand + 8 cloud_publish_* selectors + HEADED browser session + selector-discovery flow. Tableau Cloud’s deep-link auth bounced headless sessions to SSO unpredictably; selector discovery never reached the project page reliably. Reverted same session per AJ directive.

Wasted: 4 commits + revert noise + Playwright Chromium install + audit log scaffolding for the autonomous path that never worked.

What worked: the original 3-min Tableau Desktop manual flow with hand-holding doc at /root/aj-ea/outputs/documents/way-of-working-tableau-desktop-publish-keypair.md.

Decision recipe (apply before building autonomous variant)

Before building any autonomous variant of a capability AJ does manually, ask:

  1. How long does AJ’s manual flow take? (≤5 min = high bar for autonomous to clear)
  2. How often does AJ do it? (<5×/week = autonomous won’t amortize maintenance)
  3. What’s the maintenance surface? (Browser selectors / OAuth token rotation / cron schedule = each adds drift risk)
  4. Does the manual flow have a vendor-architectural moat? (“must use Desktop” per Tableau docs = autonomous can’t beat that)

If ANY of (1) ≤5 min, (2) <5/wk, (3) high maintenance, (4) vendor moat — propose the manual way-of-working doc as canonical answer. Build autonomous ONLY when AJ explicitly says “this is recurring, bake it in”.

Cross-reference

“World-class zero-compromise” doesn’t mean “build everything autonomous”. It means “ship the right answer with no debt”. Sometimes the right answer is operator + clear instructions. Captured locally at feedback_manual_fallback_wins.md (aj-workspace memory).