Feedback
A drop-in feedback capability for any MeshWeaver deployment. A user types /feedback <message>
in any thread; the flow captures the message plus the context that makes it actionable, files it
as a draft, and shows the user a polished preview with a Submit button — so they see exactly
what will be sent before it goes. Only when they click Submit does it reach the shared
Feedback space, where Systemorph reviews it.
What gets captured
Every submission is a Feedback/Feedback node whose FeedbackContent records:
| Field | Source | Notes |
|---|---|---|
message |
the user's words, verbatim | the record itself |
submittedBy / submittedByName |
# Current User context |
who |
timestamp |
server, stamped on submit | real ISO-8601 UTC; a client can't backdate |
mainNodePath / mainNodeTitle / mainNodeGist |
# Current Application Context |
where they were (the main panel) + a gist |
sidePanel |
the agent, if reachable | related area open beside the main panel |
extraContext |
the agent, opportunistically | role, repro detail, related paths, … |
category |
inferred, only if obvious | bug | idea | praise | question |
status |
server | Draft on capture (invisible to reviewers); flips to New when the user hits Submit; a reviewer then moves it to Triaged / Resolved / WontFix |
Every context field is optional — the agent fills what it can reach and leaves the rest empty (shown as "not captured" in the review view). A submission never fails because a field couldn't be filled.
The pieces
/feedbackskill (Feedback/Skill/feedback) — the entry point. Instructs the thread agent to capture the message + context, extract more if it can, file a draft, and show the user the preview to review and submit. Prefers the Feedback Agent when present.Feedback Agent (
Feedback/Agent/feedback-agent) — the "feedback agent": does the capture-draft-preview. Callable directly (@agent/Feedback/Agent/feedback-agent) or by the skill.FeedbackContenttype (Feedback/Feedback, compiled live fromSource/) — the record and its views (the card is drawn once and reused, so the submitter's preview is byte-for-byte the reviewer's view):- Compose — the preview-and-submit surface (
Feedback/Compose/{id}or@@("Feedback/area/Compose/{id}")). Loads the captured draft (as System) and shows it as a card whose message is an editable, data-bound field (host.Edit), with a Submit button. Nothing reaches the reviewers until the user clicks it — this is what lets them SEE and refine their feedback before it's sent. - Detail — the reviewer's full view of one submission (message + all context, present-or-not).
- Inbox — the admin review list on the space root: every submitted submission (drafts excluded), newest first.
- Submit — the space-root "give feedback via chat" call to action (points the user to
/feedback). Feedback is captured in chat, previewed, edited and submitted — there's no separate in-page form.
Every view is built from framework controls styled with CSS — no hand-rolled HTML.
- Compose — the preview-and-submit surface (
FeedbackSubmitter(Source/FeedbackSubmitter.cs) — the submit-as-System core. Every write (create draft, publish, in-UI submit) runs underAccessService.ImpersonateAsSystem()(the same trickCouponRedeemeruses), so any signed-in user can submit even though they have no write access to theFeedbackpartition.CreateDraftcaptures aDraft;Publish(the Submit button) reads the draft as System, flips it toNewand stamps the real submit time — so a client can neither backdate nor pre-triage, and nothing is visible to reviewers until the user submits.
Where submissions live
Feedback/_Submissions/{id} — an underscore container (kept out of catalogs). The Feedback space's
Inbox area lists them for reviewers. Feedback is admin-reviewed: seed the space so only
platform admins read it.
Tests
- Unit (
Feedback/Feedback/Test/FeedbackTests.cs, run by theTestslayout area and asserted by CI): content-type defaults, the pure submission-building core (timestamp stamping,New/Draftpinning, the Draft→New publish transition, the draft/Inbox filter, id/summary/description shapes), the shared card renderer (message shown, empty context hidden in the preview, HTML escaped, main node linked) and the message-only graceful-degradation contract. - e2e (
e2e/feedback-skill.spec.ts,npm run feedback-skill): drives the memex portal —/feedback <marker>in a thread → agent confirms → the node lands in the Inbox with the message, submitter and main-node context.