gujc4v4igo9qo2kptagjd05d5l5mhhj8 · 12 rows
| id | content_hash | title | description | design | acceptance_criteria | notes | status | priority | issue_type | assignee | estimated_minutes | created_at | created_by | owner | updated_at | closed_at | closed_by_session | external_ref | spec_id | compaction_level | compacted_at | compacted_at_commit | original_size | sender | ephemeral | wisp_type | pinned | is_template | mol_type | work_type | source_system | metadata | source_repo | close_reason | event_kind | actor | target | payload | await_type | await_id | timeout_ns | waiters | hook_bead | role_bead | agent_state | last_activity | role_type | rig | due_at | defer_until | no_history | started_at | is_blocked |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| spec-3m9 | abe1c2fc2de8f0338fb78f23322b8c0c612e963b219e326658b426dfd08245c0 | Phase 5a: webhooks + notifications on proposal lifecycle | Phase 5a: webhooks via FULL core-go convention adoption (user chose to match pages.sr.ht/lists.sr.ht byte-for-byte). Prerequisite: retrofit graph/ onto core-go conventions (database.Model, @access/@private directives, cursor pagination, auth.Middleware + a user model with OAuth2 scopes). Then add gql_proposal_wh_sub/_delivery + webhook SDL/resolvers/delivery on top. Reference: ~/data/home/tmp/pages.sr.ht (same fork). Large graph rewrite, not additive. | in_progress | 3 | feature | Eugene Blikh | NULL | 2026-07-23T07:02:58Z | Eugene Blikh | bigbes@gmail.com | 2026-07-24T02:05:28Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | 2026-07-23T07:03:00Z | 0 | ||||||||||||||||||||||||
| spec-3vz | 9f3be3e241f18287f989301fe6cea7e81ffd2c66663911b2ec0f2eec9b4425ff | Phase 4: review plane — approve/reject in a browser | Proposal pages at stable URLs (returned by every write), the inbox, prose diff, approve (merges immediately) / reject, status lifecycle, and the digest of policy-merged firehose content. | Productionise prosediff (the Phase 0 spike) into the review UI. CRITICAL requirement from the Phase 0 verdict: 13% of real prose modifications shred into interleaved fragments (similarity <= 0.73), so the UI MUST switch to a two-column old/new view below ~0.75 and inline word diffs above it — building only the inline renderer makes one review in eight unreadable. The prosediff package already emits the (Hash, HeadingPath, Ordinal) comment-anchor tuple. Reads a proposal branch via service.ReadDocumentAtRef (the deliberately-awkward bypass), never the normal read path. | closed | 2 | feature | Eugene Blikh | NULL | 2026-07-23T04:09:25Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T06:52:55Z | 2026-07-23T06:52:55Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Review plane shipped: proposal page at /~owner/space/p/<id> with the prose diff (inline word-diff above 0.75 similarity, two-column old/new below — the Phase 0 verdict's hard requirement, in web/diff.go), approve(merge)/reject as owner-only CSRF-guarded POSTs, status badges, and the /inbox review queue + policy-merged digest. service.ProposalDiff/InboxProposals/DigestProposals/MergeHuman back it; web.Reader extended. Diff reads the proposal branch by resolving its tip to a sha (pinned read) rather than the ReadDocumentAtRef bypass — cleaner and immutable. Validated: diff renderer unit tests (inline/two-column/escaping), proposal-page + approve/reject handler tests (CSRF, owner-only, stale->409, wrong-space->404), inbox tests, and PG-backed service tests. Follow-up: digest_mark 'since last seen' tracking. | 0 | NULL | NULL | NULL | 0 | 2026-07-23T06:31:53Z | 0 | ||||||||||||||||||||||
| spec-43w | f49e1b7f7a2f68c5465a82fa5abcbda22506cbb29f3a192bd2d3f62617951432 | Stale apk pins: paste.sr.ht 0.19.3-r0 and hub.sr.ht 0.29.4-r0 aged off the mirror | Pre-existing, not caused by spec.sr.ht — but a FULL stack rebuild (post_push) would fail on these two apk layers and leave the stack un-deployable (the 2026-07-11 incident pattern). The self-hosted append-only repo.bigb.es mirror only preserves what it has seen, and it started after these aged off; old versions are unrecoverable. | spec.sr.ht was deployed AROUND this with labng push --no-restart + a single-service 'docker compose build spec', so nothing else rebuilt. To fix properly: bump the two pins in versions.env to what the mirror currently ships (paste 0.19.4-r0, hub 0.31.1-r0 as of 2026-07-22). hub 0.29.4->0.31.1 crosses two minors with forward-only migrations — pg_dumpall first per the stack CLAUDE.md. Kept separate from the spec deploy deliberately. | closed | 2 | bug | NULL | NULL | 2026-07-23T04:09:54Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T04:52:46Z | 2026-07-23T04:52:46Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Stale apk pins already bumped in the stack versions.env (paste 0.19.4-r0, hub 0.31.1-r0); fixed out of band. | 0 | NULL | NULL | NULL | 0 | NULL | 0 | ||||||||||||||||||||||
| spec-45j | 55fdf511b2f851497c73bed8b73ff921cb95db951667c8f300dc290e79b12a28 | Phase 5a-2: webhook tables, SDL, resolvers, delivery on proposal open/merge/reject | On top of 5a-1: gql_proposal_wh_sub/_delivery tables + migration, WebhookSubscription/Delivery/Payload SDL, create/delete mutations + webhooks queries, and fire via webhooks.Schedule on proposal lifecycle events (service event hook -> queue). Reference pages.sr.ht webhooks/webhooks.go + graph/model/webhooks.go. | closed | 3 | feature | NULL | NULL | 2026-07-24T02:05:29Z | Eugene Blikh | bigbes@gmail.com | 2026-07-24T09:50:16Z | 2026-07-24T09:50:16Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Webhook tables/SDL/resolvers/delivery all shipped and verified end-to-end. | 0 | NULL | NULL | NULL | 0 | NULL | 0 | |||||||||||||||||||||||
| spec-8y4 | 1985c014f152c1ad343c1ffdd8d2f17c81e8dae9b4772b416ea7cb37ef9a5a4f | Phase 5a-1: adopt core-go graph conventions (directives, database.Model, cursors, auth+user model) | Retrofit spec's minimal hand-written graph onto core-go's stack, the prerequisite for GraphQL-native webhooks. Per pages.sr.ht: @access/@private directives + impls, core-go database.Model for space/document/proposal/project/search types, cursor pagination, core-go auth.Middleware + a single-owner user table. Blueprint from ~/data/home/tmp/pages.sr.ht. | open | 3 | feature | NULL | NULL | 2026-07-24T02:05:29Z | Eugene Blikh | bigbes@gmail.com | 2026-07-24T02:05:29Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | ||||||||||||||||||||||||
| spec-ar4 | 6cbe05b1d310f62b1a8ec2e21729ea5c53869f322b7c174a89b699c1608a380b | Restart other SourceHut services so spec.sr.ht appears in their nav | The switcher entry is config-driven: each service builds its own nav from config sections ending in .sr.ht. spec.sr.ht is in the shared config.ini now, but the OTHER services (git, meta, todo, ...) only pick up the new entry on restart. Not done unprompted because it briefly bounces every service. On phoebe: docker compose restart <the sourcehut services>. | open | 2 | task | NULL | NULL | 2026-07-23T04:09:53Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T04:09:53Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | ||||||||||||||||||||||||
| spec-by6 | 135e33fb1bdf43b87c9230a59444bca23bb9a2fc202adc4cb3cd62f45e4f4e63 | Phase 5: comments, webhooks, mutations, vector search | The deferred pile, each unblocked once its prerequisite lands. | Inline comments (anchor tuple already emitted by prosediff; settle resolution against the built review UI before committing a schema). Webhooks + notifications (core-go/webhooks is GraphQL-native; the Phase 2 read schema is the foundation). GraphQL mutations once the proposal state machine stops moving. Vector search over the project index (warren's embed/ was deliberately not ported). Per-space token scoping (currently one token; scoping is a column + filter clause). Read-only mounts of external corpora (second-brain, Confluence RFCs) if the boundary ever moves — global IDs keep the door open. | open | 3 | feature | NULL | NULL | 2026-07-23T04:09:27Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T04:09:27Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | |||||||||||||||||||||||
| spec-ejq | 102df983370943b985b602c02245055bc6077e30f60b82cc027d2d45e5dd7c00 | spec.sr.ht — reviewable document storage for humans and agents | A third custom Go service on the self-hosted SourceHut instance: agents propose documents, a human reviews and curates, agents read the approved text. One loop — bot produces, human curates, bots consume. Runs at https://spec.srht.bigb.es, deployed on phoebe as srht-spec-1. Code: git.sourcecraft.dev/bigbes/sr-ht-spec. Design: docs/DESIGN.md. | DONE and deployed (Phases 0-2): core domain, gitx (bare repos + id-keyed tree-splice merge), db (Postgres schema + global ID registry), authn (unified-login cookie + agent tokens + provenance), the three receive hooks + hook RPC + daemon, service layer + reconciler, doc (warren vault/render on git objects), search (one global bleve index, per-line ru/en routing), projects (saved filter, not container), web read UI, mcpsrv read tools, graph read schema, prosediff (Phase 0 gate PASSED), specsrht space create/list, push->reindex. Live corpus: ~bigbes/rfcs holds SPEC-0001 and NOTE-0001. Verified end-to-end: validating push path, fail-closed reads, id-addressing, bilingual search, GraphQL. NOT DONE: the agent half of the loop (write plane), review UI, comments. | open | 1 | epic | NULL | NULL | 2026-07-23T04:08:44Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T04:08:44Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | |||||||||||||||||||||||
| spec-jjo | 24266167e6658b316bf0de74a8be97019e0447b2d70f6008f89195e84041133c | MCP read tools (/mcp) have no auth gate — reads are open behind the Host check | Phase 3 added the resolver middleware to /mcp so spec_propose can resolve the agent, but the read tools (spec_search/spec_read/spec_list) still have no ACL: anyone passing the Host allowlist can read approved content. graph's /query gates to owner+agents (graph.gate); /mcp does not. The design's read plane is fail-closed (owner+agents only). Add the same gate to the MCP surface. Pre-existing since Phase 2; not caused by Phase 3, but now that /mcp resolves a principal the gate is a one-liner. Deliberately left out of Phase 3 to avoid changing Phase 2 read behavior mid-feature. | open | 3 | bug | NULL | NULL | 2026-07-23T05:29:15Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T05:29:15Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | ||||||||||||||||||||||||
| spec-mfm | b80b8233f618b43a155481c0832d645afb80809f1631e1c2193537ece20855a6 | Digest should track 'since you last looked' via digest_mark, not just show recent policy-merges | Phase 4 ships the policy-merged digest as 'recent policy-merged proposals' (service.DigestProposals). The design intends it as 'what auto-merged since you last saw the digest', backed by the digest_mark table (db.GetDigestMark/SetDigestMark, already present). Advancing the mark is a write, and the inbox GET is deliberately kept pure, so this needs either a POST 'mark as seen' action or an accepted side-effecting GET. Low priority: the digest already surfaces auto-merged content, which is its core purpose. | open | 3 | feature | NULL | NULL | 2026-07-23T06:52:53Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T06:52:53Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | ||||||||||||||||||||||||
| spec-wcr | 49e00deebe86e55d30ead451d2a2418250908bba4a3cc686046e357c75088b29 | Loose ends from Phases 1-2 (latent bugs, no user impact yet) | Real issues agents flagged and deliberately left alone during the parallel build. None blocks anything today; each is a trap for a later phase. | 1. ProposalBranch derived THREE ways: core.ProposalBranch (canonical), and a third copy in SQL — db.OpenProposal concatenates prefix||serial in its INSERT to allocate id+branch atomically. Shares the prefix constant but not the function; reconcile if they can ever diverge. 2. doc.linkHierarchy passes path.Dir(p.Path) i.e. '.' as fromDir where every other call site uses DirOf ('') — section-proximity lookup misses for root-level parent: targets. Latent; fixing changes resolution behaviour. 3. doc.SplitLog collides entry IDs within a space (two type:log docs -> identical IDs -> second silently overwrites first in one index). Defended in search/ but should be fixed at source in doc/. 4. doc.Scan/DocumentSource are production-dead after service.Archive landed — they're the documented seam but also the API that made web's layering violation writable; delete is a judgement call. 5. mcpsrv ships a beforeCAS test hook in production code (gitx too). 6. No GraphQL complexity limit — service authenticates on its own router, not core-go's WithSchema, so nothing bounds query cost; low risk on a single-user authed surface. 7. Attachments: gitx walks .md only, so image embeds render as visibly-missing; needs WalkBlobs + asset index, or prefer Mermaid by convention. | open | 3 | chore | NULL | NULL | 2026-07-23T04:09:52Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T04:09:52Z | NULL | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | 0 | NULL | NULL | NULL | 0 | NULL | 0 | |||||||||||||||||||||||
| spec-zqb | c07464bc7a9591857c6b728007a315cf1ff427be76a0aa4c2f54c75081d776a2 | Phase 3: write plane — agents propose | The agent half of the loop, and the service's whole premise: an agent proposes a document change, gets back a link, a human approves in a browser. Until this ships, agents can only read. | Scope: proposals (branch proposals/<id> + Postgres row, state open->merged|rejected); the If-Match tree-splice merge with the four staleness cases and the ancestry check gitx flagged; the single agent token + mandatory provenance trailers; spec_propose / spec_comment over REST + MCP; every write response returns {proposal, url} so the agent can hand over a link. Prereqs found during Phases 1-2: (1) service.ListProposals(space, state) — graph proposal listing is stubbed and db only has ListProposalsByState; (2) IsAncestor(proposalHead, H) check before Merge so an already-merged proposal reports 'already merged' not a confusing 409; (3) auto-merge policy evaluation (.spec.yml AutoMerges) which the reconciler's 'approval=policy' inference also wants. Dispatch like Phases 1-2: proposal orchestration in service/ first and committed, then surface tools fan out. This is where the merge model and reconciler first run under real proposals rather than on paper. | closed | 1 | feature | Eugene Blikh | NULL | 2026-07-23T04:08:58Z | Eugene Blikh | bigbes@gmail.com | 2026-07-23T05:29:29Z | 2026-07-23T05:29:29Z | NULL | 0 | NULL | NULL | NULL | 0 | 0 | 0 | �{} | Write plane shipped: service.Propose/Merge/Reject/ListProposals with provenance trailers, auto-merge policy, If-Match staleness + already-merged ancestry check; surfaces graph (Proposals port), mcpsrv spec_propose, and new api/ REST PUT — every write returns {proposal, url}. Validated end-to-end against Postgres. spec_comment deliberately deferred to Phase 5 (spec-by6), which gates the comment schema on the Phase 4 review UI; the approve/reject browser UI is Phase 4 (spec-3vz). | 0 | NULL | NULL | NULL | 0 | 2026-07-23T04:52:59Z | 0 |