Skip to content

docs(rollout): record deferred-actions + Task 6.3 + docs work#34

Open
mpge wants to merge 20 commits intofeat/public-ticket-systemfrom
docs/rollout-status-update
Open

docs(rollout): record deferred-actions + Task 6.3 + docs work#34
mpge wants to merge 20 commits intofeat/public-ticket-systemfrom
docs/rollout-status-update

Conversation

@mpge
Copy link
Copy Markdown
Member

@mpge mpge commented Apr 24, 2026

Summary

Updates docs/superpowers/plans/2026-04-24-public-tickets-rollout-status.md so a future iteration landing on this codebase has a current picture of what's shipped.

Every framework's ticket-system work, email infrastructure, workflow stack, and public-submission guest-policy wiring is either shipped or in open CI-green PRs. The doc now tracks:

  • 13 base PRs (all 14 repos, including filament via Laravel) — all CLEAN / mergeable / CI-green
  • Workflow stack (4 frameworks) — 3-PR stacks (executor → runner → listener) each
  • Email MessageId util (10 frameworks) — 13-19 tests each
  • EmailService wire-up (10 frameworks) — stacked on MessageId util PRs
  • Inbound-webhook verification (5 inbound-capable frameworks)
  • Greenfield inbound routers (5 frameworks) — full 7-PR stack per framework: Postmark, Mailgun, SES, controller, orchestration service, attachment downloader, parser equivalence tests

Fix-sweeps surfaced during rollout self-review

Infrastructure fixes

  • escalated-phoenix#46 — CI workflow was targeting main but the default branch is master, so Phoenix CI had literally never run. Workflow now targets master, scopes mix format and mix credo to PR-changed lib//test/ files (master has pre-existing drift that would otherwise block every PR), and relaxes an unsatisfiable inertia_phoenix constraint. Lint now green.
  • escalated-wordpress#37Activator::maybe_upgrade() on plugins_loaded so existing installs pick up schema/permission changes on version bumps. WordPress doesn't fire register_activation_hook on auto-update, so without this the upcoming stacked PRs (new tables, new permission rows) would silently miss existing installs.
  • Backfilled CHANGELOGs — Spring (#37), Phoenix (#47), Go (#39), .NET (feat(widget): Storybook story for EscalatedWidget (Task 8.1) #33)

Deferred

Only one item: full functional Ziggy route() compat shim for non-Laravel hosts (would require per-host-framework named-route mapping for 77 call sites). Partial mitigation shipped via #36. Documentation added in escalated-dev/escalated-docs#11.

Test plan

  • No code changed; docs-only

mpge added 18 commits April 24, 2026 10:09
Appends three new sections to the rollout status doc covering the
post-iter-120 work that's now shipped:

1. Deferred workflow actions across 4 frameworks (send_webhook,
   add_follower, assign_round_robin, delay) — NestJS as reference
   plus delay-only ports to Spring / Phoenix / WordPress.
2. Greenfield Task 6.3 runtime guest-policy settings endpoints
   across dotnet / go / spring / phoenix — the plan's last remaining
   gap.
3. Two public-facing docs pages in escalated-dev/escalated-docs:
   workflows.md (#9) + public-tickets.md (#10).

Closes out the "End state" — every plan task has shipped or been
explicitly deferred as pre-existing infrastructure. Lists three small
follow-ups (CHANGELOG catch-up, the 1-line Phoenix runner update, and
the WP plugin-upgrade-path gap) so a future iteration can pick them up
with context.
Updates the status doc to reflect everything shipped since the
original append:

- workflows.md (#9) description now matches what the doc actually
  says after 11 rounds of factual-error corrections (5 trigger events
  not 14, real condition model, unit divergence called out, etc.)
- public-tickets.md (#10) description matches after 10 rounds of
  corrections (4-priority chain, real widget snippet, provider
  coverage split, etc.)
- New 'Infrastructure fixes surfaced along the way' section
  documents the Phoenix CI config fix (#46 — lint.yml was broken,
  never ran on any PR since repo creation), the .NET PR #32 accidental
  stacking rebase, and the three earlier settings-PR lint fixes
  (Django / Adonis / Symfony).

Noted that the 20+ factual corrections in the docs were caught
via self-review, not user-reported — keeping that visible in the
status doc so future iterations know the docs were hand-audited
against source, not just generated.
… gap

- Adds escalated-nestjs#27 to the Task 6.3 settings-endpoint table.
  The reference was subtly out of step with its own ecosystem:
  all 10 host-framework plugins had dedicated
  /admin/settings/public-tickets endpoints, but NestJS required
  callers to hand-craft a generic settings payload. #27 closes that gap.

- Notes a genuine cross-framework functionality gap caught during
  docs self-review: Laravel's admin settings page for the guest
  policy has no behavioral effect — WidgetController writes guest_name/
  guest_email/guest_token unconditionally, ignoring guest_policy_mode.
  NestJS avoids this because the settings endpoint writes to a
  guest_policy JSON key that WidgetController already reads. Other
  legacy plugins (Rails/Django/etc.) likely have the same issue.
  Documented as a follow-up so future iterations can wire each plugin's
  widget controller to its own persisted settings.
…section

All 6 affected frameworks (NestJS, Laravel, Rails, Django, Adonis,
WordPress) now have the widget/settings-disconnection fix shipped.
Replaces the 'follow-up' bullet with a dedicated section listing each
framework's fix PR, the entry points it covers, the shared 3-mode
semantics, and the test coverage added (20 new cases across the
sweep).
Widget sweep completed; audit turned up the same bug in each
framework's InboundEmailService. Shipped as 5 PRs across 5 frameworks
(NestJS, Laravel, Rails, Django, Adonis) — WordPress inherits the fix
for free because its InboundEmailService delegates to
TicketService::create_guest, which was already patched by the widget
PR #36. One of those rare wins from having centralized ticket-create
logic.
The End state section (written before the sweeps) claimed 'every plan
task has shipped'. Technically true — but docs self-review turned up
11 more PRs of real bug-fixing (widget sweep + inbound sweep) that
aren't plan-scoped but are essential for the rollout to deliver what
the docs promised. Weave that narrative bridge into End state so
readers see the full arc: plan completion → docs review → reality gap
→ additional sweeps.

Also add the Phoenix mix format follow-up to the 'Remaining follow-ups'
list explicitly — needs local Elixir+Erlang to run mix format across
the ~20 files with pre-existing drift surfaced by #46.
While sweeping for hardcoded /support/widget paths in the shared
frontend, grep turned up 79 Vue components that call Ziggy's route()
helper with 'escalated.*' named routes — 'escalated.admin.saved-
views.update', 'escalated.admin.tickets.side-conversations.reply',
etc. Ziggy is Laravel-specific. Laravel gets it for free, but on
Rails / Django / NestJS / etc. the global route() is undefined.

Two components (AttachmentList, ChatBubble) have defensive
'typeof window.route === function' checks, but the other 77 callers
don't — calling them on a non-Laravel host framework will
ReferenceError. Each non-Laravel host needs to ship a Ziggy-compatible
window.route() shim for the admin + agent UI to function.

Out of scope to fix in the current rollout (79 file touchpoints; real
solution is per-framework Ziggy shim), but important for whoever
productionizes those plugins. Added to the follow-ups list.
Line 136 was stale — it claimed provider parsers + webhook controllers
were 'still open' for the 5 greenfield frameworks, but all 35 PRs
(7 per framework × 5) have been drafted and stacked. Added a full
matrix of PR links by framework × component. Remaining work is only
the legacy guest_* column deprecation across all frameworks.
Expand the phoenix#46 row to explain the full CI scoping (format +
credo both scoped to PR-changed lib/test paths) and note that lint is
now green. Supersedes the stale 'needs local Elixir toolchain' note.
Records the gap surfaced 2026-04-24: NestJS reference is missing the
Automation backend; Symfony / Phoenix / Go are missing both Automation
and Macro. Backed by ADR 2026-04-24-admin-agent-tool-split in the
context repo. Doesn't block the public-ticket-system rollout — these
are independent follow-up workstreams.
All 7 PRs landed across the 4 frameworks that had gaps:
  - NestJS:   Automation #29 (Macro existed)
  - Symfony:  Automation #40 + Macro #41
  - Phoenix:  Automation #48 + Macro #49
  - Go:       Automation #40 + Macro #41

Every framework in the portfolio now has Workflow + Automation + Macro
backends. ADR escalated-developer-context/decisions/2026-04-24-admin-agent-tool-split.md
locked the taxonomy; this sweep closes the implementation gap.
…ion+Macro PR

Each of the 7 entity+service PRs got a follow-up controller commit on
the same branch:
  nestjs#29     Automation admin controller (CRUD + run-now)
  symfony#40    Automation admin controller (CRUD + run-now)
  symfony#41    Macro admin + agent controllers
  phoenix#48    Automation admin controller (CRUD + run-now)
  phoenix#49    Macro admin + agent controllers
  go#40         Automation admin handler (CRUD + run-now)
  go#41         Macro admin + agent handler

The shared frontend's Admin/Automations/ and Admin/Macros/ folders are
wire-compatible with these endpoints.
@mpge mpge force-pushed the docs/rollout-status-update branch from e8d35bc to a9ce8b0 Compare April 25, 2026 18:04
mpge added 2 commits April 25, 2026 14:55
Each framework's new Automation/Macro controllers are now wired into
the host router so they respond at canonical paths:

  - nestjs:   auto via @controller decorators (already in module)
  - symfony:  auto via #[Route] attribute discovery; existing
              routes.yaml resource loaders pick up the new files
  - phoenix:  router.ex escalated_routes/2 macro mounts the new
              resources/routes for both admin + agent scopes
  - go:       both chi and stdlib routers wire the new handlers
              behind RequireAdmin/RequireAgent middlewares

Plus Symfony bonus: bin/console escalated:automations:run command for
the cron entry.
All 7 PRs are CLEAN / MERGEABLE. Verified 2026-04-25:
  nestjs#29        — lint + test (18) + test (20) + test (22) all pass
  symfony#40, #41  — PHP-CS-Fixer pass
  go#40, #41       — golangci-lint pass
  phoenix#48, #49  — no CI yet (Phoenix workflow trigger targets main
                     not master; unblocks when phoenix#46 merges)

Lint/style fixes shipped along the way:
  nestjs:  pre-existing chat-session.spec unused-vars + prettier on
           automation.spec + .gitignore tsbuildinfo
  symfony: php-cs-fixer auto-fixes on both branches
  go:      gofmt auto-fixes on both branches
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant