objective-close
Close an existing Objective without deleting its checked-in history — record a ## Closure in objective.md and write the closed marker. Use for explicit close intent: 'close this objective', 'mark the objective done', 'abandon this objective', 'park/defer this objective', or an explicit user request to reopen a closed one. To record progress short of closing, or to let closure happen automatically when completion criteria are clearly met, use objective-update instead.
- License 许可
- MIT
- 所属仓库
- nseng-ai/ns
- 最近更新
- 2026-10-02
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- objective-close
- description
- Close an existing Objective without deleting its checked-in history — record a ## Closure in objective.md and write the closed marker. Use for explicit close intent: 'close this objective', 'mark the objective done', 'abandon this objective', 'park/defer this objective', or an explicit user request to reopen a closed one. To record progress short of closing, or to let closure happen automatically when completion criteria are clearly met, use objective-update instead.
- disable-model-invocation
- true
02 资源文件 1
- 参考文档agents/openai.yaml43 B
03 SKILL.md 正文
objective-close
Use the objective umbrella skill first for shared vocabulary, selection rules, storage model, safety boundaries, and family policy.
Resolve the Objective
Resolve exactly one Objective per the umbrella skill's Selection rules; the umbrella also owns the storage model and required file shapes — this skill does not restate them. The closure-specific delta: closing adds ## Closure to objective.md and writes closed.md, and keeps the existing slug directory in place. Objective records are Markdown; read and edit them directly, using ns objective exec for deterministic read mechanics.
Workflow
- Run
ns objective exec read-objective <slug> --format mdto load the selected record's raw Markdown and closed state. - If already closed, stop per Stop / ask.
- Load every edge-connected Objective before authoring closure: run
ns objective show <slug> --format md --should-include-closed-edgesto inventory counterpart states and both Edge Annotations (the flag is required: the default view hides edges whose counterpart is closed, and step 8 must assign a disposition — includingalready closed— to every declared edge), then runns objective exec read-objective <counterpart> --format mdfor each counterpart. Read each active counterpart'sobjective.md,roadmap.md, and recent relevant updates; readorientation.mdwhen present. - Confirm the closure outcome is clear: completed, abandoned, deferred (deliberately parked), or superseded (another record or landed reality took over), with concise evidence or rationale. Use these outcome words in the Closure Marker so closed records stay machine-legible. A deferred closure must include an explicit restart pointer in
## Closure: which roadmap rows resume, what recorded evidence can be trusted as-is, and what must be re-baselined against the then-current tree. For an Umbrella Objective (see theobjectiveskill's Objective patterns reference), also record cross-child lessons and synthesized closure evidence in the parent; open Subobjectives gate closure per Stop / ask. - Add or update
## Closureinobjective.mdwith outcome, key evidence, remaining assumptions or risks, caveats, and follow-ups if any. Also judge whether the record holds durable architecture facts — storage models, conventions, contracts, decided semantics — that no doc, README, orCONTEXT.mdowns; if so, name the graduation candidates (fact → target doc) in## Closurerather than letting a closed record become the only home of load-bearing documentation. - When material PR evidence supports the completed or abandoned outcome, summarize it in
## Closurewith PR numbers and Objective impact, using the shared Objective PR evidence convention from theobjectiveumbrella skill when a list is clearer than prose. Do not turn closure PR evidence into a broad PR ledger or historical backfill. - Re-judge the closing record's own Blocked Sentence. A closing record should not keep a live
blocked:sentence; normally remove it as part of closure. - Propagate the closure through every Objective Edge. For each counterpart, use both Edge Annotations plus its full current record to assign and act on one disposition:
updated. Closure changes the active counterpart's durable meaning. Edit every affected surface needed to make its post-closure state true: clear or reword a Blocked Sentence; reword stale Edge Annotations on both endpoints; advance or complete synthesis/dependency rows inroadmap.md; update assumptions, risks, open questions, sequencing, or closure-adjacent narrative inobjective.md; and re-deriveorientation.mdwhen the counterpart is orienting. Write a new Semantic Update under that counterpart when the event is a meaningful finding, completion event, plan change, risk change, or follow-up. Existing updates remain immutable.unchanged. Closure has no durable effect on the active counterpart. Make no edits there and record a concise reason in the final report; an edge by itself does not justify churn.already closed. Do not amend the counterpart unless the user explicitly requested it; report that no live tracking needed propagation. Common effects to look for are unblocking work, parent/Umbrella synthesis, dependency completion, changed sequencing, retired assumptions or risks, and newly exposed follow-up. Do not recursively close a counterpart as a side effect: if propagation leaves it closure-ready, report that and route it through a separate Objective Close.
- Keep all Objective Edges in place unless closure itself proves an annotation's relationship is false; closure alone does not dissolve an edge. When only the relationship wording changed, reword both mirrored Edge Annotations rather than removing the edge.
- Run
ns objective check --allafter any Record Frontmatter edit. Fix every structural error before continuing. - If the closing Objective has an
orientation.md, consultroadmap.md's completion section and the durableDirection/Getting tolines oforientation.md. If a durable rule should survive the initiative, note it in## Closure(or to the user) as a candidate to graduate into AGENTS.md "Architecture rules". Do not deleteorientation.md: writingclosed.mddrops it from the always-load set automatically. - Write
closed.mdas a minimal Closure Marker. Put closure meaning inobjective.md, not inclosed.md. - Leave
.ns/objectives/<slug>/in place; deletion is source-controlled per the umbrella skill, never part of close. Reopening happens only on an explicit user request, as its own workflow (see Reopen below) — never as part of a close.
Reopen
There is no routine reopen path: do not reopen to record progress, amend closure context, or because completion criteria later look unmet — those are objective-update or amend-closure conversations. On an explicit user request to reopen a closed Objective:
- Delete
closed.md. - Amend
## Closureinto a dated history rather than deleting it: keep the original closure text and append aReopened <date>:line with the reason and what changed since closure. - Re-run the connected-Objective impact review in the reverse direction: restore or reword this record's
blocked:sentence if a real gate exists, and re-judge every active counterpart whose frontmatter, narrative, roadmap, orientation, or Semantic Updates were affected by closure. Write new corrective Semantic Updates where reopening materially changes tracking; never amend the close-time updates. - If the record has an
orientation.md, it rejoins the always-load set automatically onceclosed.mdis gone; re-read it for staleness against the current tree before relying on it. - If the record closed as deferred with a restart pointer, start from that pointer and re-baseline whatever it marked as volatile.
- Run
ns objective check <slug>after any frontmatter edit.
Closure timing
Closure does not have to wait for the closing work to land on the trunk branch. When the same branch and PR that finishes the Objective also writes ## Closure and closed.md, the merge of that PR is the closure event on the trunk. Couple Objective tracking with the work that triggered it: prefer closing on the branch that ships the final work over carrying closure to a follow-up PR.
Do not create a duplicate Semantic Update solely for closure. Create one only when closure introduces distinct semantic information beyond the normal update guidance.
Stop / ask
- Objective selection is ambiguous or absent.
- Required Objective files are missing.
- The closure outcome or rationale is unclear.
- The record is an Umbrella Objective with Subobjectives still open that the user has not explicitly parked and synthesized.
- The Objective is already closed and the user did not ask to amend closure context.
- The user asks to delete or move the Objective as part of close; for removal from active checkout state, redirect per the Workflow's source-control deletion rule (step 9). A reopen folded into a close is also a stop: reopen is its own explicit user request handled by the Reopen section.
Verify
- Confirm
objective.mdcontains## Closure. - Confirm
closed.mdexists under the selected Objective directory and its outcome uses the standard vocabulary (completed / abandoned / deferred / superseded, optionally qualified). - For a deferred outcome, confirm
## Closurecarries an explicit restart pointer. - Confirm the Objective directory remains under
.ns/objectives/<slug>/. - If an
orientation.mdwas present, confirm it was left in place (not deleted) and any durable-rule graduation candidate was noted. - If the closing record declared edges, confirm every counterpart received an explicit
updated,unchanged, oralready closeddisposition based on both Edge Annotations and the counterpart's full current tracking — not only its Blocked Sentence. - For each
updatedcounterpart, confirm its durable files express the post-closure state, any warranted Semantic Update is new and counterpart-local, existing updates were not modified, and an orienting counterpart'sorientation.mdwas re-derived when needed. - Confirm no counterpart was recursively closed; report any counterpart now closure-ready.
- Confirm edges remain mirrored and were not removed merely because one endpoint closed.
- If any Record Frontmatter was edited, confirm
ns objective check --allreports no structural errors. - Summarize the closure outcome, connected-Objective dispositions and files changed, and note that closed Objectives are no longer eligible for
objective-nextby default.
04 同仓库更多 Skills
pr-make-accountable
Interview a PR author to establish shared understanding of intent and design decisions, then co-author the What / Why / Changes PR body with opt-in Requested reviewer focus.
typescript-style
Opinionated style guide for strict, portable TypeScript. Use when writing, designing, or reviewing TypeScript: type design, boundary validation, error handling, module architecture, and review discipline.
typescript-fake-driven-testing
TypeScript fake-driven testing architecture. Use when writing or reviewing TS code with external dependencies, gateway interfaces, real adapters, in-memory fakes, or CLI scenario tests.
ns-typescript
TypeScript overlay for ns-style projects. Use when editing or reviewing TS in this repo: tsconfig baseline, pnpm/Vitest/oxlint/oxfmt/native tsc commands, relative .ts imports, workspace subpath exports, and the exactOptionalPropertyTypes spread idiom. Repo-specific enforcement (test lanes, time seams, style guard) lives in the host repo's AGENTS.md.
ns-typescript-style-tripwire
Invoke the ns TypeScript style Tripwire against a supplied diff or current branch.
skill-management
Manage skills with `npx skills`: add, edit, remove, rename, update, or list skills (local or GitHub), and the nested `skills/<disposition>/.../<name>/` / flat `.agents/skills/` layout conventions.