~bigbes/sr-ht-dolt · events

k6nhiim2n8k6j6qp153qufupocu975o6 · 90 rows

idissue_idevent_typeactorold_valuenew_valuecommentcreated_at
019feb55-f7ea-7a60-b82f-87ec2454dee2sr-ht-dolt-b08createdEugene BlikhNULL2026-08-10T14:01:47Z
019feb60-c771-7850-a79b-1209cd60ad0csr-ht-dolt-16tcreatedEugene BlikhNULL2026-08-10T14:13:36Z
019ff798-a5e4-7459-8de9-af3bc522f624sr-ht-dolt-0qfcreatedEugene BlikhNULL2026-08-12T23:10:04Z
019ff798-c0cc-74c6-9cfc-0d6705898e3csr-ht-dolt-44ncreatedEugene BlikhNULL2026-08-12T23:10:11Z
019ff79a-1117-7acd-8cc4-d0e4ac1f177asr-ht-dolt-0qf.1createdEugene BlikhNULL2026-08-12T23:11:37Z
019ff79a-2a11-7d27-a52c-70861396e9b9sr-ht-dolt-0qf.2createdEugene BlikhNULL2026-08-12T23:11:43Z
019ff79a-2ce9-7d81-a3d8-f68732ffee3bsr-ht-dolt-0qf.3createdEugene BlikhNULL2026-08-12T23:11:44Z
019ff79a-2fae-7124-8f23-45dfbded2c88sr-ht-dolt-0qf.4createdEugene BlikhNULL2026-08-12T23:11:44Z
019ff79a-32e9-7ad5-bcfa-8f6ead1c5b98sr-ht-dolt-0qf.5createdEugene BlikhNULL2026-08-12T23:11:45Z
019ff79a-35ca-7382-a055-c714bae743d5sr-ht-dolt-0qf.6createdEugene BlikhNULL2026-08-12T23:11:46Z
019ff79a-38d4-7887-9d25-da09261abd3esr-ht-dolt-44n.1createdEugene BlikhNULL2026-08-12T23:11:47Z
019ff79a-3bd4-7b10-8064-375cba8dd832sr-ht-dolt-44n.2createdEugene BlikhNULL2026-08-12T23:11:48Z
019ff79a-3eb7-788f-891c-096df08e7223sr-ht-dolt-44n.3createdEugene BlikhNULL2026-08-12T23:11:48Z
019ff79a-41a2-79b0-9c45-c45f894f9888sr-ht-dolt-44n.4createdEugene BlikhNULL2026-08-12T23:11:49Z
019ff79a-4467-7660-8846-ccd7937ef049sr-ht-dolt-44n.5createdEugene BlikhNULL2026-08-12T23:11:50Z
019ff79a-4738-7478-ad2b-627dc54b5191sr-ht-dolt-44n.6createdEugene BlikhNULL2026-08-12T23:11:50Z
019ff79a-49d3-7995-93c1-3b596f058e6csr-ht-dolt-0qf.7createdEugene BlikhNULL2026-08-12T23:11:51Z
019ff79d-be4b-77a5-a065-7db5ca4a0fd5sr-ht-dolt-0qf.1status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.1","title":"Extract the beads projection into a root beads/ package","description":"web/beads.go holds the one reading of the beads schema (fingerprint, lane bucketing, ready rule, status categories, dependency walk, event humanizer, filter model, row helpers) where a second consumer cannot reach it. Move it to a root beads/ package depending on browse/ and the stdlib only; web/beads.go and web/milestones.go keep their View implementations. Prerequisite of the MCP beads tools, of the cross-database ready page and of cross-database links.","design":"docs/DESIGN.mcp.md §8. Pure move plus export renames — web/beads_test.go and web/milestones_test.go move with it. A behaviour change smuggled into this commit makes the refactor unreviewable.","acceptance_criteria":"go test ./... green with the suites relocated; no behaviour diff in the rendered board (same fixtures, same output); beads/ imports neither net/http nor core.","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:37Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:37Z"}{"status":"in_progress"}NULL2026-08-12T23:15:38Z
019ff79d-dcfa-706d-9547-15adba5b8a1dsr-ht-dolt-44n.3status_changedEugene Blikh{"id":"sr-ht-dolt-44n.3","title":"browse: TableHash and the memory revision walk","description":"A memory row is (key, value) with no timestamp, so a two-month-old note is indistinguishable from one written this morning. Recover the date from history: add browse.TableHash (root.GetTable then Table.HashOf — O(1), reads no rows) to browse/ and both BrowseSession seams, then walk the log newest-first, skipping every commit whose config table hash is unchanged and reading rows only at the boundaries, to attribute each kv.memory key to the commit that last changed it.","design":"docs/DESIGN.views.md ch.2.1. Bound the walk at 500 commits (the most active tracker on this instance had 225 after three weeks, measured 2026-08-12 via dolt_log); an unresolved key renders \"older than the last 500 commits\" rather than a date the walk cannot support. The commit message is a claim; the table hash is the fact.","acceptance_criteria":"Fixture history where a key is written, changed, then left alone for several commits resolves to the changing commit; the not-found-within-walk arm is covered.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:49Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:49Z"}{"status":"in_progress"}NULL2026-08-12T23:15:45Z
019ff79f-25ae-7036-9bcd-66793937ac23sr-ht-dolt-0qf.2status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.2","title":"authn: the tokens.sr.ht bearer plane and core.GrantRead","description":"/mcp is bearer-only, and this service has no bearer plane today: cookie, meta PAT over HTTP Basic, and the dolt keypair JWT on gRPC. Add ParseBearer plus a plane over sr-ht-ecore/bearer (working tokens issued by tokens.sr.ht, ClientID tokens.sr.ht, gated on the new core.GrantRead = \"dolt:read\") and a meta-PAT arm over the existing decode path, gated by authn.TokenGrantsAllow at core.AccessRO. A token that fails verification is a refusal, never a downgrade to anonymous.","design":"docs/DESIGN.mcp.md §4. sr-ht-ecore/bearer + /grants are already reachable (sr-ht-ecore is a direct dependency); cov.sr.ht authn/instance.go is the donor, including the consumer-side InstanceValidator seam. [tokens.sr.ht]origin absent means no such daemon: working tokens refused, meta PATs and anonymity still work.","acceptance_criteria":"Table-driven classification tests with no network: working token with/without dolt:read, meta PAT, garbage, absent header (anonymous), expired.","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:44Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:44Z"}{"status":"in_progress"}NULL2026-08-12T23:17:10Z
019ff7a0-6d25-70d6-afde-3b1f71aa6d9dsr-ht-dolt-44n.3closedEugene Blikhbrowse.TableHash landed in 97e0f8a (root.GetTable + Table.HashOf: covers schema, rows and secondary indexes, cheaper than GetRowDataHash). The revision walk itself, and adding TableHash to the BrowseSession seams, belong to the Memory view and are specified in docs/DESIGN.views.md ch.2.1 — tracked on sr-ht-dolt-b08.NULL2026-08-12T23:18:33Z
019ff7a0-8706-7c9e-9c11-d2bb6d66b5b4sr-ht-dolt-b08updatedEugene Blikh{"id":"sr-ht-dolt-b08","title":"Memory view: surface bd memories kept in the config table","description":"`bd remember` stores agent memories in the beads `config` table as ordinary\nkey/value rows: the key is `kv.memory.\u003cslug\u003e`, the value is the memory text.\nToday they are reachable only through the generic table browser, mixed in with\nthe tracker's tuning knobs (`compact_*`, `issue_prefix`, ...), and every memory\nis squeezed into a single table cell — which is unreadable for the multi-line\nhandoff notes that make up most of them.\n\nGive them their own view, registered the same way Beads and Milestones are: a\nseparate `View` implementation whose tab appears next to them for any beads DB.\n","design":"Shape it on web/milestones.go, which is the smallest existing companion view:\n\n- `web/memory.go`: `memoryView` registered from `init()` via `RegisterView`.\n `Name() == \"memory\"`, `Label() == \"Memory\"`, `Template() == \"memory.html\"`.\n- `Applies`: the beads fingerprint (reuse `(\u0026beadsView{}).Applies`, as\n milestones does) plus a `config` table carrying `key` and `value` columns.\n `Applies` only sees table shapes, never rows, so a beads DB with no memories\n still gets the tab and renders an empty state — same contract milestones has.\n- `Build`: read `config` through `readRowsOptional`, keep rows whose key has the\n `kv.memory.` prefix, strip it for the display slug, sort by slug. Optional\n `?q=` substring filter over slug + text, and `?key=\u003cslug\u003e` for a single-memory\n detail, both parsed from the query values Build already receives.\n- Values are stored as written, so they carry both real newlines and literal\n `\\n` two-character escapes (agents type them into shell strings). Normalise\n both into paragraphs before rendering rather than dumping one blob.\n- `web/templates/memory.html`: same flat todo.sr.ht idiom and inlined\n `\u003cstyle\u003e` block as milestones.html, with the `viewtabs` partial and\n `\"Current\" \"memory\"`.\n- Tests next to `web/milestones_test.go`: fingerprint accept/reject, prefix\n filtering (a `compact_batch_size` row must not show up), escape handling,\n filter and detail modes, empty state.\n","acceptance_criteria":"A beads DB shows a Memory tab beside Beads and Milestones; it lists every kv.memory.* config row as a readable, multi-paragraph entry keyed by its slug; non-memory config rows never appear; a DB with no memories renders an empty state instead of a broken tab.","status":"open","priority":2,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-08-10T11:01:48Z","created_by":"Eugene Blikh","updated_at":"2026-08-10T11:01:48Z"}{"notes":"Owns the revision walk (docs/DESIGN.views.md ch.2.1) now that browse.TableHash exists (97e0f8a): add TableHash to web/deps.go BrowseSession (and mcpsrv/ports.go if that seam exists by then), walk the log newest-first skipping commits whose config table hash is unchanged, cap the walk at 500 commits, render 'older than the last 500 commits' when a key does not resolve. browse/ tests are stdlib style, not testify — new browse-side tests live in their own file if any are needed."}NULL2026-08-12T23:18:40Z
019ff7a8-8bb7-77df-a512-511d22133429sr-ht-dolt-0qf.2closedEugene BlikhLanded in 6288fc1: ParseBearer, the InstanceValidator seam over sr-ht-ecore/bearer, BearerCaller with Authorize, ResolveBearer branching on ClientID, core.GrantRead. Plus 0f6d50a (gofmt drift in authn tests, pre-existing at 587483e).NULL2026-08-12T23:27:26Z
019ff7a8-a6ed-700f-8c0c-d239f9bf438dsr-ht-dolt-0qf.6updatedEugene Blikh{"id":"sr-ht-dolt-0qf.6","title":"Wire /mcp into the daemon, config and README","description":"Register the MCP handler in cmd/doltsrht/main.go with r.Handle(\"/mcp\", …) before web.Register and outside its CSRF group (bearer surface, no Origin, no cookie), document [tokens.sr.ht]origin in config.example.ini, and describe the surface in README.md.","design":"docs/DESIGN.mcp.md §3, §10. Handle and not Mount: Mount rewrites the path to the empty remainder and claims /mcp/*. No mcp-enabled switch — a surface that is off in production is one nobody tests.","acceptance_criteria":"An httptest boot proves /mcp answers a tools/list and that the CSRF guard does not touch it, while a browser POST to a web form still requires same origin.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:47Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:47Z"}{"notes":"Also amend authn/ctx.go's package doc: it still says 'the three authentication flows' and does not mention the bearer plane added in 6288fc1. The wiring commit is where that sentence becomes wrong in a way a reader can see."}NULL2026-08-12T23:27:32Z
019ff97f-2da8-7ac9-bb36-6352d2bfc762sr-ht-dolt-0qf.3status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.3","title":"mcpsrv: skeleton, Host allowlist, grant gate, list_databases","description":"New mcpsrv/ package: Server + New over modelcontextprotocol/go-sdk, stateless streamable HTTP, the Host allowlist that replaces the SDK DNS-rebinding guard, the read-grant gate in front of the handler, consumer-side seams in ports.go, and one tool (list_databases) to prove the surface end to end.","design":"docs/DESIGN.mcp.md §5-§7. Stateless is an authentication decision: in stateful mode the principal of the initialize request answers every later call. Port the donor identity matrix test and re-run it against our pinned SDK rather than citing the donor.","acceptance_criteria":"Identity matrix test (no credential / stranger token / owner token on one session) asserts the answer follows the call; Host allowlist test (instance host passes, rebinding host 403 before the SDK); grant gate test.","status":"open","priority":1,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:44Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:44Z"}{"status":"in_progress"}NULL2026-08-13T08:01:29Z
019ff97f-498a-7a39-a1dd-132d1c4eeb9bsr-ht-dolt-44n.1status_changedEugene Blikh{"id":"sr-ht-dolt-44n.1","title":"Beads board: the one-column stream layout","description":"?layout=stream renders the same filtered cards top to bottom under section headers in parade order (Rolling, Lined Up, Stalled, Past Stand) with a Board | Stream toggle in the filter bar. Each section sorts to its own question: Rolling by started_at desc, Lined Up ready-first, Stalled by fewest blockers, Past Stand by closed_at desc. Past Stand is collapsed in a \u003cdetails\u003e — no JavaScript.","design":"docs/DESIGN.views.md ch.1. A layout of the Beads view and not a fifth tab: filters, the ready toggle and ?issue= links are unchanged. Needs the withQuery template func so the toggle preserves the current query.","acceptance_criteria":"Section counts equal lane counts for the same filters; each section order asserted; an unknown layout value falls back to the board.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:47Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:47Z"}{"status":"in_progress"}NULL2026-08-13T08:01:36Z
019ff98d-b13c-75d0-b6ca-776f2c40f929sr-ht-dolt-44n.1closedEugene BlikhLanded in fe616c8: ?layout=stream with per-section sorting, Past Stand collapsed in <details>, sticky section heads, withQuery template func. Measured in-page: scrollWidth == innerWidth at 1280px and at phone width.NULL2026-08-13T08:17:20Z
019ff98e-a0b6-7985-8dbf-605eaea9486esr-ht-dolt-44n.2status_changedEugene Blikh{"id":"sr-ht-dolt-44n.2","title":"Freshness line in the beads/milestones/memory header","description":"Nothing on the board says how fresh it is: with a 30s auto-push debounce and a manual pull, a store that stopped receiving pushes yesterday renders identically to a current one. Add a shared beadsHead partial rendering \"\u003cbranch\u003e · last commit \u003crelative\u003e · \u003cshort hash\u003e\", the hash linking to the commit page, fed by a Head *browse.CommitInfo field on the handleView envelope so every view gets it without asking.","design":"docs/DESIGN.views.md ch.3, ch.7. One Log(ctx, ref, \"\", 1) call. Needs the ago template func; absolute time in the title attribute.","acceptance_criteria":"A database with no commits renders the header without one rather than failing.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:48Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:48Z"}{"status":"in_progress"}NULL2026-08-13T08:18:21Z
019ff994-2090-7347-af6a-99c3f4fda901sr-ht-dolt-m63createdEugene BlikhNULL2026-08-13T08:24:22Z
019ff994-3ae4-759d-b002-d15f1a83907dsr-ht-dolt-q8ccreatedEugene BlikhNULL2026-08-13T08:24:29Z
019ff994-3cde-7505-811d-98fe99b4e002sr-ht-dolt-7tacreatedEugene BlikhNULL2026-08-13T08:24:29Z
019ff994-8f9d-7659-9c4a-0da852c10efdsr-ht-dolt-0qf.3closedEugene BlikhLanded in dcdc979: stateless streamable transport, Host allowlist replacing the SDK rebinding guard, bearer middleware with the 401/403/503 split, grant gate on core.GrantRead, seams in ports.go, list_databases. 59 tests; the identity matrix was verified to FAIL under stateless=false before being reverted.NULL2026-08-13T08:24:50Z
019ff997-0f0a-7357-afb2-47557a45d8aesr-ht-dolt-0qf.4status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.4","title":"mcpsrv: generic tools over the browse seam","description":"list_branches, list_tables, read_rows, get_commit_log, get_commit_diff — the browse surface as tools, addressing a database as {owner, name} and defaulting ref to the repository default branch. Caps: read_rows limit\u003c=500 (default 100), get_commit_log limit\u003c=100 (default 25); a truncated result says so and carries the true total.","design":"docs/DESIGN.mcp.md §9.1, §9.3. Visibility is core.Allowed/OpBrowse with NotFoundForPrivate masking — never a distinguishable forbidden.","acceptance_criteria":"Visibility matrix per tool over PUBLIC/UNLISTED/PRIVATE x anonymous/stranger/grantee/owner; cap tests.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:45Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:45Z"}{"status":"in_progress"}NULL2026-08-13T08:27:34Z
019ff997-2816-77e3-83ef-a23fe9d443d5sr-ht-dolt-m63status_changedEugene Blikh{"id":"sr-ht-dolt-m63","title":"db: enumerate the databases a caller may list across owners","description":"There is no instance-wide listing query today: db/repos.go has ListReposByOwner(owner, viewer) (the listing rule, anonymity included) and ListReposForDashboard(userID) (owned or ACL'd), and nothing that answers \"every database this caller may list\". Two consumers need exactly that: mcpsrv list_databases had to take an optional owner and refuse anonymous+no-owner rather than state something false about the instance (dcdc979), and the cross-database ready page cannot find the beads trackers without it.","design":"Add the query to db/repos.go next to its two siblings, spelled with the same listing rule ListReposByOwner documents: PUBLIC to everyone, plus anything the viewer owns or holds an ACL entry on; UNLISTED and PRIVATE never listed to a stranger. Then widen mcpsrv.Repos and web's RepoStore seam to it.","acceptance_criteria":"A table-driven db test over PUBLIC/UNLISTED/PRIVATE x anonymous/stranger/grantee/owner; list_databases with no owner answers the caller-wide listing instead of refusing.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-13T05:24:22Z","created_by":"Eugene Blikh","updated_at":"2026-08-13T05:24:22Z"}{"status":"in_progress"}NULL2026-08-13T08:27:40Z
019ff997-b643-7d00-a48f-7bca66a19632sr-ht-dolt-b08updatedEugene Blikh{"id":"sr-ht-dolt-b08","title":"Memory view: surface bd memories kept in the config table","description":"`bd remember` stores agent memories in the beads `config` table as ordinary\nkey/value rows: the key is `kv.memory.\u003cslug\u003e`, the value is the memory text.\nToday they are reachable only through the generic table browser, mixed in with\nthe tracker's tuning knobs (`compact_*`, `issue_prefix`, ...), and every memory\nis squeezed into a single table cell — which is unreadable for the multi-line\nhandoff notes that make up most of them.\n\nGive them their own view, registered the same way Beads and Milestones are: a\nseparate `View` implementation whose tab appears next to them for any beads DB.\n","design":"Shape it on web/milestones.go, which is the smallest existing companion view:\n\n- `web/memory.go`: `memoryView` registered from `init()` via `RegisterView`.\n `Name() == \"memory\"`, `Label() == \"Memory\"`, `Template() == \"memory.html\"`.\n- `Applies`: the beads fingerprint (reuse `(\u0026beadsView{}).Applies`, as\n milestones does) plus a `config` table carrying `key` and `value` columns.\n `Applies` only sees table shapes, never rows, so a beads DB with no memories\n still gets the tab and renders an empty state — same contract milestones has.\n- `Build`: read `config` through `readRowsOptional`, keep rows whose key has the\n `kv.memory.` prefix, strip it for the display slug, sort by slug. Optional\n `?q=` substring filter over slug + text, and `?key=\u003cslug\u003e` for a single-memory\n detail, both parsed from the query values Build already receives.\n- Values are stored as written, so they carry both real newlines and literal\n `\\n` two-character escapes (agents type them into shell strings). Normalise\n both into paragraphs before rendering rather than dumping one blob.\n- `web/templates/memory.html`: same flat todo.sr.ht idiom and inlined\n `\u003cstyle\u003e` block as milestones.html, with the `viewtabs` partial and\n `\"Current\" \"memory\"`.\n- Tests next to `web/milestones_test.go`: fingerprint accept/reject, prefix\n filtering (a `compact_batch_size` row must not show up), escape handling,\n filter and detail modes, empty state.\n","acceptance_criteria":"A beads DB shows a Memory tab beside Beads and Milestones; it lists every kv.memory.* config row as a readable, multi-paragraph entry keyed by its slug; non-memory config rows never appear; a DB with no memories renders an empty state instead of a broken tab.","notes":"Owns the revision walk (docs/DESIGN.views.md ch.2.1) now that browse.TableHash exists (97e0f8a): add TableHash to web/deps.go BrowseSession (and mcpsrv/ports.go if that seam exists by then), walk the log newest-first skipping commits whose config table hash is unchanged, cap the walk at 500 commits, render 'older than the last 500 commits' when a key does not resolve. browse/ tests are stdlib style, not testify — new browse-side tests live in their own file if any are needed.","status":"open","priority":2,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-08-10T11:01:48Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:18:41Z"}{"notes":"Owns the revision walk (docs/DESIGN.views.md ch.2.1) now that browse.TableHash exists (97e0f8a): add TableHash to web/deps.go BrowseSession, walk the log newest-first skipping commits whose config table hash is unchanged, cap at 500 commits, render 'older than the last 500 commits' when a key does not resolve.\nThe 'ago' func landed in 6459298 with chrome's unit ladder: it says '2 months ago' where ch.2.2's mockup wants 'written 71 days ago'. For judging staleness days are the informative unit, so this view needs a day-resolution spelling of its own rather than a change to 'ago' (which is shared with the freshness line)."}NULL2026-08-13T08:28:17Z
019ff997-cd44-7c5f-bfcb-9caa430916a3sr-ht-dolt-44n.2closedEugene BlikhLanded in 6459298: Head *browse.CommitInfo on the handleView envelope, the beadsHead partial, ago with a swappable clock. Empty history and a failing Log both degrade to no line and a 200 — the decoration can never be the reason a reader loses the board.NULL2026-08-13T08:28:23Z
019ff99a-dbdd-7e01-913c-1cab4c36e2d1sr-ht-dolt-m63closedEugene BlikhLanded in e6125fc: ListReposForViewer — ListReposByOwner's predicate minus the owner filter, anonymity spelled as viewer id 0 (unsatisfiable in both non-PUBLIC branches). Matrix asserts exact ordered listings for anonymous/stranger/grantee/both owners; mutation-checked.NULL2026-08-13T08:31:43Z
019ff99b-e62b-742e-b10e-3f524421b71csr-ht-dolt-44n.4status_changedEugene Blikh{"id":"sr-ht-dolt-44n.4","title":"Copy-ready bd commands on the issue detail pane","description":"The page shows work and cannot change it — that is the architecture. Hand over the command instead: a small block under the issue header with the bd commands appropriate to its status (open: --claim, close; in progress: close, --status=open; closed: reopen), each line user-select: all so one click selects a whole command.","design":"docs/DESIGN.views.md ch.6. No JavaScript and no clipboard API. The command names the issue and nothing about paths: this service does not know where the tracker is checked out, and guessing one would be inventing a fact about the reader machine.","acceptance_criteria":"The offered commands follow the issue status; nothing is offered that bd would refuse.","status":"open","priority":3,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:50Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:50Z"}{"status":"in_progress"}NULL2026-08-13T08:32:51Z
019ff9a1-b923-7232-997f-da2e69ebcb20sr-ht-dolt-44n.4closedEugene BlikhLanded in 3b06523: status-following bd commands under the issue header, user-select: all per line, no JavaScript. Verified after the fact that 'bd reopen' exists and is the preferred spelling for a closed issue (its help says it is more explicit than 'update --status open' and emits a Reopened event), so the closed branch stands as written.NULL2026-08-13T08:39:13Z
019ff9a8-3bc1-7242-b846-44f2f18abc3bsr-ht-dolt-ux7createdEugene BlikhNULL2026-08-13T08:46:19Z
019ff9a8-539a-7854-a3b3-4871bf41e0f9sr-ht-dolt-0dfcreatedEugene BlikhNULL2026-08-13T08:46:26Z
019ff9a8-565d-7e01-9e0b-7b72cbfd77afsr-ht-dolt-0qf.8createdEugene BlikhNULL2026-08-13T08:46:26Z
019ff9a8-970a-7101-bbfa-63ea6d3a7c0asr-ht-dolt-0qf.4closedEugene BlikhLanded in 7a77409: list_branches, list_tables, read_rows, get_commit_log, get_commit_diff in mcpsrv/browse.go. Caps clamp and say so (limit echoes what was applied); a masked database and a missing one share a byte-identical sentence; a bad ref/table is a plain answer, not the mask. 176 tests, cap test mutation-checked.NULL2026-08-13T08:46:43Z
019ff9a9-5d21-714f-821d-3f45f0ab9266sr-ht-dolt-0qf.5status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.5","title":"mcpsrv: beads tools over the shared projection","description":"list_issues, get_issue, list_milestones, list_memories over the extracted beads/ package. Lists carry identity and metadata and no long-text bodies; get_issue carries the bodies, both dependency directions, the transitive trees, subtasks with the rollup for an epic, comments and the merged history. The tool list is static per server, so a database without the fingerprint is refused per call, naming the generic tools as the way to read it anyway.","design":"docs/DESIGN.mcp.md §9.2. list_memories reports the revision each memory was last written at, sharing the walk with the Memory view.","acceptance_criteria":"A non-beads database answers the beads tools with the explanatory refusal, not an error; list_issues carries no description/design/notes field at all.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:46Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:46Z"}{"status":"in_progress"}NULL2026-08-13T08:47:34Z
019ff9ae-e7f9-7687-bead-7c487abc0047sr-ht-dolt-b08closedEugene BlikhLanded in 231b776: beads.BuildMemories with the bounded revision walk, the memory View after Milestones, agoDays for day-resolution staleness, stale? at 60 days. The walk was proven to skip rather than read (reads recorded at three refs out of five commits; 501 untouched commits cost one read). Real-data smoke: sourcehut-artifacts 9 memories attributed to distinct commits in 16.5 ms. Follow-up 0190aab replaced the init-order trick with an explicit registration list in views.go.NULL2026-08-13T08:53:37Z
019ff9b0-5fe0-7d88-93fd-005adce1b10csr-ht-dolt-44n.5status_changedEugene Blikh{"id":"sr-ht-dolt-44n.5","title":"/ready: the cross-database ready page","description":"Seventeen databases on this instance carry the beads fingerprint, and \"what is ready to work\" is answerable in each and nowhere across them. Add GET /ready (a page, not a View): for every database the caller may browse, check the fingerprint and collect the ready set through the shared beads/ rule, grouped by database. Filters: q, assignee, priority, db.","design":"docs/DESIGN.views.md ch.4. Bounded three ways: a per-database cache keyed by (repoID, head hash) so an unmoved head reads no rows, a 60s TTL, and a 64-database ceiling that the page reports when hit. The cache holds projections, never open browse handles. The aggregator is the one /mcp ready_work calls.","acceptance_criteria":"A PRIVATE tracker the caller may not browse is absent rather than 403; a second request with unmoved heads performs no row reads; the ceiling reports itself.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:50Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:11:50Z"}{"status":"in_progress"}NULL2026-08-13T08:55:13Z
019ff9b9-679b-75b1-96a5-e51b98c0badasr-ht-dolt-2wocreatedEugene BlikhNULL2026-08-13T09:05:05Z
019ff9b9-db48-7177-8e79-0d9f26641acasr-ht-dolt-0qf.1closedEugene BlikhLanded in f9c82b0 (pure move: 77 PASS lines preserved, the sorted set of test names byte-identical to the baseline) plus 7d799ed, which dropped the Bead/Beads prefix from the moved types before any consumer existed.NULL2026-08-13T09:05:34Z
019ff9b9-dd66-7192-b94c-e98d571bd494sr-ht-dolt-0qf.5closedEugene BlikhLanded in e4bc922: list_issues, get_issue, list_milestones over beads.Build/BuildMilestones. The no-bodies rule is structural — the card JSON type has no field a body could arrive in, mutation-checked by adding an empty description field and watching the guard fire. A non-beads database gets an explanatory refusal distinguishable from both the mask and an internal error. 270 tests.NULL2026-08-13T09:05:35Z
019ff9bb-61e6-7bbf-9998-27f8e78fbfadsr-ht-dolt-0qf.6status_changedEugene Blikh{"id":"sr-ht-dolt-0qf.6","title":"Wire /mcp into the daemon, config and README","description":"Register the MCP handler in cmd/doltsrht/main.go with r.Handle(\"/mcp\", …) before web.Register and outside its CSRF group (bearer surface, no Origin, no cookie), document [tokens.sr.ht]origin in config.example.ini, and describe the surface in README.md.","design":"docs/DESIGN.mcp.md §3, §10. Handle and not Mount: Mount rewrites the path to the empty remainder and claims /mcp/*. No mcp-enabled switch — a surface that is off in production is one nobody tests.","acceptance_criteria":"An httptest boot proves /mcp answers a tools/list and that the CSRF guard does not touch it, while a browser POST to a web form still requires same origin.","notes":"Also amend authn/ctx.go's package doc: it still says 'the three authentication flows' and does not mention the bearer plane added in 6288fc1. The wiring commit is where that sentence becomes wrong in a way a reader can see.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-08-12T20:11:47Z","created_by":"Eugene Blikh","updated_at":"2026-08-12T20:27:33Z"}{"status":"in_progress"}NULL2026-08-13T09:07:14Z