Login
Check-in [197a37c0d8]
Login

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

Overview
Comment: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

Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | connector-oauth
Files: files | file ages | folders
SHA3-256: 197a37c0d8aee7bc1928adeb2ad8490587c22f2ddec80023b265a2dc81add160
User & Date: x86-1-session 2026-11-06 02:04:22.897
Context
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

02:00
The daemon says in daemon.log why a round or a chat wait ended it

Intent: x86-1's daemon, started on 0397ade722 after its follow, did one round on every clone at 8:33:54 PM and then exited with no line in daemon.log saying why (ollama post 55dabc25d3): Daemon.serve ends the daemon once any clone's fiber ends, and a fiber ends when its round or its chat wait raises; a round logged only a refusal, and a wait logged nothing, its exception reaching only standard error, which that start discarded. The maintainer: OCX fails visibly and logs why (their Nov 4 direction on watchdogs).

Expression: Served#round logs any exception that ends it, a refusal by its message and any other by its class and message (Daemon.said), and Served#wait logs a failed chat wait as a round that read nothing, "the chat wait failed: ...", each then raised as before, so the daemon still ends.

Demonstrates: spec/ocx/daemon_spec.cr: chat-poll answering an error item twice, as Fossil does for a login it no longer signs in, raises from wait, and daemon.log's last line says "the chat wait failed: chat-poll answered an error after signing lab-1 in again: chat is off". spec/ocx/daemon_refusals_spec.cr, spec/ocx/messages_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: dbaa1241eb user: x86-1-session tags: connector-oauth

Changes
Unified Diff Side-by-Side Diff Patch
Changes to spec/ocx/daemon_spec.cr.
Changes to src/ocx/server/pages.cr.