bcs797ulchl4lqpnahbkvnd07vsg6n5g · 53 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 | |
| 019f950f-ceba-7c44-a1be-2d446fb75666 | spec-ejq.1 | claimed | Eugene Blikh | {"id":"spec-ejq.1","title":"Consolidate owner+agents read predicate into one Principal.CanRead()","description":"graph/server.go:161, web/handlers.go:61 and now mcpsrv.Gate each hand-spell 'IsOwner() || IsAgent()'. graph.gate's own comment warns two read surfaces with two policies is how a corpus leaks — there are now three copies. Add authn.Principal.CanRead() and route all three through it so the policy is defined once. Low-risk mechanical refactor; deferred out of spec-jjo to keep that bug fix surgical.","status":"open","priority":4,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-24T16:45:16Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T16:45:16Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T19:57:48Z |
| 019f9511-6765-7a54-b5ac-1c081434f0cf | spec-ejq.1 | closed | Eugene Blikh | authn.Principal.CanRead() defined once; graph.gate, web.mayRead, mcpsrv.Gate routed through it. coreauth left independent (different semantic). Unit test covers owner/agent true, anon/zero/unknown false. Commit pending push. | NULL | 2026-07-24T19:59:33Z | |
| 019f9515-34a5-7a5c-8fe0-0e1298c0b6dc | spec-wcr | updated | Eugene Blikh | {"id":"spec-wcr","title":"Loose ends from Phases 1-2 (latent bugs, no user impact yet)","description":"Real issues agents flagged and deliberately left alone during the parallel build. None blocks anything today; each is a trap for a later phase.","design":"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 -\u003e identical IDs -\u003e 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.","status":"open","priority":3,"issue_type":"chore","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:52Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T04:09:52Z"} | {"notes":"Triage 2026-07-24 (post Phase 5a). Investigated all 7 items:\n\n#1 ProposalBranch 3rd copy in OpenProposal SQL — DONE (commit e97532c): pure-Go guard test TestOpenProposalBranchMatchesCanonical asserts BranchPrefix||id == core.ProposalBranch(id). No behavior change.\n\n#2 linkHierarchy path.Dir vs DirOf — JUDGEMENT CALL, deferred. Fixing changes link-resolution behavior for root-level parent: targets; needs a design decision + fixture confirming intended resolution before touching.\n\n#3 SplitLog id collision — NOT A BUG as feared. Already correctly defended in search/extract.go (logEntries substitutes p.ID for the log# prefix → space-unique). \"Fix at source in doc/\" would push search-index-keyspace uniqueness into doc/, which shouldn't know it's indexed into a shared space index. Current layering (doc/ = within-doc identity, search/ = index-key uniqueness) is arguably correct. Recommend WONTFIX unless a second SplitLog consumer appears.\n\n#4 delete doc.Scan/DocumentSource — JUDGEMENT CALL (deletion), deferred. Production-dead after service.Archive; also the seam that made web's layering violation writable. Lean delete, but confirm no external/test reliance first.\n\n#5 beforeCAS \"test hook in production\" — NOT A BUG. gitx.beforeCAS is an unexported field set only by same-package tests (write_test/merge_test); zero prod cost, cannot be set externally. Standard test-seam pattern. mcpsrv has no such hook (item wording conflated). Recommend WONTFIX.\n\n#6 no GraphQL complexity limit — FEATURE, deferred. Low risk on single-user authed surface; wire only if /query is ever widened.\n\n#7 attachments (gitx walks .md only) — FEATURE, deferred. Real work: WalkBlobs + asset index, or adopt Mermaid-by-convention. Phase 5+ scope.\n\nActionable-now clear win (#1) done. Remainder are judgement calls (#2,#4), non-issues (#3,#5), or features (#6,#7) — each needs a decision, not mechanical fixing."} | NULL | 2026-07-24T20:03:42Z |
| 019f954f-6055-774f-a234-abcf74285aba | spec-wcr | claimed | Eugene Blikh | {"id":"spec-wcr","title":"Loose ends from Phases 1-2 (latent bugs, no user impact yet)","description":"Real issues agents flagged and deliberately left alone during the parallel build. None blocks anything today; each is a trap for a later phase.","design":"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 -\u003e identical IDs -\u003e 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.","notes":"Triage 2026-07-24 (post Phase 5a). Investigated all 7 items:\n\n#1 ProposalBranch 3rd copy in OpenProposal SQL — DONE (commit e97532c): pure-Go guard test TestOpenProposalBranchMatchesCanonical asserts BranchPrefix||id == core.ProposalBranch(id). No behavior change.\n\n#2 linkHierarchy path.Dir vs DirOf — JUDGEMENT CALL, deferred. Fixing changes link-resolution behavior for root-level parent: targets; needs a design decision + fixture confirming intended resolution before touching.\n\n#3 SplitLog id collision — NOT A BUG as feared. Already correctly defended in search/extract.go (logEntries substitutes p.ID for the log# prefix → space-unique). \"Fix at source in doc/\" would push search-index-keyspace uniqueness into doc/, which shouldn't know it's indexed into a shared space index. Current layering (doc/ = within-doc identity, search/ = index-key uniqueness) is arguably correct. Recommend WONTFIX unless a second SplitLog consumer appears.\n\n#4 delete doc.Scan/DocumentSource — JUDGEMENT CALL (deletion), deferred. Production-dead after service.Archive; also the seam that made web's layering violation writable. Lean delete, but confirm no external/test reliance first.\n\n#5 beforeCAS \"test hook in production\" — NOT A BUG. gitx.beforeCAS is an unexported field set only by same-package tests (write_test/merge_test); zero prod cost, cannot be set externally. Standard test-seam pattern. mcpsrv has no such hook (item wording conflated). Recommend WONTFIX.\n\n#6 no GraphQL complexity limit — FEATURE, deferred. Low risk on single-user authed surface; wire only if /query is ever widened.\n\n#7 attachments (gitx walks .md only) — FEATURE, deferred. Real work: WalkBlobs + asset index, or adopt Mermaid-by-convention. Phase 5+ scope.\n\nActionable-now clear win (#1) done. Remainder are judgement calls (#2,#4), non-issues (#3,#5), or features (#6,#7) — each needs a decision, not mechanical fixing.","status":"open","priority":3,"issue_type":"chore","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:52Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T17:03:43Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T21:07:15Z |
| 019f9554-0976-7c29-971b-58c9a453838e | spec-by6.1 | created | Eugene Blikh | NULL | 2026-07-24T21:12:20Z | ||
| 019f9554-1918-764d-98b5-82c4a40d6b6a | spec-by6.2 | created | Eugene Blikh | NULL | 2026-07-24T21:12:24Z | ||
| 019f9554-5a0e-7d75-b4f4-ff8a54fb1449 | spec-wcr | updated | Eugene Blikh | {"id":"spec-wcr","title":"Loose ends from Phases 1-2 (latent bugs, no user impact yet)","description":"Real issues agents flagged and deliberately left alone during the parallel build. None blocks anything today; each is a trap for a later phase.","design":"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 -\u003e identical IDs -\u003e 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.","notes":"Triage 2026-07-24 (post Phase 5a). Investigated all 7 items:\n\n#1 ProposalBranch 3rd copy in OpenProposal SQL — DONE (commit e97532c): pure-Go guard test TestOpenProposalBranchMatchesCanonical asserts BranchPrefix||id == core.ProposalBranch(id). No behavior change.\n\n#2 linkHierarchy path.Dir vs DirOf — JUDGEMENT CALL, deferred. Fixing changes link-resolution behavior for root-level parent: targets; needs a design decision + fixture confirming intended resolution before touching.\n\n#3 SplitLog id collision — NOT A BUG as feared. Already correctly defended in search/extract.go (logEntries substitutes p.ID for the log# prefix → space-unique). \"Fix at source in doc/\" would push search-index-keyspace uniqueness into doc/, which shouldn't know it's indexed into a shared space index. Current layering (doc/ = within-doc identity, search/ = index-key uniqueness) is arguably correct. Recommend WONTFIX unless a second SplitLog consumer appears.\n\n#4 delete doc.Scan/DocumentSource — JUDGEMENT CALL (deletion), deferred. Production-dead after service.Archive; also the seam that made web's layering violation writable. Lean delete, but confirm no external/test reliance first.\n\n#5 beforeCAS \"test hook in production\" — NOT A BUG. gitx.beforeCAS is an unexported field set only by same-package tests (write_test/merge_test); zero prod cost, cannot be set externally. Standard test-seam pattern. mcpsrv has no such hook (item wording conflated). Recommend WONTFIX.\n\n#6 no GraphQL complexity limit — FEATURE, deferred. Low risk on single-user authed surface; wire only if /query is ever widened.\n\n#7 attachments (gitx walks .md only) — FEATURE, deferred. Real work: WalkBlobs + asset index, or adopt Mermaid-by-convention. Phase 5+ scope.\n\nActionable-now clear win (#1) done. Remainder are judgement calls (#2,#4), non-issues (#3,#5), or features (#6,#7) — each needs a decision, not mechanical fixing.","status":"in_progress","priority":3,"issue_type":"chore","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:52Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T18:07:15Z","started_at":"2026-07-24T18:07:15Z"} | {"notes":"RESOLVED 2026-07-24. All 7 items dispositioned.\n\n#1 ProposalBranch 3rd copy in OpenProposal SQL — FIXED (e97532c), guard test.\n\n#2 linkHierarchy path.Dir vs DirOf — FIXED. Prior triage called this a\njudgement call that 'changes resolution behaviour'; that was wrong. Traced it:\npath.Dir and DirOf differ only for root-level documents, and there the\nsection-proximity step (stemsIn[topSection(fromDir)+'/'+bare]) is subsumed by\nthe same-directory step above it — stemsIn['/x'] is populated only by a root\nx.md, which byPath['x.md'] already returned. So '.' only ever skipped a lookup\nthat had already answered. VERIFIED by reverting to path.Dir and re-running:\nidentical results. Changed to DirOf as trap-removal, with\nTestParentResolvesLikeAWikilinkFromTheSameDocument pinning the invariant\n(parent: resolves to what the same wikilink in the body resolves to).\n\n#3 SplitLog id collision — WONTFIX. Already correctly defended in\nsearch/extract.go; 'fixing at source' would push index-keyspace uniqueness into\ndoc/, which shouldn't know it is indexed into a shared space index.\n\n#4 delete doc.Scan/DocumentSource — DONE. Confirmed production-dead (only\nconsumer was doc's own test fixture). Deleted both; doc/ now owns no way to read\na revision, leaving service.Archive as the single route from rev to Archive —\nclosing the seam that made web's layering violation writable. doc test fixture\nrewritten onto ListDocuments+FromDocuments; TestScanReportsGitErrors relocated\nto gitx as TestWalkOfAnUnknownRevisionFails (gitx had no unknown-rev coverage).\n\n#5 beforeCAS test hook — WONTFIX. Unexported, set only by same-package tests,\ncannot be set externally. Standard test-seam pattern; mcpsrv has no such hook.\n\n#6 GraphQL complexity limit — moved to spec-by6.1 (feature, Phase 5).\n#7 attachments — moved to spec-by6.2 (feature, Phase 5)."} | NULL | 2026-07-24T21:12:41Z |
| 019f9554-5bac-7003-9869-81c779107e05 | spec-wcr | closed | Eugene Blikh | All 7 items dispositioned: 2 fixed (#1,#2), 1 deleted (#4), 2 wontfix (#3,#5), 2 moved to Phase 5 (spec-by6.1, spec-by6.2). | NULL | 2026-07-24T21:12:41Z | |
| 019f957c-90e6-7655-b056-68c310182019 | spec-by6.3 | created | Eugene Blikh | NULL | 2026-07-24T21:56:36Z | ||
| 019f957c-f2ef-7b42-9bb0-df63e0227eb5 | spec-by6.3.1 | created | Eugene Blikh | NULL | 2026-07-24T21:57:01Z | ||
| 019f957d-0092-706d-8434-6d4b8d36f36d | spec-by6.3.2 | created | Eugene Blikh | NULL | 2026-07-24T21:57:05Z | ||
| 019f957d-240a-79b0-af34-85f5d83c392c | spec-by6.3.3 | created | Eugene Blikh | NULL | 2026-07-24T21:57:14Z | ||
| 019f957d-310a-7bbf-b9e0-a4a74e4eca7b | spec-by6.3.4 | created | Eugene Blikh | NULL | 2026-07-24T21:57:17Z | ||
| 019f957d-7e8c-769b-889b-6339720107fa | spec-by6.3.1 | claimed | Eugene Blikh | {"id":"spec-by6.3.1","title":"Comment anchors: core type + db schema","description":"Foundation wave. core.CommentAnchor (doc_id, heading_path, ordinal, hash) plus the anchor-state vocabulary (anchored | moved | outdated) and the resolution function, kept free of a prosediff import so core stays dependency-free — resolution takes the block fields it needs, not the Block type. migrations/0004_comment.sql + schema.sql: the comment table storing the tuple, threading via parent_id, author identity + agent provenance (mirroring proposal's ck_proposal_provenance rule), and resolved timestamp. Anchor state is NOT a column — it is derived per revision at read time. db/comment.go with the insert/list/resolve queries and a test that a reflow keeps the comment and a deletion outdates it.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-24T18:57:02Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T18:57:02Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T21:57:37Z |
| 019f9587-ad9c-73ef-aa02-0ab05a8416c3 | spec-by6.3.1 | closed | Eugene Blikh | core.CommentAnchor + ResolveAnchor with 9 tests; migrations/0004_comment.sql + schema.sql; db/comment.go with 8 Postgres-backed tests, all green against real PG 16. | NULL | 2026-07-24T22:08:44Z | |
| 019f9588-b33f-76e5-8c66-bf96dea4c4bc | spec-by6.3.2 | claimed | Eugene Blikh | {"id":"spec-by6.3.2","title":"service: comment API + policy auto-merge gate","description":"service.Comment type, Comment/ListComments/ReplyComment/ResolveComment, and the anchor resolution pass that takes a revision's prosediff blocks and reports each comment as anchored, moved or outdated. Wire the merge gate: an unresolved comment suppresses policy auto-merge (not manual approve) — the check belongs beside the existing auto-merge policy evaluation, and needs a test that a commented proposal stops auto-merging while Merge with human approval still succeeds.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-24T18:57:05Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T18:57:05Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T22:09:51Z |
| 019f958d-c531-794e-8a80-2f9e28a96f31 | spec-by6.3.2 | closed | Eugene Blikh | service.CommentOn/ReplyTo/ResolveThread/Threads + AnchorThreads/AnchorOf; auto-merge gate in autoMerges. 10 tests, PG-backed ones green against real PG 16. | NULL | 2026-07-24T22:15:24Z | |
| 019f95a8-c52f-776a-a83c-3e53ca1eda2b | spec-by6.3.4 | updated | Eugene Blikh | {"id":"spec-by6.3.4","title":"mcpsrv: spec_comment tool (read + reply, no resolve)","description":"The agent half of the loop. spec_comment lets an agent list the comments on a proposal it authored and reply to them; it must NOT resolve one, since an agent marking its own critique resolved defeats the auto-merge gate. Reuses the Phase 3 provenance path (agent + agent_session) for reply authorship, and the existing owner+agents read gate from spec-jjo. mcpsrv/mcpsrv.go:39 still documents spec_comment as deliberately absent — update that comment when it lands.","status":"open","priority":3,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-24T18:57:18Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T18:57:18Z"} | {"notes":"Implemented. Divergence from this issue's original text, accepted: reads are NOT narrowed to 'a proposal the agent authored'. Agent identity is self-declared (X-Agent/X-Agent-Session headers) and all agents share one token, so an authorship check would gate on a string the caller chooses — stricter on paper than the owner+agents read plane (spec-jjo) it sits in, while enforcing nothing. Revisit if/when per-agent token scoping lands (spec-by6 backlog).\n\nNo-resolve is enforced by TYPE: Commenter names only Threads/ReplyTo/GetProposal/ProposalDiff, so service.CommentOn and service.ResolveThread are unreachable from the handler however service/ grows. Writer is now Proposer+Commenter.\n\nExtra beyond the issue: replying requires proposal+thread and checks membership, because a thread id is global and service.ReplyTo takes only the id — a mistyped id would otherwise reply on a stranger's proposal."} | NULL | 2026-07-24T22:44:53Z |
| 019f95a8-cbc7-7080-831a-ec34bf9de8cf | spec-by6.3.4 | closed | Eugene Blikh | spec_comment: list threads with anchor state + reply; no-resolve enforced by interface. 9 tests green, no DB needed. Committed f82d90a. | NULL | 2026-07-24T22:44:55Z | |
| 019f95b6-197d-76b6-9bde-49d4d4cb39b7 | spec-by6.3.3 | closed | Eugene Blikh | Context blocks + anchor ids + thread UI; lost-anchor area; stale-block 409. Committed 472bcb1. | NULL | 2026-07-24T22:59:27Z | |
| 019f95b6-2115-7259-b377-e6371d2941f0 | spec-by6.3 | closed | Eugene Blikh | All four children done: core+db anchors (1a25367), service API + auto-merge gate (c6e5d66), mcpsrv spec_comment (f82d90a), web commentable diff (472bcb1). | NULL | 2026-07-24T22:59:29Z | |
| 019f95ca-7833-7d36-97be-f7d65bc4d6a1 | spec-ar4 | claimed | Eugene Blikh | {"id":"spec-ar4","title":"Restart other SourceHut services so spec.sr.ht appears in their nav","description":"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 \u003cthe sourcehut services\u003e.","status":"open","priority":2,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:53Z","created_by":"Eugene Blikh","updated_at":"2026-07-23T04:09:53Z"} | {"assignee":"Eugene Blikh","status":"in_progress"} | NULL | 2026-07-24T23:21:42Z |
| 019f95cb-df31-7269-bee3-4a072c07efb6 | spec-ar4 | updated | Eugene Blikh | {"id":"spec-ar4","title":"Restart other SourceHut services so spec.sr.ht appears in their nav","description":"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 \u003cthe sourcehut services\u003e.","status":"in_progress","priority":2,"issue_type":"task","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-23T04:09:53Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T20:21:42Z","started_at":"2026-07-24T20:21:42Z"} | {"notes":"2026-07-24: verified still needed, but BLOCKED on host access from this machine.\n\nVerified over HTTPS (LAN, read-only):\n- spec.srht.bigb.es -\u003e HTTP 200, the service itself is up.\n- git / meta / todo .srht.bigb.es nav all still MISSING a spec entry, so the restart has not happened and is still the remaining step.\n\nAccess attempts: 'phoebe' does not resolve; srht.bigb.es domains resolve to 192.168.88.18, which answers on :22 but refuses blikh (publickey,password). The working git remote is the restricted 'git' user shell, not a login. No deploy repo here carries an SSH path — deploys to phoebe are pull-based (apk-mirror re-indexes within 15 min), so there is no push-SSH route configured on this Mac.\n\nNeeds the owner to run it on phoebe directly:\n docker compose restart\nThen confirm with:\n curl -s https://git.srht.bigb.es | grep -c spec.srht.bigb.es # expect \u003e0"} | NULL | 2026-07-24T23:23:13Z |