Estimate: 60m · Depends on: 6.12.3, 6.11.4
The cross-account public submission path, REUSING 6.11.4’s intake (no second submissions table), plus the duplicate-detection pre-check (Canny’s core behaviour). Per 6.12.2:
{ kind (bug|feature), title, descriptionMd } that creates a triage work_item through workItemsService (the SAME 6.11.4 creation path), attributed to the SUBMITTING cross-org account (a real authenticated submittedByUserId, not an external/anonymous submitter), scoped to the public project. Gated by 6.12.3’s canSubmitToTriage (true for any authed account on a public project) — NOT canEdit. Rate-limited + abuse-guarded per the 6.11.4 precedent (per-account throttle, size cap), since this is an internet-facing write.Stay 4-layer: routes parse + call one service method; the service owns the transaction + the throttle; creation goes through workItemsService.
work_item is created via workItemsService, attributed to that account, invisible to the normal tree (it shows in the project’s triage queue); gated by canSubmitToTriage, NOT canEdit; rate-limited (rapid repeats throttle with a typed error, not a 500).canSubmitToTriage (the grant this checks) + the public projection the match respects.scripts/plan-seed/data/story-6.11.ts § 6.11.4 (the intake creation path REUSED) + § 6.11.3 (the triage queue the item lands in).motir-core/lib/services/workItemsService.ts — the create authority; the 6.1.1 FilterAST search (shipped) — the match read reuses it where it fits.motir-core/CLAUDE.md § 4-layer; the 6.11.4 rate-limit precedent.