Viewing artifacts
Skill augments-labs/sdlc-skills/skills/common/viewing-artifacts
Use when the state of an SDLC artifact trail needs to be seen at a glance instead of read file by file — progress across briefs, specs, designs, plans, and execution, what needs attention, and what drifted after a downstream artifact consumed it. Fires on show me the state of my specs and plans, where does my project stand, what needs attention, is my plan still in sync with the spec, and visualize the trail, even if nobody says artifact or viewer. Emits one self-contained local HTML page from `.sdlc-skills/`, deriving state only from real markers and rendering unknown where approval is underivable. Skip when a specific artifact must be read, written, or edited — viewing is read-only.From its SKILL.md
npx -y skills add augments-labs/sdlc-skills --skill viewing-artifactsAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
11.2 KB, as published. Nobody here has run it
Viewing Artifacts
One self-contained page answers "what is the state of my SDLC work, and what
needs attention?" from the .sdlc-skills/ artifact trail. Every value on it
is derived from a real marker; where no marker exists the page says unknown.
A confident guess is fabrication — the failure this skill exists to prevent.
The page carries state, not documents.
When to use
- The user asks for the state, progress, or drift of their SDLC work — what needs attention, how far each initiative is, what changed after a downstream artifact consumed it — or asks to see the trail as a page.
- Skip when a specific artifact must be read, created, or edited: that is the owning skill's work, and this skill never mutates the trail.
- Skip when there is no trail and nobody asked for its state — an unprompted empty page helps nobody.
Available scripts
scripts/start-server.sh/scripts/stop-server.sh— start and stop the governed localhost preview (per-session key, owner watchdog, idle timeout). Deliver the page served and present its URL with the delivery, without waiting to be asked; the file path is the fallback when serving fails or is declined. They wrapscripts/serve.py; never run another server.
Procedure
-
Discover the trail. Read
.sdlc-skills/at the project root:briefs/,specs/,designs/,plans/,verification/,audits/,post-mortems/. An absent folder means an unreached phase, not an error. No.sdlc-skills/at all — or the user overrode artifact paths so the convention is not there — render the template's empty state naming what produces artifacts; never search the filesystem for look-alikes. -
Thread topics by slug.
YYYY-MM-DD-<topic>is the identity and the allowlist: only files and directories whose names match that shape are threaded — anything else is ignored. The same slug across folders is one topic:designs/<slug>.md, its<slug>-migration.mdsibling, and its<slug>/visuals/directory all belong to it — never split them into phantom topics. Plans are directories (plans/<slug>/00-index.md). Audits and post-mortems thread to their topic by the same slug but render in the sidebar and meta only — they never get a spine node or a tier-2 block in v1. -
Derive phase status from real markers only. The spine is brief, spec, design, plan, execute. For each phase of each topic:
- No artifact → a pending node naming what produces it; no fabricated dates or counts.
- Presence plus a
**Status:** draft|proposedfield → the artifact exists; decision state is external, and its**Normative version:**identity is what approval binds to. - Approval comes only from the decision ledger. Follow the artifact's
**External decision ledger:**pointer — an ADR section carries**External lifecycle ledger:**instead, whose states are the ADR-chain vocabulary (accepted / in force / retired / superseded) — and parse best-effort — only the markdown-table form, matching the row whoseIdentityequals the artifact's normative version and whose location points at that artifact (the same identity string on another file's row is a different decision). A missing pointer, missing file, non-table content, an ambiguous parse, or no matching row → render approvalexternal/unknown(pillpending, content… unknown). A**Status:** proposedfield is not approval. - Section-level state, file-level freshness. A brief or design file may hold several sections (goals, scope, ADRs), each with its own normative identity and ledger row; derive state per section, freshness per file.
- Execute derives from the plan index's checkbox rows: only the exact marker
[x] donecounts complete.[x] done with concerns,blocked,in progress,needs context,cancelled,superseded, andtodoeach count separately — the same label under a different checkbox is a different signal.
-
Compute drift from real change times. Per artifact file, the last-change time is
git log -1 --format=%ct -- '<path>'— the path single-quoted, so an artifact-derived name never reaches the shell unquoted; outside a git repository, fall back to the file's mtime. Flag drift when an artifact is newer than a downstream artifact that consumed it — a spec edited after the plan written against it. Checkbox ticks and status labels in the plan index are the mutable execution projection, not a normative change: normalize them away before comparing, so a checkbox-only plan update never flags. Equal times flag nothing — a fresh clone outside git is blind by construction, and that is the safe default. -
Group topics by attention. Needs attention first — drift flags, blocked tasks, decisions derivably pending from a parsed ledger row — and its first topic is the preselected one. Then Waiting: active, nothing flagged. Then Complete: everything reached is done, nothing flagged. With no attention topics, preselect the first waiting, else the first complete.
-
Fill the template. Open
assets/page-template.html— its top-of-file comment is the fill contract: region order, allowed values, what to repeat, what to omit. You bring the derived state:- header
{{page-title}},{{as-of}},{{as-of-iso}}— the current UTC instant; - tiles
{{tile-number}}/{{tile-total}}/{{tile-label}}— numbers and short labels, the attention tile last; - sidebar groups
{{group-label}}/{{group-count}}attention-first; per topic{{topic-slug}},{{topic-pill-class}}/{{topic-pill-content}},{{dot-1}}…{{dot-5}}in brief→execute order,{{topic-freshness}}; the preselected item carriessel; - one pane per topic in sidebar order, the preselected pane last in DOM with class
default; - spine nodes from the
{{brief-…}},{{spec-…}},{{design-…}},{{plan-…}},{{execute-…}}stub families (node class, pill, meta, source path); - the drift connector
{{drift-explanation}}directly after the stale node, naming which artifact is newer, by how much, and the re-alignment action — omit when there is none; - the ADR chain from the designs file's ADR sections, newest first — chains exist only via
Predecessorlinks plus ledger state, rendered in the ADR vocabulary (accepted / in force / retired; a superseded record stayssuperseded) — omit when the topic has none; - each
<slug>/visuals/*.htmlembedded inline via iframe — the iframe always carriessandbox— with anopen file ↗fallback, paths relative to the page; prose artifacts are linked from node meta, never re-rendered — omit when none; - the execute rollup
{{tasks-done}}/{{tasks-total}}/{{tasks-pct}}; the per-row stubs{{task-id}}/{{task-title}}/pill repeat once per task, and every task row is rendered — never elide one, because a hidden row can carry a blocked state, a concerns state, or hostile content; completed-state rows (done, cancelled, superseded — a concerns state is not completed) go into the one optional<details>block, closed by default, its summary carrying{{tasks-completed}}; - the assurance matrix from the topic's
verification/artifact, one row per gate, keeping the matrix's own state words (executable / planned / blocked) mapped onto pill classes — omit when the topic has none.
- header
-
Encode everything artifact-derived. Entity-encode before inserting:
&→&first, then<→<,>→>,"→". Artifact titles are untrusted input — a hostile task title must render as inert text. Derived values go in as text, never intohreforsrc; only the template's own relative paths carry attributes. -
Write exactly one file:
.sdlc-skills/views/index.html. Createviews/if missing. The page stays self-contained: no external URLs, no JavaScript, no scratch or backup files under.sdlc-skills/— the trail is read-only to you. Regeneration is this same procedure again: recompute from the trail and rewrite the same path in place, never reading or merging a previous render. The as-of is the current UTC instant; it is the page's staleness signal.Deliver the page served: run
scripts/start-server.shwith root.sdlc-skills/, entryviews/index.html, so the embedded visuals keep resolving, and hand over the printed URL — it carries a one-time key that plants a cookie — together with the file path, without waiting to be asked. Stop the preview withscripts/stop-server.shwhen it is no longer needed. Never improvise another server. If the script answersneeds python3, say so, name the platform's install route, and deliver the file path instead — install a runtime on the user's machine only when the user explicitly asks. -
Report the path — or the served URL — and the as-of. One short reply: the written path or served URL, the as-of UTC, and every place the page says unknown or a block was omitted for missing state — the user should learn the gaps from you, not discover them. When any artifact's change time did not come from git, name that drift derives from file mtimes and is blind where times are equal. When a stated ledger pointer exists but could not be honored — present-but-unparsable or ambiguous — name that cause class instead of rendering a bare
unknown.
Common mistakes
- Treating
**Status:** proposed, or an impressive document, as approval → approval lives only in a matching ledger row; otherwise the page says unknown. - Counting
[x] done with concernsas done → only the exact[x] donecounts; every other label counts separately. - Pasting artifact prose into nodes or tiles → the page carries state; prose stays behind open-file links.
- Splitting
<slug>-migration.mdor<slug>/visuals/into their own topics → thread by slug. - Flagging drift from a checkbox-only plan update → normalize the execution projection before comparing times.
- Hunting the filesystem when the convention is absent or overridden → render the empty state naming what produces artifacts.
- Starting an ad-hoc server (
python3 -m http.server, a dev-server forward) to show the page → the key gate and self-terminating lifecycle are the contract; usescripts/start-server.shor deliver the plain file path. - Linkifying a URL found in artifact text, or adding a script for interactivity → self-containment: no external requests, no JavaScript; navigation is pure CSS.
- Assuming git exists → use the mtime fallback; equal times flag nothing.