You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
As a delivery lead, I want a finished discovery to graduate through /nxs.epic into planned work — or to close with no build when the resolutions concluded that none follows — so that the initiative lands in the one cross-feature backlog, through the one path that files stubs, and the "why" travels with it.
Acceptance Criteria
Given a discovery folder with no open decision tickets and an empty "Not yet specified" section, when/nxs.epic is run in its discovery entry mode against that folder, then it treats the discovery doc as its intent, skips the sharpness gate, and runs the existing right-size gate unchanged. The sharpness gate is skipped because discovery is the thing that gate refers people to.
Given a right-size result larger than size M, then one backlog stub issue per functional goal is filed through the existing decomposition emission path, under the same contract that path already uses: epic classification plus the resolved unplanned label, body meta carrying feature, estimate, candidate stories, and source, and blocked_by wired between the batch. Every stub is size M or smaller. The feature defaults to the one recorded in the discovery doc, overridable per stub.
Given a right-size result of size M or smaller, then the discovery is planned directly as one epic with its stories, and no stub is filed.
Given each stub being filed, then the resolved decisions that stub hangs on are copied onto it in full gist form — the decision plus its reasoning, copied from the ticket files — twice in the same act and from the same text: once in the stub body, once as a comment. Each gist names its originating ticket by title only. Neither copy is ever edited again.
Given the gist comment, then it carries a hidden marker in the form the pipeline already uses to anchor a machine-findable comment on an issue. Writing that comment is the only addition the discovery entry mode makes to the existing emission path, because that path files issues and writes no comments.
Given any label, classification, or query used while filing, then it is asked for from the shared publishing resolver (delivery_config.py) and never written out by hand. The report ends with the cross-feature backlog query obtained the same way.
Given the filing is done, then the report names the discovery folder as consumed and states that it can be removed. /nxs.epic does not delete the folder and commits nothing, because committing nothing at planning is its existing contract. Removal is a plain commit made by a human.
Given a discovery-filed stub, when it is promoted with /nxs.epic <issue-number>, then promotion proceeds with no manual edits to the stub. Promotion is otherwise unchanged: it rewrites the body on the issue the stub was filed under, and it neither reads nor moves the gist comment.
Given every decision resolved and the resolutions concluding that no build follows, when the /nxs.discover close action runs, then the discovery doc is marked closed with that conclusion, a dated note is written to docs/delivery/lessons/ carrying the destination, the resolved-decisions index in full, and the no-build conclusion, and the folder is removed in the same commit. No stub is forced.
Notes
Extends #230. Discovery creates no GitHub issue, comment, or label at any point in its life; every GitHub write for a discovery happens in /nxs.epic. That is what keeps one code path emitting every stub in the system, which is what makes "a discovery-produced stub is accepted unchanged by promotion" true by construction instead of by a third copy of the stub contract.
The gist is written twice because the two copies do different jobs. The body copy is the one promotion consumes, since promotion seeds its draft from the stub's body. The comment copy is the one that survives, since promotion replaces that body wholesale. The duplication cannot drift, because neither copy is ever updated. The marker is what turns the surviving copy into an input rather than an archive: promotion keeps the issue it was given, so the comment written here is still on the epic issue when /nxs.decision-record runs against it (#240).
The no-build outcome is the one outcome /nxs.epic never sees, and there are no stubs on that path to carry the reasoning, so the lessons note is its only durable carrier. Writing the note and removing the folder in one commit makes the trade atomic on merge.
As a delivery lead, I want a finished discovery to graduate through
/nxs.epicinto planned work — or to close with no build when the resolutions concluded that none follows — so that the initiative lands in the one cross-feature backlog, through the one path that files stubs, and the "why" travels with it.Acceptance Criteria
/nxs.epicis run in its discovery entry mode against that folder, then it treats the discovery doc as its intent, skips the sharpness gate, and runs the existing right-size gate unchanged. The sharpness gate is skipped because discovery is the thing that gate refers people to.blocked_bywired between the batch. Every stub is size M or smaller. The feature defaults to the one recorded in the discovery doc, overridable per stub.delivery_config.py) and never written out by hand. The report ends with the cross-feature backlog query obtained the same way./nxs.epicdoes not delete the folder and commits nothing, because committing nothing at planning is its existing contract. Removal is a plain commit made by a human./nxs.epic <issue-number>, then promotion proceeds with no manual edits to the stub. Promotion is otherwise unchanged: it rewrites the body on the issue the stub was filed under, and it neither reads nor moves the gist comment./nxs.discoverclose action runs, then the discovery doc is marked closed with that conclusion, a dated note is written todocs/delivery/lessons/carrying the destination, the resolved-decisions index in full, and the no-build conclusion, and the folder is removed in the same commit. No stub is forced.Notes
Extends #230. Discovery creates no GitHub issue, comment, or label at any point in its life; every GitHub write for a discovery happens in
/nxs.epic. That is what keeps one code path emitting every stub in the system, which is what makes "a discovery-produced stub is accepted unchanged by promotion" true by construction instead of by a third copy of the stub contract.The gist is written twice because the two copies do different jobs. The body copy is the one promotion consumes, since promotion seeds its draft from the stub's body. The comment copy is the one that survives, since promotion replaces that body wholesale. The duplication cannot drift, because neither copy is ever updated. The marker is what turns the surviving copy into an input rather than an archive: promotion keeps the issue it was given, so the comment written here is still on the epic issue when
/nxs.decision-recordruns against it (#240).The no-build outcome is the one outcome
/nxs.epicnever sees, and there are no stubs on that path to carry the reasoning, so the lessons note is its only durable carrier. Writing the note and removing the folder in one commit makes the trade atomic on merge.