Epic #170: "tmp-first" artifacts - #177
Merged
Merged
Conversation
…ourced epics (#171) The analyze receipt's home is now stated, not incidental: an issue-sourced epic's analyze-receipt.md lands under .nexus/tmp/epic-<n>/ beside the materialized epic.md as ephemeral hand-off content; an old-contract committed entry keeps its committed placement unchanged; --pr mode keeps publishing a PR review and writes no receipt file. Refs #171 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t is the durable record (#172) An issue-sourced local close now resolves its epic into .nexus/tmp/epic-<n>/ and writes close-record.md there as ephemeral hand-off content — never committed, never described as committed, no manual git step to hand off to /nxs.distill. Old-contract committed entries and --pr mode are unchanged. Per record #176: the epic issue's close comment becomes the single durable copy of a local close's rationale (invariant 4 — a failed post ends with ACTION REQUIRED and a preserved body, never a success report), and it gains the marker-anchored nexus:close-record machine block stamping the record reference + full hash, conformance verdict, and full-SHA landed range in every mode (invariant 5). Refs #172 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…commit first (#173) Input Resolution now scans .nexus/tmp/ alongside the committed queue: a tmp directory is a drainable entry only when it carries both epic.md and close-record.md (an epic-only materialization is resolver scratch), and consumption is derived, not marked — an ephemeral entry is consumed exactly when the concept store at the fetched trunk carries its provenance in a structured position, so a PR closed unmerged leaves it rediscoverable and an unconsumed entry is never auto-deleted. Per record #176: the merge precondition for an entry absent from the trunk is the two-test form — range-head reachability, else merged-PR resolution (squash-safe for a local close that stamped the pre-merge branch tip); an unresolvable range is the named hard error range-unresolvable. The consumed-entry removal is re-aimed, not skipped: the committed git rm targets the epic's per-user scratch directory, and no .nexus/tmp/ path is ever staged. The checkpoint digest names each entry's source and which deletions land with the merge. Ephemeral entries never enter drain-SLO accounting. Refs #173 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…174) New --recover <epic-issue> mode rebuilds a named entry from durable GitHub state: the epic re-derives through the resolver, and the rationale, record reference + full approved-body hash, conformance verdict, and full-SHA landed range come from the epic issue's close comment — the durable close record in every mode, local and --pr alike (record #176 rewrote this story's third AC: the no-GitHub-surface premise for a local close is false once the close comment carries the machine block). Where a PR exists, its published analyze review supplies the conformance verdict. Recovery is explicit and per-entry, never a discovery scan of closed epic issues (invariant 14). The genuinely unrecoverable cases are named per-entry hard blocks — no-close-comment and range-unresolvable — never "not yet closed", never a drain with fabricated or empty rationale. Refs #174 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…facts plus committed scratch (#175) The migration's unit is now the epic, with source-relative and destination-relative paths derived separately. For an ephemeral .nexus/tmp/epic-<n> source (the tmp-first local close, #172) the hub entry is the union of the ephemeral artifacts and the epic's committed per-user scratch at .nexus/queue/epic-<n>/ — one durable entry, verified byte-for-byte (the walk hashes filesystem content directly, so the gitignored source changes nothing) — and both local copies are removed after verification, so no tmp copy survives for a later /nxs.distill in the member checkout to rediscover as a second drainable entry. This also fixes the tracked-file-check defect the record names: the helper previously reused the destination-derived relative path for the code-repo removal, so an ephemeral source with same-named committed scratch would try to commit a removal of files it never deleted — failing after the irreversible hub commit had landed. Old committed-entry sources and single-repo/hub mode are unchanged. Specs updated: /nxs.close Phase 7.5 and the nxs-close-migration skill. Refs #175 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Pre-existing on main: parity.spec.ts failed because the committed pin recorded 4422f3e9f4c1… while a fresh build hashes 13dec1e4708f…. Regenerated via the named remedy (pnpm nexus:vendor-tools; pin updated in place, no artifact copied). Unrelated to epic #170, fixed so the branch's full suite runs green. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 30, 2026
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.
No description provided.