Skip to content

Topology-first reset, runner reason codes, and the Lifecycle Explorer backlog report - #5

Merged
E-G-C merged 25 commits into
mainfrom
e-g-c-issue-3-add-a-topology-first-reset-when-review-r-891391
Aug 8, 2026
Merged

Topology-first reset, runner reason codes, and the Lifecycle Explorer backlog report#5
E-G-C merged 25 commits into
mainfrom
e-g-c-issue-3-add-a-topology-first-reset-when-review-r-891391

Conversation

@E-G-C

@E-G-C E-G-C commented Aug 8, 2026

Copy link
Copy Markdown
Owner

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.code regression 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-brand pack de-branded into the neutral strata visual 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:

  • No wall-clock time, checkout basename, or Git revision. The same authoritative inputs render byte-identically from differently named roots.
  • `check --root .` fails on stale or missing output and writes nothing, covered by the suite CI already runs.
  • An idea with a malformed canonical slug carries no dependency authority in either direction, and its ignored metadata is reported as ignored rather than as absent.
  • Coordinator activity states its own scope: idea Coordinator Logs only. Ad-hoc Git work is not represented, and the report says so rather than implying completeness.

Verification

  • Full suite 2250 tests / 2246 pass / 0 fail / 4 pre-existing skips
  • Dude lint 31 ideas, 0 warnings, 0 failures; compose verify 16 packs, 0 failures
  • Pristine release build and release lint clean
  • Byte-identical generation across two differently named roots
  • Freshness proven failing-then-passing with a whole-tree no-write snapshot
  • Chromium 147 via CDP: zero horizontal overflow at 1180px, 800px, 320px; complete print content; no script, external reference, shadow root, or dead anchor
  • Feature 025 history byte-unchanged

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.

E-G-C and others added 25 commits August 6, 2026 20:20
…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.
@E-G-C
E-G-C merged commit 5d8ddc6 into main Aug 8, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add a topology-first reset when review revisions expand enforcement scope

1 participant