Skip to content

D606: the Eadwyn Tickets canvas, built: the review queue and the Eadwyn chat's Tasks and My tickets (closes #1107, #1108) - #1319

Merged
guillaumelauzier merged 1 commit into
mainfrom
claude/spinout-lab-workspace-wuyyqd
Oct 6, 2026
Merged

guillaumelauzier merged 1 commit into
mainfrom
claude/spinout-lab-workspace-wuyyqd

Conversation

@guillaumelauzier

@guillaumelauzier guillaumelauzier commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Objective

Your Eadwyn Tickets canvas, built. You approved it on #1107 (https://claude.ai/artifact/7sLCsbcdBAqK8XuaYVtzcA). Its four screens:

  • T1, T1b: /hq/review. The Super Admin's review queue for feature requests and suggested tasks.
  • T2, T3: the Eadwyn chat's panel. Tasks and My tickets, beside the conversation.

Closes #1107. Closes #1108. Their stores and APIs (D544, D545) were merged, and only these pages remained.

Implementation

Worker first

  • The review lists say how many are waiting.
    • GET /api/admin/ticket-reviews/features and /tasks now return total beside count. A list reads the oldest 200, so a queue past the 200th used to show a short number.
    • A suggested task now carries its GitHub issue number, as a feature request does.
  • Each approved suggestion carries reward: the credits its grant actually paid, read from the ledger the way D542 reads a bounty.
    • It says when a grant was taken back.
    • It says when nothing was paid (the rule was off, or the grant was refused).
    • It says when the ledger could not be read, and the list is still served.
  • GET /api/community-tasks/rewards (new, signed in) gives members the four amounts the panels state: an approved task, and a high, medium or low bug.
    • They come from D540's rules, which the Super Admin edits, never from code.
    • A rule the table lacks is null, never 0.
    • A failed read is a refusal, never zeros.

T1, T1b: /hq/review (pages/hq/ReviewQueuePage.jsx)

  • Access. Super Admin only. The sidebar's Support row lights on it, and HQ Support links to it.
  • Tabs. Two tabs, each with the number waiting. The number is withheld while its list loads or cannot be read, never shown as 0.
  • Toolbar:
    • a title search, and Priority and Date filters;
    • "1–25 of [N]";
    • a line when more are waiting than the 200 loaded.
  • Order. The most pressing come first, oldest first within a priority, as the canvas draws them.
  • Each request shows:
    • its title, priority and type, and its text;
    • who asked, and the date;
    • its GitHub issue, or "Not on the GitHub tracker".
  • A task also has:
    • the "Publish to" audience;
    • "Approve · +10 credits", where the 10 is read from the rules. When the rule is off or unreadable, the button says "Approve" and a line says why.
  • Approve and Decline open the canvas's confirm panels on the request they decide.
    • Neither sends until the reason is long enough.
    • After a decision, the card says what the route did: the GitHub label, whether the requester was told, and for a task the credits paid or the grant's refusal. The tab's count drops.

T2, T3: the Eadwyn chat (components/advisor/EadwynPanels.jsx)

  • Three tabs head the chat's panel: Conversation, Tasks and My tickets.
    • On a desktop and in fullscreen, they head the rail. Conversation keeps the interview widget the rail already had.
    • On a phone, they sit above the card, and Conversation is the chat itself, as the canvas draws it.
  • Tasks:
    • the approved community tasks, each with Start;
    • your suggestions, each with its state: Pending review, Approved · +N credits (what the grant paid), or Declined with the reason;
    • older suggestions, one click away;
    • "Suggest a task", which opens the ticket form set to Task.
  • My tickets:
    • your balance, with a link to Perks. A balance that could not be read is withheld, never 0.
    • the five most recent tickets, each with type, priority, and its bounty or review;
    • what a fixed bug earns at each tier.
  • The chat's ticket form has no default type now, the rule D544 and the Help Center's form already follow. It opens on Task only from "Suggest a task".

Also

  • H7, an admin's view of one ticket, links a feature request still awaiting review to the queue, for the Super Admin. D604 left that link out because the page did not exist.

Where the build departs from the canvas, and why

  • Approve asks for a reason too. The Worker records a typed reason of at least ten characters with every decision, approvals included (D544). The panel says the reason is recorded, not sent.
  • "Asked by" is a name and an email, not a link. There is no page for one account; the canvas's /admin/accounts/[id] does not exist.
  • Start puts "Help me with …" in the composer. The chat reads that as a request for an explanation, and you send it. The canvas's /tasks/[id] does not exist, and nothing records who started a task.
  • A duplicate's original and a not-a-bug reason are not on the list. They live in the ticket's replies, so the row links to the ticket. Reading every ticket's thread would cost one GitHub call per row.
  • The bounty note is by tier, not by priority. The canvas says "Urgent and High bugs earn +150"; the tier is set by whoever grades the fix (D542), not by the ticket's priority.
  • The review page carries HQ's Worker AI rail, as every HQ page does. The canvas draws none.

Files changed

  • Worker:
    • routes/admin_ticket_reviews.ts
    • routes/community_tasks.ts
  • Frontend:
    • pages/hq/ReviewQueuePage.jsx (new)
    • components/advisor/EadwynPanels.jsx (new)
    • lib/eadwynTickets.js (new)
    • lib/api/ticketReviews.js (new)
    • lib/api/communityTasks.js
    • lib/api.js (one re-export line)
    • components/advisor/PersonalAdvisor.jsx
    • pages/TicketsPage.jsx
    • pages/hq/HqSupportPage.jsx
    • App.jsx
    • sidebarConfig.js
  • Design:
    • design/canvases/integrated/Eadwyn Tickets.dc.html (new)
    • design/canvases/integrated/Eadwyn Tickets Screen.dc.html (new)
    • both canvas READMEs
  • Docs:
    • decisions/D606.md (new)
    • D544, D545 and D604 each point to it
    • ROUTE_MAP.md: two rows
    • PROFILE_ROUTING.md and PAGE_INVENTORY.md, regenerated
  • Tests:
    • cloudflare-worker/test/eadwyn_tickets_d606.test.ts (new)
    • frontend/test/eadwyn_tickets_d606.test.mjs (new)
    • ticket_type_required_d544.test.ts
    • profile_routing_fresh.test.mjs

Testing

The full suite. npm run build, then npm run test:drift, gave EXIT=0 on this PR's head (224e2e015, on main at 085e573b9, after D607's canvas move: integrated/ 79 → 81):

  • frontend: 5,078 pass;
  • Worker: 5,910 pass, 3 skipped;
  • retention: 127 pass;
  • the guards, both type checks, lint:undef and the dark-mode check all pass.

New tests:

  • Worker (7):
    • each list's total past the 200 it returns;
    • each task's issue number;
    • the lists stay the Super Admin's;
    • each suggestion's reward: paid, taken back, unpaid, another member's grant never read as yours, and an unreadable ledger;
    • the rewards read: an edited rule, a switched-off rule, a missing rule as null, a failed read refused, and signed out refused.
  • Frontend (24):
    • the reason floor against the Worker's constant, and the audiences against its list;
    • the filters, the order and the count line;
    • the counts withheld while a list loads or cannot be read;
    • the reward states;
    • the outcome sentences;
    • every rendered state of the queue, the confirm panels and both panels;
    • the route, the sidebar and the client;
    • H7's link, for the Super Admin only;
    • the committed canvas.

Mutation checks: 37 of 37 caught. Each undid one behaviour, and every file was restored and checked by sha256.

Rendered check. The built bundle was served with stubbed /api replies:

  • The queue, as a Super Admin, at 1440 and 390 wide:
    • the counts read 3 and 1;
    • after an approval, the card reads "Approved. It goes to the build queue. The GitHub issue is labelled feature:approved. The requester was told in their inbox." and the count drops to 2;
    • Decline stays disabled with five characters typed;
    • nothing scrolls sideways at 390.
  • The chat, as a founder, at 1440 and 390 wide:
    • Tasks and My tickets, with live data;
    • Start writes "Help me with Share a cap-table template" into the composer;
    • Suggest a task opens the form titled "Suggest a task", set to Task.
  • No page errors.

Risks

  • What ships: the Worker and the frontend, with no migration. One new route, GET /api/community-tasks/rewards, signed in, read-only.
  • Who notices:
    • The Super Admin gets /hq/review.
    • Every member with the Eadwyn chat gets the Tasks and My tickets tabs.
    • Anyone filing from the chat must now pick a type.
  • Roll back by reverting the merge.

Dependencies

Agent

S01 · Claude Code

Review requested

The owner.

🤖 Generated with Claude Code

https://claude.ai/code/session_018jkNYLq29UXAvcqYxGCSB3


Generated by Claude Code

The owner's Eadwyn Tickets canvas, its four screens built:

- T1, T1b: /hq/review, the Super Admin's review queue. Two tabs counting
  what waits (withheld, never 0, while a list is loading or unreadable),
  a title search, Priority and Date filters, "1-25 of [N]", the most
  pressing first, and Approve and Decline on the item they decide, each
  with a typed reason (D544's rule). A task has the audience picker and
  "Approve · +N credits", N from the credit rules.
- T2, T3: the Eadwyn chat's panel. Conversation, Tasks (community tasks
  with Start, my suggestions with what each grant paid, Suggest a task)
  and My tickets (the balance, each ticket's bounty or review, what a
  fixed bug earns by tier).

Worker first: the review lists return the number waiting (`total`) and a
task's issue number; each approved suggestion carries the credits its
grant paid; GET /api/community-tasks/rewards gives members the amounts the
panels state. The chat's ticket form loses its preset type (D544), except
from "Suggest a task". H7 links a feature request awaiting review to the
queue, for the Super Admin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018jkNYLq29UXAvcqYxGCSB3
@github-actions

github-actions Bot commented Oct 6, 2026

Copy link
Copy Markdown

Preview: https://studioos-pr-1319.guillaumelauzier.workers.dev (built from 224e2e0)

The pull request's SPA build on a Worker with no bindings: pages and deep links work, /api/* is a 404, and nothing here can reach production data. Redeployed on every push; deleted when the PR closes.

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.

Eadwyn chat: a Task list of approved community tasks (D545) Super Admin review queue for feature requests and suggested tasks (D544, migration 383)

2 participants