Repository navigation
feat(feedback): report bugs and feature requests from the conversation - #530
Conversation
Clark, the report_feedback tool, voice and `/report bug ...` now only prepare a report and show the exact issue with Create issue; the tool's file action and the approval path behind it are gone. The person's press goes through the execution policy: a deny is refused with nothing sent, and an ask is answered by the press and recorded. An unanswered write is reconciled against the attempt's own time, so a later check can neither restart the grace period nor hide the issue from the marker search, and the test GitHub honours that search window. Check again only looks; Send again appears once GitHub shows the report absent. Reports left publishing or unknown are reconciled when the node starts, and a settled outcome is written into the conversation. A press that does not get through keeps its report, so a second press cannot file twice. Answered composers and prepared cards render as records after a reload. The manual issue link no longer splits surrogate pairs, the home path is scrubbed case-insensitively on Windows, @Handles are neutralised, titles keep acronyms, philosophy rules match whole words and need a hand-over verb for secrets, and constraints and related-issue reasons follow the person's language. Refs #510
The ledger now records the person, not the policy, as the one who let a report be filed on their press: recordEffectExecution takes an optional approvedBy, still "policy" by default. A marker scan whose every page was full stops with "could not check" instead of "absent", and a report whose attempt is missing from the ledger stays unknown, so Send again is never offered on a report GitHub may already hold. The cross-platform philosophy rule needs an operating system named, so "just for fun" no longer reads as a platform constraint, and the machine-surface comment on the publish route says only the person files. Refs #510
…n send it anyway The marker scan now reads only the issues the token's owner opened (creator, from GET /user, asked once per check), so other traffic in the repository no longer runs the scan out. When checking still cannot settle a report (the list runs past the scan, or the ledger no longer holds the attempt), it is unknown and inconclusive, said plainly: Clark can't tell whether GitHub kept it, and checking again won't change that. The card drops Check again, links the issues the person opened since the attempt and the prefilled new-issue page with a duplicate warning, and offers Send anyway. That press is the person's alone (refused on MCP and the relay at the route too), goes through the execution policy like a send, and is recorded as the person's decision; a refusal leaves the report as it was. The node never sends a report again on its own. Refs #510
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
…glish Filing a report recorded its action-ledger description in the language the node was set to at the press, so an entry written in Vietnamese kept showing in Vietnamese on Settings > Control after the person chose English. The ledger is written once and read later in any language, so the description is now fixed English like every other entry's. Refs #510
…-feedback-reporting
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
Keep main's external channels as storage migration 44 and move product reports to 45. Read the newest timeline page after a feedback publish, since the timeline query no longer takes afterSequence. /changelog and /report sit side by side in the slash commands, cards, tools and session search.
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
# Conflicts: # packages/contracts/src/machine-surfaces.ts
|
Review attestation: ready to merge at A push to this PR makes this attestation stale; the new head needs its own review. |
Describe /report and its Feedback Composer, that only the person's Create issue press files a report, the result states, Check again and Send again, what is and is never shared, and the person-only /feedback/reports routes, in English and Vietnamese. Refs #118 Refs digitopvn/clarkcant#510 Refs digitopvn/clarkcant#530
Refs #510. Related: #507, #402, #508, #495, #197, #129.
This delivers the phases of #510 that are not blocked: phases 0–4 and 7. People can report a bug or ask for a feature from the conversation and get back a truthful result. Handing an issue to Clark to fix stays unavailable until #402 and #508 land, and the product says so.
What changed
Phase 0: contracts and storage
packages/contracts/src/feedback.tsadds the following types:FeedbackRequest,FeedbackDraft,FeedbackPublicationandHandlingEligibility;rpt_id;draft | publishing | unknown | published | failed);feedback-cardblock;<!-- clark-report:rpt_... -->with a reader for it.digitopvn/clarkcantby trusted config, and no request field can change it.feedback_reports. Applied migrations are untouched. Conversation deletion removes a conversation's reports.Phase 1: one host-owned service (
apps/runtime/src/application/product-feedback.ts,feedback-compose.ts)redactSecrets(no forked patterns), the home directory is replaced by~(case-insensitively on Windows), and@handlesare neutralised so filing notifies nobody.Phase 2: GitHub publisher (
feedback-github.ts)external-writeeffect in the action ledger: prepared → submitted → confirmed, failed or unknown.publishedonly after GitHub is read back holding its marker.unknown. Check again (intent: "check") only looks for the marker and never sends. The marker search window and the two-minute grace are anchored to the attempt's own time (effect.preparedAt), so a later check cannot restart the grace or hide the issue from the search. Once GitHub's own list shows the marker absent after the grace, the report isfailedandretryable, and Send again files it for the first time. Nothing is sent while GitHub cannot be checked. The marker is looked for among the issues the token's owner opened (creator, fromGET /user, asked once per check), at most 3 pages of 100.unknownwithinconclusive: { since, searchUrl, manualUrl }. The card says "Clark can't tell whether GitHub kept this report, and checking again won't change that." (EN/VI), drops Check again, links the issues the person opened since the attempt and the prefilled new-issue page with a duplicate warning, and offers "Send anyway — this may file it twice" (intent: "send-anyway", accepted only for such a report, otherwise409 NOT_INCONCLUSIVE). That press is person-only (also refused at the route for MCP and the relay), policy-checked like a send, and recorded withapprovedBy: "person"; a policy refusal leaves the report as it was. The node never sends a report again on its own.publishingorunknownis reconciled the same way, and a settled outcome is written into its conversation as a result card.github_token), read through the secret broker as consumerfeedback:github. Without it the status isneeds-access, with GitHub's prefilled new-issue URL.test-support/fake-github.ts), also reachable from e2e withCC_GITHUB_FIXTURE=1.Phase 3: conversation surfaces
/report(found by autocomplete),/report bug …and/report feature …(alsolỗiandtính năng), through the slash-command handler;report_feedbackfor a sentence or for voice.fileaction, and a call that still asks for one is prepared instead and told so./reportputs the host-owned Feedback Composer in the conversation. It has:refusedwith nothing sent, and an ask is answered by the press itself, recorded in the ledger withapprovedBy: "person"(recordEffectExecutiongains an optionalapprovedBy, still"policy"by default). There is no approval-required state.answers) renders as a record, after a reload too, so nothing offers to file the same report twice. A press that does not get through keeps its report id, so pressing again acts on the same report.POST /feedback/reports/{id}/publishis person-only on MCP, the WebSocket relay andclarkcant api.Phase 4: handling eligibility
eligible: false, code: "handling-unavailable", naming Epic: migrate ClarkCant to Pi 1.0 and pilot Pi Durable without duplicating runtime semantics #402 and feat(release): seamless self-update, background-work continuity, signed cross-platform releases and changelog UX #508. There is no Handle button. The card shows the reason.Phase 7: issue templates
.github/ISSUE_TEMPLATE/bug.ymlandfeature.ymlmirror the same information model. The invariant checker accepts them.What stays the same
ghshell-out worker. Phases 5 and 6 are not started.Verification
dfcad96b: focused Vitest (conversation-client, contracts, the runtime feedback suites, coreexecution-policy, install-approval, open-interfaces, slash-commands) 157 files and 2069 tests passed; typecheck clean;pnpm invariants13/13; ESLint on the touched files clean; the feedback e2e 3/3 passed.corepack pnpm verify: 7042 tests passed, with one file-level failure,session-preview-real.spec.ts, from a WindowsEPERMwhile removing its temp profile dir; that file passes on its own (3/3).93bfa74d: focused Vitest (runtime feedback suites, coreexecution-policy.spec.ts, contracts) 51 files and 963 tests passed; typecheck clean;pnpm invariants13/13; ESLint on the touched files clean; the feedback e2e 3/3 passed.corepack pnpm verifyonac705e39: exit 0. Invariants,tsc(both configs) and ESLint pass; Vitest 7021 passed, 37 skipped, 1 todo across 526 files, 0 failed.product-feedback.spec.ts: 45, including the reported sequence (attempt at T0, offline check at +10 min, a press at +20 min finds the issue by its marker, with one GitHub write in total), policy deny and prohibition refused on the person's press, ask answered by the press, the restart sweep, and conversation delete;feedback-compose.spec.ts(new): 25, covering philosophy cases EN/VI/NFD, titles, the Windows home scrub, mentions and surrogate-safe cutting;feedback-surfaces.spec.ts,feedback-github.spec.tsand contractsfeedback.spec.ts: 28;feedback-card.spec.ts(new): 8, plus the card-state matrix.apps/web/e2e/feedback-report.spec.ts: 3 of 3 passed against the in-process GitHub fixture. The new case runs/report bug …, checks nothing is filed before the press, presses Create issue, and checks the prepared card stays a record after a reload.Limitations
package.jsonuntil feat(release): seamless self-update, background-work continuity, signed cross-platform releases and changelog UX #508 defines the canonical release version.Notes for review
apps/runtime/src/host-text.tsgets one entry, the English tool labelreport_feedback. The host-text language test requires every defined tool to have one./in the composer now shows all 7 commands and one skill within the 8-row cap. More skills appear as the person types.composer-references.spec.tsnow states that rule instead of a list that only fit by coincidence.audit.spec.ts,conversation-delete.spec.tsandpackages/core/test/install-from-source.spec.ts. Applied migrations are unchanged.routes/conversations.ts,services.ts, the contracts index, the clientapi.tsand the open-interfaces docs. Expect textual conflicts only, whichever lands second.Remaining phases and blockers
devbranch and release contract) is blocked on feat(release): seamless self-update, background-work continuity, signed cross-platform releases and changelog UX #508.startHandlingstays not-eligible with its reason until both land.Docs impact
docs/open-interfaces.mdand.vi.mdgain a "Product reports" section (routes,intent/answers, statuses, Check again versus Send again, restart reconciliation, the policy on the person's press, the marker, eligibility,CC_GITHUB_FIXTURE) and add the publish route to the person-only list.