usrvllksc71apufrvl85cbskc72s3hc8 · 27 rows
| id | issue_id | event_type | actor | old_value | new_value | comment | created_at |
|---|---|---|---|---|---|---|---|
| 019f8d29-5397-7e0d-b817-f81fc1ea0840 | spec-ejq | created | Eugene Blikh | NULL | 2026-07-23T07:08:43Z | ||
| 019f8d29-8cc1-7d90-b19d-8c7c5c36b37c | spec-zqb | created | Eugene Blikh | NULL | 2026-07-23T07:08:58Z | ||
| 019f8d29-f61c-7c87-aa9f-c2d08aa053de | spec-3vz | created | Eugene Blikh | NULL | 2026-07-23T07:09:25Z | ||
| 019f8d29-fb60-73a1-be7f-c0199fcc676a | spec-by6 | created | Eugene Blikh | NULL | 2026-07-23T07:09:26Z | ||
| 019f8d2a-5ea5-7e9e-aab2-44c0ca2eb3c7 | spec-wcr | created | Eugene Blikh | NULL | 2026-07-23T07:09:52Z | ||
| 019f8d2a-626d-73e4-9e8d-d0df4ddd8437 | spec-ar4 | created | Eugene Blikh | NULL | 2026-07-23T07:09:53Z | ||
| 019f8d2a-66d9-73c8-b102-455f9cb41611 | spec-43w | created | Eugene Blikh | NULL | 2026-07-23T07:09:54Z | ||
| 019f8d51-a40a-7cec-9ccc-53dcd00c9666 | spec-43w | closed | Eugene Blikh | Stale apk pins already bumped in the stack versions.env (paste 0.19.4-r0, hub 0.31.1-r0); fixed out of band. | NULL | 2026-07-23T07:52:45Z | |
| 019f8d51-d807-7465-87f6-e94b035bd584 | spec-zqb | claimed | Eugene Blikh | {"id":"spec-zqb","title":"Phase 3: write plane — agents propose","description":"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.","design":"Scope: proposals (branch proposals/\u003cid\u003e + Postgres row, state open-\u003emerged|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.","status":"open","priority":1,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:08:58Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T04:08:58Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-23T07:52:59Z |
| 019f8d73-0a9b-7e86-8f51-1851559c98a1 | spec-jjo | created | Eugene Blikh | NULL | 2026-07-23T08:29:14Z | ||
| 019f8d73-443d-74e2-b383-b1fe9cac3f89 | spec-zqb | closed | Eugene Blikh | 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). | NULL | 2026-07-23T08:29:29Z | |
| 019f8dac-62b4-7586-b6ed-d1fd10a209a3 | spec-3vz | claimed | Eugene Blikh | {"id":"spec-3vz","title":"Phase 4: review plane — approve/reject in a browser","description":"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.","design":"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 \u003c= 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.","status":"open","priority":2,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:25Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T04:09:25Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-23T09:31:52Z |
| 019f8dbf-9f12-71ad-be1a-25ad050b8655 | spec-mfm | created | Eugene Blikh | NULL | 2026-07-23T09:52:53Z | ||
| 019f8dbf-a581-7353-ac71-aac7403f5466 | spec-3vz | closed | Eugene Blikh | 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. | NULL | 2026-07-23T09:52:55Z | |
| 019f8dc8-d95b-7daf-90cd-eaf2e7575e02 | spec-3m9 | created | Eugene Blikh | NULL | 2026-07-23T10:02:58Z | ||
| 019f8dc8-ded8-7301-8f4b-b77fa045ed8b | spec-3m9 | claimed | Eugene Blikh | {"id":"spec-3m9","title":"Phase 5a: webhooks + notifications on proposal lifecycle","description":"Emit webhooks on proposal open/merge/reject so external systems and email learn about review events. core-go/webhooks is GraphQL-native; the Phase 2 read schema at /query is the foundation. First slice of Phase 5 (spec-by6).","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-23T07:02:58Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T07:02:58Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-23T10:02:59Z |
| 019f91de-d454-75cc-97d7-7252b2993b83 | spec-3m9 | updated | Eugene Blikh | {"id":"spec-3m9","title":"Phase 5a: webhooks + notifications on proposal lifecycle","description":"Emit webhooks on proposal open/merge/reject so external systems and email learn about review events. core-go/webhooks is GraphQL-native; the Phase 2 read schema at /query is the foundation. First slice of Phase 5 (spec-by6).","status":"in_progress","priority":3,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-23T07:02:58Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T07:03:00Z","started_at":"2026-07-23T07:03:00Z"} | {"description":"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."} | NULL | 2026-07-24T05:05:27Z |
| 019f91de-d881-7cf8-818f-bf93678361f1 | spec-8y4 | created | Eugene Blikh | NULL | 2026-07-24T05:05:28Z | ||
| 019f91de-da86-7dac-9775-7ea6c0d049bd | spec-45j | created | Eugene Blikh | NULL | 2026-07-24T05:05:29Z | ||
| 019f9388-60c0-7c63-af2a-72a4204c086f | spec-45j | closed | Eugene Blikh | Webhook tables/SDL/resolvers/delivery all shipped and verified end-to-end. | NULL | 2026-07-24T12:50:16Z | |
| 019f9388-6565-776a-9981-597c97d03836 | spec-8y4 | closed | Eugene Blikh | Adopted core-go server stack for /query (faithful path); the convention pieces webhooks needed (auth/database/server context, database.Model for webhook models, gqlgen) are in. | NULL | 2026-07-24T12:50:17Z | |
| 019f9388-67e2-7ae1-a922-4d6512ee0c21 | spec-3m9 | closed | Eugene Blikh | Phase 5a webhooks complete: DB + authn→AuthContext bridge + GraphQL surface + core-go server wiring + firing. Verified live: agent REST propose delivers an Ed25519-signed POST whose body is the subscription query executed against the ProposalEvent payload; delivery recorded. | NULL | 2026-07-24T12:50:18Z | |
| 019f9501-8f28-7cb9-adf5-63cf96358bd3 | spec-jjo | claimed | Eugene Blikh | {"id":"spec-jjo","title":"MCP read tools (/mcp) have no auth gate — reads are open behind the Host check","description":"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.","status":"open","priority":3,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-23T05:29:15Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T05:29:15Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T19:42:15Z |
| 019f9504-4ff9-71f0-99e6-f4ecb18a35b1 | spec-ejq.1 | created | Eugene Blikh | NULL | 2026-07-24T19:45:15Z | ||
| 019f9504-8f0b-769f-ae58-fa2d2f33e332 | spec-jjo | closed | Eugene Blikh | MCP surface gated to owner+agents (mcpsrv.Gate), mounted inside resolver middleware; tests cover anon 401 / owner+agent pass / fail-closed without middleware. Commit 7cc652d. | NULL | 2026-07-24T19:45:31Z | |
| 019f9508-0fe2-7cec-b14d-74d325836985 | spec-mfm | claimed | Eugene Blikh | {"id":"spec-mfm","title":"Digest should track 'since you last looked' via digest_mark, not just show recent policy-merges","description":"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.","status":"open","priority":3,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-23T06:52:53Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T06:52:53Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T19:49:21Z |
| 019f950c-69d6-7547-95f1-4bca5bc75604 | spec-mfm | closed | Eugene Blikh | Inbox GET reads digest_mark to flag/count new-since-last-looked auto-merges + divider (pure read); explicit POST /inbox/seen advances the mark behind owner-only + same-origin guard. service.DigestMark/MarkDigestSeen added. Commit 865a21f. | NULL | 2026-07-24T19:54:06Z |