main · last commit
18 hours ago ·
8tmadfpi
spec-wcr Loose ends from Phases 1-2 (latent bugs, no user impact yet)
Past Stand
bd reopen spec-wcr
| Created by | Eugene Blikh |
| Owner | bigbes@gmail.com |
| Created | 2026-07-23T04:09:52Z |
| Started | 2026-07-24T18:07:15Z |
| Updated | 2026-07-24T18:12:42Z |
| Closed | 2026-07-24T18:12:42Z |
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.
RESOLVED 2026-07-24. All 7 items dispositioned. #1 ProposalBranch 3rd copy in OpenProposal SQL — FIXED (e97532c), guard test. #2 linkHierarchy path.Dir vs DirOf — FIXED. Prior triage called this a judgement call that 'changes resolution behaviour'; that was wrong. Traced it: path.Dir and DirOf differ only for root-level documents, and there the section-proximity step (stemsIn[topSection(fromDir)+'/'+bare]) is subsumed by the same-directory step above it — stemsIn['/x'] is populated only by a root x.md, which byPath['x.md'] already returned. So '.' only ever skipped a lookup that had already answered. VERIFIED by reverting to path.Dir and re-running: identical results. Changed to DirOf as trap-removal, with TestParentResolvesLikeAWikilinkFromTheSameDocument pinning the invariant (parent: resolves to what the same wikilink in the body resolves to). #3 SplitLog id collision — WONTFIX. Already correctly defended in search/extract.go; 'fixing at source' would push index-keyspace uniqueness into doc/, which shouldn't know it is indexed into a shared space index. #4 delete doc.Scan/DocumentSource — DONE. Confirmed production-dead (only consumer was doc's own test fixture). Deleted both; doc/ now owns no way to read a revision, leaving service.Archive as the single route from rev to Archive — closing the seam that made web's layering violation writable. doc test fixture rewritten onto ListDocuments+FromDocuments; TestScanReportsGitErrors relocated to gitx as TestWalkOfAnUnknownRevisionFails (gitx had no unknown-rev coverage). #5 beforeCAS test hook — WONTFIX. Unexported, set only by same-package tests, cannot be set externally. Standard test-seam pattern; mcpsrv has no such hook. #6 GraphQL complexity limit — moved to spec-by6.1 (feature, Phase 5). #7 attachments — moved to spec-by6.2 (feature, Phase 5).
spec-ejq
— spec.sr.ht — reviewable document storage for humans and agents
parent-child
open
Nothing depends on this issue.
| id | spec-wcr |
| content_hash | 49e00deebe86e55d30ead451d2a2418250908bba4a3cc686046e357c75088b29 |
| 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 -> 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. |
| acceptance_criteria | |
| notes | RESOLVED 2026-07-24. All 7 items dispositioned. #1 ProposalBranch 3rd copy in OpenProposal SQL — FIXED (e97532c), guard test. #2 linkHierarchy path.Dir vs DirOf — FIXED. Prior triage called this a judgement call that 'changes resolution behaviour'; that was wrong. Traced it: path.Dir and DirOf differ only for root-level documents, and there the section-proximity step (stemsIn[topSection(fromDir)+'/'+bare]) is subsumed by the same-directory step above it — stemsIn['/x'] is populated only by a root x.md, which byPath['x.md'] already returned. So '.' only ever skipped a lookup that had already answered. VERIFIED by reverting to path.Dir and re-running: identical results. Changed to DirOf as trap-removal, with TestParentResolvesLikeAWikilinkFromTheSameDocument pinning the invariant (parent: resolves to what the same wikilink in the body resolves to). #3 SplitLog id collision — WONTFIX. Already correctly defended in search/extract.go; 'fixing at source' would push index-keyspace uniqueness into doc/, which shouldn't know it is indexed into a shared space index. #4 delete doc.Scan/DocumentSource — DONE. Confirmed production-dead (only consumer was doc's own test fixture). Deleted both; doc/ now owns no way to read a revision, leaving service.Archive as the single route from rev to Archive — closing the seam that made web's layering violation writable. doc test fixture rewritten onto ListDocuments+FromDocuments; TestScanReportsGitErrors relocated to gitx as TestWalkOfAnUnknownRevisionFails (gitx had no unknown-rev coverage). #5 beforeCAS test hook — WONTFIX. Unexported, set only by same-package tests, cannot be set externally. Standard test-seam pattern; mcpsrv has no such hook. #6 GraphQL complexity limit — moved to spec-by6.1 (feature, Phase 5). #7 attachments — moved to spec-by6.2 (feature, Phase 5). |
| status | closed |
| priority | 3 |
| issue_type | chore |
| assignee | Eugene Blikh |
| estimated_minutes | NULL |
| created_at | 2026-07-23T04:09:52Z |
| created_by | Eugene Blikh |
| owner | bigbes@gmail.com |
| updated_at | 2026-07-24T18:12:42Z |
| closed_at | 2026-07-24T18:12:42Z |
| closed_by_session | |
| external_ref | NULL |
| spec_id | |
| compaction_level | 0 |
| compacted_at | NULL |
| compacted_at_commit | NULL |
| original_size | NULL |
| sender | |
| ephemeral | 0 |
| wisp_type | |
| pinned | 0 |
| is_template | 0 |
| mol_type | |
| work_type | |
| source_system | |
| metadata | �{} |
| source_repo | |
| close_reason | 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). |
| event_kind | |
| actor | |
| target | |
| payload | |
| await_type | |
| await_id | |
| timeout_ns | 0 |
| waiters | |
| hook_bead | |
| role_bead | |
| agent_state | |
| last_activity | NULL |
| role_type | |
| rig | |
| due_at | NULL |
| defer_until | NULL |
| no_history | 0 |
| started_at | 2026-07-24T18:07:15Z |
| is_blocked | 0 |
| id | 942e2413-03bf-539b-ac4a-a15e86560648 |
| issue_id | spec-wcr |
| type | parent-child |
| created_at | 2026-07-23T07:09:52Z |
| created_by | Eugene Blikh |
| metadata | �{} |
| thread_id | |
| depends_on_issue_id | spec-ejq |
| depends_on_wisp_id | NULL |
| depends_on_external | NULL |
| id | 019f8d2a-5ea5-7e9e-aab2-44c0ca2eb3c7 |
| issue_id | spec-wcr |
| event_type | created |
| actor | Eugene Blikh |
| old_value | |
| new_value | |
| comment | NULL |
| created_at | 2026-07-23T07:09:52Z |
| id | 019f9515-34a5-7a5c-8fe0-0e1298c0b6dc |
| issue_id | spec-wcr |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"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"} |
| new_value | {"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."} |
| comment | NULL |
| created_at | 2026-07-24T20:03:42Z |
| id | 019f954f-6055-774f-a234-abcf74285aba |
| issue_id | spec-wcr |
| event_type | claimed |
| actor | Eugene Blikh |
| old_value | {"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"} |
| new_value | {"assignee":"Eugene Blikh","status":"in_progress"} |
| comment | NULL |
| created_at | 2026-07-24T21:07:15Z |
| id | 019f9554-5a0e-7d75-b4f4-ff8a54fb1449 |
| issue_id | spec-wcr |
| event_type | updated |
| actor | Eugene Blikh |
| old_value | {"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"} |
| new_value | {"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)."} |
| comment | NULL |
| created_at | 2026-07-24T21:12:41Z |
| id | 019f9554-5bac-7003-9869-81c779107e05 |
| issue_id | spec-wcr |
| event_type | closed |
| actor | Eugene Blikh |
| old_value | |
| new_value | 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). |
| comment | NULL |
| created_at | 2026-07-24T21:12:41Z |
No comments.
Close reason