Topology-first reset, runner reason codes, and the Lifecycle Explorer backlog report - #5
Merged
E-G-C merged 25 commits intoAug 8, 2026
Conversation
…ation agents Repeated sessions produced designs that grew gates, stores, and checkpoint state with no reachable caller. Rule 14 already said "do not over-engineer", but it was too abstract to act on at the point where scope is decided. State the governing rule verbatim in the shared rules and in the personas that decide or implement structure: no current production caller, no capability; delete it rather than harden it for hypothetical use. Each persona gets one line tailored to its authority (Architect names the caller and reachable failure, Coder implements only the task, Spec Lead scopes to reachable needs, Code Reviewer reports callerless capability as blocking). No new skill, artifact, or state. Coding pack reinstalled from the local library so the dev bundle carries the text immediately.
The description field is the only discovery surface, and several skills sit in tight clusters that read alike: import vs compose vs upgrade vs portability, definition vs intake vs execution vs work, receiving-review vs reviewer-protocol, skill-authoring vs team-expansion vs memory vs learning-promotion. Nothing in the description told a reader which sibling was the right one, so a near miss loaded the wrong skill and paid full context cost before failing. Each guard names the correct sibling, so a misfire redirects instead of just failing. dude-lint gets the highest-value one: it is bundle hygiene, not the project's source linter. Left uncovered on purpose: dude-systematic-debugging and dude-verification-before-completion are safety gates, and a "do not use" clause on a gate is an escape hatch. dude-generic-routing and dude-parallel-dispatch are coordinator-internal with no plausible misfire. dude-engine already had a guard. dude-skill-authoring documents the convention so new skills inherit it, including the carve-out for safety gates. No new file, script, test, or state.
Add one coordinator-only executable for the actual first-definition caller. It reads an exact five-file temporary stage, validates the draft-to-defined owner transition, and delegates the fixed owner plus spec/plan/tasks batch to the existing atomic file helper. Fixed dude-lint runs inside rollback, so failure restores the draft and removes the new package tree. Wire the existing First Definition Transaction to the command and stage cleanup, project it into the dev bundle, and cover success, lint rollback, stale state, protected intent, history append, and exact command retention. No generalized publisher, callback, receipt, manifest, or persistent stage.
Record the focus/order problem, the ordered-slug proposal, Mermaid kanban for status and flowchart for task order, and the token-smart HTML template. Answer all open questions. Accept explicit feature-level dependencies via a depends-on: idea-frontmatter field after the repository's own history showed real inter-feature prerequisites, and correct the two superseded lines. Draft only; no spec package.
Add a read-only focus view so the next idea to develop is unambiguous when several are in flight. `@dude status` derives five buckets (Active, Next, Later, Blocked, Unordered) across ideas from declared feature-level dependencies plus state that already exists, and renders them as text or an on-demand Mermaid kanban; a per-feature Mermaid flowchart draws one package's existing task deps. Hard order comes from a new plain-scalar `depends-on:` idea-frontmatter field (recognized by lint via CANONICAL_IDEA_KEYS); an optional `.dude/state/focus-order.md` only breaks ties among unblocked items. Blocked is derived from unmet dependencies plus current `[!]`/`blocked-by:` evidence, where a `blocked-by:` on a done task is treated as stale, not a live block. One read-only script in the existing lightweight-execution skill, no new skill directory, no second board, no writer. Full suite 2303/0; lint 0/0 including a depends-on idea; renderers validated against real mermaid.parse.
Feature 024 shipped a cross-idea view reachable only by running a terminal command, which does not serve non-technical readers. Capture two follow-ups. backlog-report renames the focus surface to backlog, generates a markdown file and a self-contained offline HTML report, and adds a Shipped bucket. A working prototype showed the HTML needs no mermaid (CSS columns render a board at 16 KB with zero external references) and that Shipped collapses the unprioritized pool from 27 entries to the 3 real drafts. backlog-canvas carries the Copilot app canvas extension, split out because it reuses the HTML renderer. Probing showed .github/extensions survives build-dev and lints clean but is not staged by build-release, so shipping it to bundle installers needs a deliberate release-scope change. Both drafts; no spec packages.
Adds dude-pack-design-workflow via compose. Lint reports 0 failures; the two orphan warnings are expected because the optional ms-brand pack is not installed.
…nces
Five defects that exist independently of any de-branding work. Each stands on
its own merits.
D1 Token drift: --ms-ease-exit was the CSS keyword `ease-out`, which the CSS
spec defines as exactly cubic-bezier(0, 0, 0.58, 1), while the JSON declared
cubic-bezier(0, 0, 0.2, 1) -- a visibly different curve for a token that is
live on .ms-btn. SCSS and the Tailwind preset omitted the token entirely.
All four formats now declare it explicitly, and the comment records why a
CSS keyword must never be used as a token value: it hides its own numeric
definition from cross-format comparison.
D3 Scale violations the pack's own audit prompt forbids, including the literal
`border-radius: 6px` it names as an example:
- border-radius 6px -> --ms-radius-lg, 3px -> --ms-radius-sm
- margin: 20px 0 (x3) -> --ms-space-5 / --ms-space-4
- padding 14px -> --ms-space-3, line-height 1.75 -> --ms-docs-lh-compact
- themed-page .ms-tag padding 2px -> --ms-space-1
D4 README linked ../../copilot-instructions.md, which does not exist in this
pack. Row removed, and the surrounding table no longer labels library paths
as if they were .github/ paths.
D6 The brand-hex guard matched hex literals only, so rgba(242,80,34,...) and
the other functional forms of the same guarded colours passed silently.
Both scripts now match hex and rgb()/rgba() forms.
D7 The pack shipped motion tokens and a live transition with no
prefers-reduced-motion handling at all. Added, using 1ms rather than 0s so
transitionend/animationend listeners still fire.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…artifacts Structural only. No renames and no identity changes, so the diff stays reviewable on its own. File count reaches the target of 19 before any rename happens. Fold: the audit prompt duplicated the skill, the instruction files, and the check scripts. Its only unique content was the checklist and the Pass/Warn/Fail table shape, both of which move into the apply prompt as a "Final self-check" section. The prompt is deleted; the pack loses an artifact and gains nothing to maintain twice. Merge: the typography and visual-brand instruction files carried identical applyTo globs -- the same ten extensions in a different order -- so they always loaded together while restating the banned-hex list and the .ms-docs guidance independently of each other. That is a drift generator. Merged into a single dude-pack-ms-brand-ms-visual-system.instructions.md with the same glob, so no file starts or stops matching. Logo artifacts dropped: the logo-usage instruction, reference/logo.md, the .ms-logo-mark implementation in the token CSS, and its five usages across the two examples. Note the one real reduction: logo-usage was the only instruction file whose applyTo covered *.svg, so the pack no longer matches SVG at all. No generic SVG guidance is invented to fill the gap. provides: goes from seven entries to four, and every entry was checked against the filesystem -- a mismatch there fails the composer's namespace check at install time. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Mechanical rename only. No prose was rewritten in this commit, so the diff can
be checked by pattern rather than by reading -- which is the point of isolating
it. The identity rewrite follows separately.
Renames use git mv per file so history follows rather than showing 19 deletions
and 19 additions:
library/packs/ms-brand/ -> library/packs/strata/
skills/dude-pack-ms-brand-visual/ -> skills/dude-pack-strata-visual/
agents/...-ms-brand-stylist.agent.md -> ...-strata-stylist.agent.md
instructions/...-ms-visual-system....md -> dude-pack-strata-visual-system....md
prompts/...-apply-ms-brand.prompt.md -> ...-strata-apply-visual-system.prompt.md
reference/sources.md -> reference/provenance-and-licensing.md
scripts/brand-check.{sh,ps1} -> scripts/strata-check.{sh,ps1}
tokens/ms-brand.{css,scss} -> tokens/strata.{css,scss}
tokens/ms-brand-tokens.json -> tokens/strata-tokens.json
examples/button-styles.html -> examples/controls.html
examples/header-footer.html -> examples/data-surface.html
examples/themed-page.html -> examples/reading-surface.html
The composer enforces the dude-pack-<packname>-* namespace, so once pack.md
declares name: strata every provided artifact has to be renamed with it. These
renames are the composer's contract, not cosmetics.
Namespace substitution was applied with anchored per-kind patterns, never a
blanket s/ms-/strata-/, because ".ms-" appears in prose and "ms." is an SCSS
namespace alias. Covers --ms-* custom properties, $ms-* SCSS variables, .ms-*
classes, data-ms-theme, the Tailwind key set, and the SCSS alias.
Gate before commit -- all five return zero inside the tree:
ms-brand, --ms-, $ms-, .ms-, data-ms-
The three example files are renamed here but re-scoped in the content pass:
they currently demonstrate a site, and they need to demonstrate application
chrome, a data surface, and a reading surface.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The content pass. Everything that was still a brand is now a neutral, measured
visual system, and the identity that was removed is not replaced by another one.
ONE STRUCTURAL SYSTEM, TWO PALETTES
data-strata-palette = pigment (default) | spectrum
data-strata-theme = light (default) | dark -> four validated surfaces
Structure -- spacing, type, radius, motion, elevation, every component class --
is declared once and shared. A palette block contains colour and nothing else,
which is the difference between two palettes and two design systems. The
validator fails the build if a structural token appears inside one.
Token ids are ROLE-BASED. There is no --strata-azurite and no --strata-blue;
there is --strata-series-1, and azurite and blue are two values for it. That is
what lets a component survive a palette switch untouched, and it is the reason
the four token formats can still be compared to each other at all.
STRATIFICATION, NOT SHADOW
No box-shadow anywhere -- not on panels, not on the focus ring, not in the token
set. Depth is a flat tonal change plus a 1px rule. This is not a stylistic
preference: on a white ground the light plane scale spans about 1.15:1 and the
canvas and surface planes are literally the same value, so the rule is carrying
the entire layering. A plane without a rule is not a plane.
The focus ring is outline + outline-offset, never a painted shadow. The offset
is load-bearing rather than cosmetic: at offset 0 the ring drops below 3:1
against nearly every fill in the system, because it would sit directly on the
fill instead of on the parent plane.
MEASURED, NOT ASSERTED
232 pairs were re-measured from the shipped CSS across all four surfaces, and
all of them clear their governing threshold. Three things that measurement
changed:
- Most vivid slots fail as text on a light plane -- the amber slots are under
2:1 -- so every slot ships in three forms: vivid fills, deep writes, and a
tint pair for badges. In the dark themes every slot is text-safe, so -deep
collapses to a hover variant. That asymmetry means code written and checked
only in dark mode will have light-mode contrast bugs, and the reference says
so in as many words.
- White on the vivid danger slot is 4.21:1 and fails AA normal in one palette,
so the destructive component fills with the deep form in both. The "danger"
token a developer reaches for first is deliberately not the one the button
uses.
- Adding the sunken plane to spectrum surfaced a green-deep that measured
4.46:1 on it, missing AA normal by 0.04. Darkened to #097340, which clears
every plane and improves white-on-fill as well.
FIELDS HAVE EDGES
Several vivid slots and every tint measure below the 3:1 non-text floor against
their own plane. A bare chart bar or a bare tint badge has no perceivable
boundary even when the text inside it is readable, so meaning-bearing fills are
stroked with --strata-rule and badges are bordered in their own tint ink. Same
idea as the planes, applied to data.
--strata-hair exists for genuinely decorative dividers and is deliberately below
the contrast floor. It is the one dangerous token here: one name away from
--strata-rule, and misusing it produces an invisible control boundary that looks
correct in review. Called out in the reference, the instruction file, and the
agent persona.
CHARTS
Seven categorical slots, ordered to maximise the luminance gap between
neighbours. The ramp is differentiated by hue rather than luminance, so colour
alone cannot carry the encoding -- anything past two series needs direct labels,
markers, or patterns, and the ramp is categorical only.
DECOUPLED
No Hugo, no Docsy, no site generator, no build tool, and no template language is
assumed anywhere. The Docsy theme selectors that were compiled into the token
stylesheet are gone, the docs surface is now a product-neutral reading surface,
and the check scripts validate this folder instead of a consuming repository.
FONTS
Two families, named and local-only. No font files, no @font-face, no CDN. On a
machine without them the page renders in the platform default, which is a
supported outcome rather than a fallback failure -- every measurement here is
font-independent. The validator fails on any @font-face or remote font import.
VALIDATORS
strata-check.sh and its PowerShell twin now assert the invariants that keep all
of the above true: cross-palette id parity in all six pairwise directions, no
structural token inside a palette block, no shadow or blur, no CSS easing
keyword used as a token value, reduced motion present, components referencing
roles rather than slots, local-only fonts, the 4/8 spacing scale, and the 8px
radius ceiling. Both scripts pass.
The three examples now demonstrate application chrome, a data-visualization
surface, and a long-form reading surface -- the reading surface runs on the
spectrum palette specifically to show that a page built from role tokens needs
no edit to switch.
No compatibility shims: no alias containing ms, no old class names, no old
tokens, no old data attributes, no old colours. Clean break.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
First definition of feature 025. Renames the focus surface to backlog, adds a sixth Shipped bucket and two generated self-contained artifacts (.dude/backlog.md + .dude/backlog.html), and supersedes Feature 024's five-bucket and read-only guarantees for this surface only. 5 phases, 7 tasks.
The Strata Stylist agent used a multi-line folded YAML description, the only agent to do so. The roster contract test parses single-line descriptions, so installing the pack failed current-format-contract.test.mjs. Conform to the single-line convention and re-sync the install.
Rename the focus surface to backlog, add a sixth Shipped bucket (evaluated first), and generate two committed self-contained artifacts from a single bucket derivation: - .dude/backlog.md — six buckets + Mermaid kanban (host-rendered) - .dude/backlog.html — offline report, baked Strata spectrum template, planes + 1px rules (no box-shadow), traffic-light lanes, rollup, work-item cards; no network, service, script, or external reference The report reads no optional pack at generation time (baked copy), and the write path is confined to exactly the two artifacts. Supersedes Feature 024's five-bucket and read-only guarantees for this surface only; 024 stays closed and untouched. Coder implemented; Tester acceptance PASS (suite 2320/0, determinism proven modulo timestamp, membership parity across all three surfaces); Reviewer APPROVE. Closes 025 T001-T007.
Q6, a Normalized Intent bullet, and a Constraint still said the Shipped bucket lands via an explicit re-definition of Feature 024. The ratified spec supersedes 024 for this surface without reopening it. Align the ledger with the shipped decision.
The debrand renamed the ms-brand pack to strata, leaving the design pack's optional visual-authority step pointing at deleted dude-pack-ms-brand-* names (two orphan lint warnings once design is installed). Retarget the agent, validator scripts, and skill directory to strata, drop the Microsoft/brand-specific framing for the neutral visual-system language, and update the compose sibling-warning note. Lint clean (0/0).
Record the deferred deletion feature that previously existed only in session checkpoint memory. Two independent current-source topology audits confirm four dead authority surfaces while preserving explicit live carve-outs.
Define a five-task net-negative cleanup bound by two independent topology audits, 40 mandatory deletions, 26 explicit live carve-outs, and unchanged runHostAdapter-to-finish behavior.
Delete the unwired objective execution/gate/sequence subsystem, dead halt and suspend-target transitions, optional audit.halt transport, and the legacy audit renderer. Remove direct compatibility tests and correct current documentation without rewriting historical Dude provenance. Preserve 26 live carve-outs, the ten adapter operations, four runner actions, ordinary inspect/audit/lane behavior, describeUnattendedHalt, and the byte-identical runHostAdapter-to-finish path. Net authoritative source/test reduction: 6,288 lines. Tester ACCEPT; Reviewer APPROVE after focused retained-sequence and suspension-validation coverage was restored.
Replace the six peer lanes with a Current/Planned/Completed lifecycle so the report answers where a feature sits from idea through completion, and add per-item drill-down carrying the idea excerpt, spec path, user stories, phases, task rows, and Coordinator milestones. Add a zoomed-out delivery map that distinguishes declared, provisional, and missing relationships instead of implying an order that was never declared. Make the artifacts trustworthy rather than merely regenerable. Remove wall-clock time, checkout basename, and Git revision reads, so the same authoritative inputs render byte-identically from differently named roots. Add `check --root .` to fail on stale or missing output without writing, and cover it in the suite CI already runs. Provisional relationships now come from one literal `depends-on: <slug>` marker scan. Three review cycles failed trying to filter prose inference; deleting the mechanism removed the bug class outright. The marker is context-insensitive by design, and the edge renders dashed and non-authoritative. An idea whose canonical frontmatter slug is malformed carries no dependency authority in either direction, and its ignored metadata is reported as ignored rather than as absent. Coordinator activity is honestly scoped: it reads idea Coordinator Logs only, and says so. Ad-hoc Git work is not represented. Verified: 2250 tests, 2246 pass, 0 fail, 4 pre-existing skips; lint 31 ideas, 0 warnings, 0 failures; byte-identical generation across two differently named roots; Chromium 147 confirms no horizontal overflow at 1180px, 800px, or 320px and complete print content. Feature 025 history is byte-unchanged.
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.
Closes #3.
What this delivers
Feature 021 — topology-first enforcement reset. Workflow guidance now defines when a design must stop expanding and recheck where production behavior is actually controlled: the same control-boundary concern surviving two review cycles, a revision adding a gate/store/checkpoint/cross-session state, or enforcement spreading across modules. The planning authority must identify the real entry point and call path, who controls each operation, the concrete reachable failure, the narrowest existing enforcement point, and a check that could disprove the topology assumption. No new persistent artifact; ordinary local review fixes are unaffected.
Feature 022 — runner reason codes and coverage. Exchange failures are restricted to runner-owned reason codes, the fallback shape carries its target, and an arbitrary
error.coderegression test pins it. The coverage gap is closed with an integration test driven from the actual safety writer.Features 025-027 — the backlog report. 025 built the report over one derivation. 026 deleted unreachable authority surfaces. 027 replaced the six peer lanes with a Current/Planned/Completed lifecycle plus per-item drill-down and a zoomed-out delivery map.
Also included: the
ms-brandpack de-branded into the neutralstratavisual system, and two ratified guardrails (core stays runtime-independent of optional packs; no dead affordances in generated static artifacts).The topology reset paid for itself twice
It was written for Feature 013, then caught two real problems in this same branch.
Feature 026: two independent audits disagreed. The first reported adapter and CLI callers for halt attribution and suspension scheduling; the second proved the runner never constructs those governance actions and that the recovery CLI is explicitly non-production. Acting on the first audit would have hardened dead code. 6,288 lines deleted instead.
Feature 027: three review cycles failed trying to filter prose inference for provisional dependencies — sentence splitting, negation lists, synonym regexes. The fourth cycle deleted the mechanism rather than adding another filter. One literal `depends-on: ` marker scan has no sentence splitting, so the `e.g.` bug class is structurally impossible. Net -8 lines on that file.
Trust properties
The report artifacts are now verifiable, not just regenerable:
Verification
Known scope boundary
The report reads activity from idea Coordinator Logs only, so ad-hoc Git work (pack installs, de-branding, guardrail ratification) is not represented. That is deliberate for v1 under YAGNI and is disclosed in the artifact. Git aggregation would be a scope expansion needing its own decision.