distill: Backlog Stubs Become GitHub Issues (#185) - #219
Merged
Conversation
The close wrote this lesson but the feature PR merged without it, leaving the close record pointing at a path that was never committed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Creates the backlog-stub concept and updates epic-approval-gate, which sheds the stub detail it no longer owns. Refreshes the anchors for both plus the stale stub-promotion glob line on workspace-resolution, and removes the consumed scratch dir. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 3, 2026
sameera
added a commit
that referenced
this pull request
Aug 4, 2026
The distiller's surfaces still read the cap as covering the whole body, so a drain facing a full page had no legal way to record a real edge and the honest move was to drop it and describe the interaction in prose. PR #219 did exactly that, three times. The page-patching step now caps a page's own content and states that Integration Points is bounded per entry instead, at 40 words a bullet, so a page over 400 total body words through its neighbour list needs no split and no compression. The split step and the eviction of last resort both name own-content overflow as their only trigger; neighbour-list pressure is explicitly not one. The reciprocity fan-out states the remedy the new ceiling needs: write the bullet within 40 words, and if the interaction genuinely will not fit, that is two interactions — declare two edges, never drop or demote one. The validator step's rule becomes "a non-zero exit blocks" rather than "any finding blocks", with advisories named as the exception a drain carries into the PR body and proceeds past. The store's usage README matches the new denominator and the per-bullet bound. Closes #224
sameera
added a commit
that referenced
this pull request
Aug 4, 2026
The distiller's surfaces still read the cap as covering the whole body, so a drain facing a full page had no legal way to record a real edge and the honest move was to drop it and describe the interaction in prose. PR #219 did exactly that, three times. The page-patching step now caps a page's own content and states that Integration Points is bounded per entry instead, at 40 words a bullet, so a page over 400 total body words through its neighbour list needs no split and no compression. The split step and the eviction of last resort both name own-content overflow as their only trigger; neighbour-list pressure is explicitly not one. The reciprocity fan-out states the remedy the new ceiling needs: write the bullet within 40 words, and if the interaction genuinely will not fit, that is two interactions — declare two edges, never drop or demote one. The validator step's rule becomes "a non-zero exit blocks" rather than "any finding blocks", with advisories named as the exception a drain carries into the PR body and proceeds past. The store's usage README matches the new denominator and the per-bullet bound. Closes #224
sameera
added a commit
that referenced
this pull request
Aug 6, 2026
PR #219 recorded three real interactions of backlog-stub as prose because each neighbour sat within two words of the old 400-word body cap and a reciprocal bullet did not fit. Epic #220 re-cut the cap to measure a page's own content, so the fan-out can no longer fail — the edges are declared here: publishing-config-resolution, issue-sourced-planning, durable-close-record, each with its mirrored bullet and reciprocal Decision Log entry. Hand curation (last_updated_by: manual): both epics had already drained, so no queue entry was left to carry the edges. Atlas regenerated; anchors untouched, since no code changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Distillation: Backlog Stubs Become GitHub Issues
Drained queue entries:
.nexus/tmp/epic-185/(ephemeral, same-sitting close) — provenance:#185The why came from decision record #192, fetched and hash-verified against the digest stamped at close (
55493c77…). The what came from the recorded range3735d95…9d42385, resolved through merged PR #217.backlog-stub — create
#185(Backlog Stubs Become GitHub Issues #185)epic-approval-gateepic-approval-gate — update
stub decompositionmoved tobacklog-stub, where it now resolves.#185(Backlog Stubs Become GitHub Issues #185)backlog-stubReviewer notes
1.
backlog-stubdeclares only onetoucheslink, and that is a cap artefact rather than a judgement about the concept. Its real neighbours arepublishing-config-resolution(the unplanned label is one more resolved key; the batch path's classification now comes from the caller),issue-sourced-planning(the resolver refuses an unplanned epic by name), anddurable-close-record(deferred scope is filed post-checkpoint, before the record naming those numbers is committed). All three sit at 398–400 body words with 7/7 invariants. A reciprocal Integration Points bullet costs ~15 words, so declaring any of those touches would push the target over the 400-word cap, and anupdatemay not compress still-true content to make room.epic-approval-gatewas linkable only because this epic genuinely superseded its stub prose. Those relationships are carried inbacklog-stub's own prose instead.2. The store is saturated against the cap store-wide. Nine pages sit at exactly 400 words, twenty more at 394–399. New concepts can no longer link into the existing graph without a split somewhere, which degrades the touches-as-neighbour-list retrieval the store depends on. Flagging as an operational finding; no page was split in this drain, since none of the saturated pages is broad because of this epic.
3. One anchor outside the touched set was refreshed.
.nexus/anchors/workspace-resolution.mdcarried two lines this epic falsified — the stub-promotion glob across backlogs, and close writing deferred scope under the feature path. The close record explicitly deferred that repoint to the drain rather than hand-editing a derived file on the feature branch (record #192 invariant 17, narrowed with rationale). Anchors are derived state that stale-rebuilds by design, so it is regenerated here.4. One extra commit rides this branch.
9278722addsdocs/delivery/lessons/2026-08-02-backlog-stubs-as-issues.md— epic #185's process lesson. The close wrote it, PR #217 merged without it, and the close record points at that exact path, so the trunk carried a dangling reference. Committed with the lead's explicit consent at the preflight gate.Anchors refreshed (derived, never hand-edited)
.nexus/anchors/backlog-stub.md@9d42385a3585858bf599987598a214d4daa37968.nexus/anchors/epic-approval-gate.md@9d42385a3585858bf599987598a214d4daa37968.nexus/anchors/workspace-resolution.md@9d42385a3585858bf599987598a214d4daa37968Atlas regenerated (derived)
docs/concepts.md(48 concepts)Consumed queue entries (removed by this PR)
This PR already removes the drained entry's committed home on the branch, so the merge deletes it from main atomically with the page writes — no manual post-merge step:
.nexus/queue/epic-185/— the epic's per-user scratch dir (recoverable via git history). The drained entry itself was ephemeral, so this is what the committed removal targets..nexus/tmp/epic-185/copy is machine-local and is cleaned, uncommitted, by the next/nxs.distillrun once this PR's provenance is on the trunk.