Login
Check-in [73894cf022]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:The connector's sign-in link brings a signed-out viewer back to the authorize request

Intent: the maintainer's first try at adding the connector in Claude (8:51 PM Nov 5, record.jsonl on ollama; screenshot ocx-console 4b8cbe87ce) opened authorize in Claude's in-app browser, signed out of Fossil. The page's sign-in link sent them to Fossil's login, which after sign-in showed "Not Found: Page not found: https:". Fossil 2.27's login sends the browser back to the repository's URL, a slash and g (`%R/%s`, its src/login.c), and the page gave g as an absolute https:// URL.

Expression: the consent page gives g as the path below the repository, ext/ocx2-cgi/oauth/authorize?FIELDS, which Fossil's rule turns back into the same authorize request.

Demonstrates: spec/ocx/connector_spec.cr: signed out, authorize's sign-in link carries g such that SITE, a slash and g is the authorize request it answered. End to end against a local `fossil server --nojail --repolist --extroot --notfound --files` started as hosts.json starts the public one: signed out, authorize asks to sign in; its link opens Fossil's login, which keeps g; the login POST is sent back to exactly the authorize request, which offers approve; approve 302 to https://claude.ai/api/mcp/auth_callback with the state; token 200; initialize 200; notifications/initialized 202; tools/list, five tools; ocx_status as voice. The guards pass, with the known database-is-locked flake (ticket 00817df826) and the fixture teardown race rerun green on their own; coverage 100.0%.

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

Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | connector-oauth
Files: files | file ages | folders
SHA3-256: 73894cf022d5bf7b9389250e1ffb0894bee33152994ec4fc37e8815524c38746
User & Date: x86-1-session 2026-11-06 05:05:34.147
Context
2026-11-08
05:50
The preview runs an app's release offered as next

Intent: the maintainer asked that a staged app be seen before it is accepted: "Accept should not be required before preview" and "once it is staged, a preview should be available" (ocx-console posts 9d5d8673f4 and 498cf64f4d, relayed by the One Place session). ext/ocx2-cgi-next/app/APP ran the app's current release, so a staged console could not be previewed.

Expression: Apps.serve takes the preview explicitly, under precept C6 (Explicit Arguments), from the context the program's name sets, and Apps.program picks the app root's staged/next for the preview and current otherwise, as Projects.program does for OCX's own program. With nothing offered, the preview's 404 says no release is offered as next. The tools doc and the modules list say so.

Demonstrates: spec/ocx/apps_spec.cr: before accept, the page answers that nothing is accepted while the preview runs the staged build with Fossil's request; the preview's 404 names next. crystal run ci.cr: 713 examples, coverage 100.0%, its one error the known rcvfrom lock (ticket 00817df826), whose spec passes rerun.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KKBs1b4wzoSCq6zh7U check-in: ba21098522 user: x86-1-session tags: connector-oauth

2026-11-06
05:05
The connector's sign-in link brings a signed-out viewer back to the authorize request

Intent: the maintainer's first try at adding the connector in Claude (8:51 PM Nov 5, record.jsonl on ollama; screenshot ocx-console 4b8cbe87ce) opened authorize in Claude's in-app browser, signed out of Fossil. The page's sign-in link sent them to Fossil's login, which after sign-in showed "Not Found: Page not found: https:". Fossil 2.27's login sends the browser back to the repository's URL, a slash and g (`%R/%s`, its src/login.c), and the page gave g as an absolute https:// URL.

Expression: the consent page gives g as the path below the repository, ext/ocx2-cgi/oauth/authorize?FIELDS, which Fossil's rule turns back into the same authorize request.

Demonstrates: spec/ocx/connector_spec.cr: signed out, authorize's sign-in link carries g such that SITE, a slash and g is the authorize request it answered. End to end against a local `fossil server --nojail --repolist --extroot --notfound --files` started as hosts.json starts the public one: signed out, authorize asks to sign in; its link opens Fossil's login, which keeps g; the login POST is sent back to exactly the authorize request, which offers approve; approve 302 to https://claude.ai/api/mcp/auth_callback with the state; token 200; initialize 200; notifications/initialized 202; tools/list, five tools; ocx_status as voice. The guards pass, with the known database-is-locked flake (ticket 00817df826) and the fixture teardown race rerun green on their own; coverage 100.0%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KKBs1b4wzoSCq6zh7U check-in: 73894cf022 user: x86-1-session tags: connector-oauth

02:04
A refusing answer from the server names the server, the request and what the server said

Intent: x86-1's daemon, started again at 8:59 PM with its output kept, ended after one round with "stopped: the server answered 400 to /chat-poll" (ollama post 904dc7dc97): it named neither the project nor the request, nor why Fossil refused it; x86-1 asked that the stop name both. Fossil's chat-poll page never answers 400 itself (its src/chat.c); a 400 comes from its request parsing, malformed_request in src/cgi.c, which says why in its answer's first line.

Expression: Server::Asked#request refuses an answer that is no success or redirect saying the server's URL, the method and the path with its query, and the answer's first QUOTED (200) bytes on one line. Neither holds a secret: the URL takes no user part (Asked.reachable), the sign-in sends its password in the body, and the cookie is never shown.

Demonstrates: spec/ocx/daemon_spec.cr: chat-poll answering 400 "Bad HTTP Request: malformed HTTP header" raises from wait, naming the server, GET /chat-poll?name=-1 and that line, and daemon.log's last line says the same. spec/ocx/daemon_refusals_spec.cr, spec/ocx/daemon_pages_spec.cr, spec/ocx/receipt_spec.cr and the guards pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TUH8KKBs1b4wzoSCq6zh7U check-in: 197a37c0d8 user: x86-1-session tags: connector-oauth

Changes
Unified Diff Side-by-Side Diff Patch
Changes to spec/ocx/connector_spec.cr.
Changes to src/ocx/connector_oauth.cr.