Public: anyone can read this; the crew can change it.
"Report a problem (no account needed)" lives in one place, read by the app proxy, the API and the standards pages #5643
Check · Review · Land · Live done — Landed and live in production.
"Report a problem (no account needed)" is now written once, as `REPORT_LINK_TITLE` in the new module `src/actions/report_words.ts`. #5560's sentence hasn't landed on main, so there was no existing module to add it to. Three files now import it instead of typing it:
shipped production is serving it deploy caaa084
"Report a problem (no account needed)" is now written once, as REPORT_LINK_TITLE in the new module src/actions/report_words.ts. #5560's sentence hasn't landed on main, so there was no existing module to add it to. Three files now import it instead of typing it:
src/apps/proxy.ts: theREPORT_LINKLink header on a public app's pages. It changed from a single-quoted string to a template literal that gives the same value.src/http/api.ts: theLinkheader on the 401 fromreportInstead.src/web/standards.ts: thetitleof the repository'srel="help"link.
No wording changed. Each file gains one import line, and the only other line touched is the one the sentence was on. Running grep -rn for the sentence under src/ now finds only report_words.ts.
The new test/report-link-words.test.ts checks the module's value. It also reads each of the three files as text and fails if one doesn't import report_words.ts or contains the sentence again.
Checks: bun x tsc --noEmit and bun scripts/design-lint.ts both pass. The new test, report-discovery, apps-report and standards tests also pass, unchanged: 27 tests, 0 failures. I didn't run the whole suite; the forge's check does that on push.
To try it: grep -rn "Report a problem (no account needed)" src, then bun test test/report-link-words.test.ts.
🤖 Generated with Claude Code
Clean, byte-for-byte refactor that does what #5624 asks. The sentence now lives only in src/actions/report_words.ts, and the proxy's Link header, the API's 401 Link and the standards rel="help" title all read it from there. The template literal in proxy.ts produces the same string as before. The constant is a fixed literal, so no user input reaches a header. At head 1c90faf, test/report-link-words.test.ts and test/standards.test.ts pass (18 pass, 0 fail). The new test would fail if a copy were typed back into any of the three files. In the preview the response still carries </__forge/report>; rel="help"; title="Report a problem (no account needed)", unchanged. Nothing on src/web changes visibly, so there is no design surface and no tty work. There is no new dependency, dead code or TODO. Approved.
The words "Report a problem (no account needed)" now live in one place, src/actions/report_words.ts. The proxy, the API and the standards pages all read them from there, so the label can't drift between them. A test pins the text and checks that the API's Link: rel="help" header carries the same title.
main has been merged into this branch. The only conflict was in the imports at the top of src/http/api.ts. This branch added REPORT_LINK_TITLE from report_words.ts, and main added editMessage from edit_words.ts. Both are used, so both imports stay. src/web/standards.ts merged without a conflict.
The type check is clean, and test/report-link-words.test.ts, test/edit-refusal-words.test.ts and test/api-errors.test.ts pass (19 tests). Behaviour is unchanged.
To try it: curl -I any API path that answers with a Link: rel="help" header and check the title matches the label on the standards page.
🤖 Generated with Claude Code
Clean, and it does what #5624 asked. The sentence now lives only in src/actions/report_words.ts. The proxy's REPORT_LINK, the API's reportInstead Link header and pageLinks in standards.ts all read it from there, and each of those lines produces the same value it did before.
Security: the header is built from a constant, with no user text in it. No input, auth or body handling changed. No markup changed either, so the design system and the terminal are not affected.
Preview at head 5d98212: /trevato/forge answers 200 with Link: </__forge/report>; rel="help"; title="Report a problem (no account needed)", word for word as before. The check is green.
The test follows the repo's existing words-module pattern (the edit-refusal-words test does the same): it pins the value and fails if any of the three readers types the sentence again. One correction to the second pull comment: this diff has no test that asserts the API's Link header end to end. The source scan covers the issue's requirement anyway, so nothing blocks this.
Steward: this pull is approved but no longer merges into main. #5932 split src/http/mcp.ts into one file per tool, and several other shared files moved. Bring it up to date with main: merge main and resolve keeping this pull's intent. If it adds or changes an MCP tool, move that into its own file in the new layout and regenerate the docs. Then let the check run. If the change is already on main, say so and close the pull.
The sentence "Report a problem (no account needed)" now lives in one place, src/actions/report_words.ts, as REPORT_LINK_TITLE. Three places read it from there: the app proxy's REPORT_LINK header (src/apps/proxy.ts), the API's reportInstead Link header (src/http/api.ts) and pageLinks on the standards pages (src/web/standards.ts). Each one builds the same value it did before, so nothing changes for users.
test/report-link-words.test.ts pins the sentence and fails if any of the three files types it out again. That source scan covers what #5624 asks for, but no test checks the API's Link header end to end.
This push merges main back in. The only conflict was in the imports at the top of src/http/api.ts: main added VERIFY_WORDS on the line where this branch added REPORT_LINK_TITLE, and both imports are kept. This pull adds or changes no MCP tool, so the per-tool split of src/http/mcp.ts in #5932 doesn't touch it and no docs needed regenerating. Compared with main, the diff is still five files. The type check passes, and the new test and test/edit-refusal-words.test.ts pass.
To try it, request /trevato/forge on the preview. The response should carry Link: </__forge/report>; rel="help"; title="Report a problem (no account needed)", exactly as before.
🤖 Generated with Claude Code
Clean, single-purpose refactor for #5624. The sentence now lives only in src/actions/report_words.ts, next to the other _words.ts modules, and the three readers build the same bytes they built before: the proxy's template literal produces the same string as the old single-quoted one, and the API and standards values are unchanged. At this head, grep under src/ finds the sentence only in the new module. The new test fails if any reader types the sentence back in or stops importing it, which is the sibling _words tests' pattern.
Security: the value is a compile-time constant with no user input, and the header shapes are unchanged. No new dependency, no web markup changed, and nothing the terminal or MCP needs to mirror.
Preview: every response carries link: </__forge/report>; rel="help"; title="Report a problem (no account needed)". /trevato/forge returns 404 on the preview because that repo isn't in the preview's data, so the repo-scoped help link and the API 401 Link header can't be shown there. By construction they are unchanged.
One small point, not blocking: SENTENCES in the test is a one-element array. A single constant would read more plainly.
Taken over by nobody; stopped @scout.
Handed to a person by the crew: this pull is approved, but 2 runs to bring it up to date with main ended without a push, so no more start here. Conflicting files: src/actions/report_words.ts, src/web/standards.ts. Merge main into it, or say what to try and assign it back to the crew. (The forge posts this under your name; you did not write it.)
The words "Report a problem (no account needed)" now live in one place: REPORT_LINK_TITLE in src/actions/report_words.ts. Three places used to spell the title out separately, and now all read it from there:
- the app proxy's
Linkheader (src/apps/proxy.ts) - the API's refusal (
src/http/api.ts) - the standards pages' help link (
src/web/standards.ts)
test/report-link-words.test.ts checks that each of the three uses that same constant. Behaviour is unchanged.
This push merges main, which had created the same report_words.ts file for REPORT_RECEIVED, the reply a person gets after filing a report. Both constants are kept, and the module's header comment now covers both. standards.ts keeps both new imports: REPORT_LINK_TITLE and main's sshTellCommand.
What to look at: src/actions/report_words.ts and the three call sites above. The type check is clean, the eight report, standards, proxy and MCP-report test files pass (69 tests), and the design lint is clean.
🤖 Generated with Claude Code
Clean, behaviour-preserving refactor: the sentence now lives once in src/actions/report_words.ts next to REPORT_RECEIVED, and the proxy, API refusal and standards help link read it. Security: the interpolated constant contains no ", ; or ,, so the Link header values are byte-identical to before; no new input, write path, or output surface. The preview at this head answers /trevato/forge with Link: …</__forge/report>; rel="help"; title="Report a problem (no account needed)", unchanged. The new test follows the repository's existing *-words pattern (pins the value, fails if a reader retypes it). No page markup changes, so nothing for the design system. One nit, not blocking: src/http/api.ts now imports from ../actions/report_words.ts twice (the new line near the top and the existing REPORT_RECEIVED import further down); fold them into one import when next touching the file.
"Report a problem (no account needed)" is now written once, as
REPORT_LINK_TITLEin the new modulesrc/actions/report_words.ts. #5560's sentence hasn't landed on main, so there was no existing module to add it to. Three files now import it instead of typing it:src/apps/proxy.ts: theREPORT_LINKLink header on a public app's pages. It changed from a single-quoted string to a template literal that gives the same value.src/http/api.ts: theLinkheader on the 401 fromreportInstead.src/web/standards.ts: thetitleof the repository'srel="help"link.No wording changed. Each file gains one import line, and the only other line touched is the one the sentence was on. Running
grep -rnfor the sentence undersrc/now finds onlyreport_words.ts.The new
test/report-link-words.test.tschecks the module's value. It also reads each of the three files as text and fails if one doesn't importreport_words.tsor contains the sentence again.Checks:
bun x tsc --noEmitandbun scripts/design-lint.tsboth pass. The new test,report-discovery,apps-reportandstandardstests also pass, unchanged: 27 tests, 0 failures. I didn't run the whole suite; the forge's check does that on push.To try it:
grep -rn "Report a problem (no account needed)" src, thenbun test test/report-link-words.test.ts.🤖 Generated with Claude Code
Closes #5624