Skip to content

assess-* and map-* families have no non-interactive signal — every non-asking caller must suppress their approval rounds by hand #410

Description

@rucka

Problem

Two families of composable skills end in an unconditional developer-approval round and have no non-interactive signal of their own:

  • the assess-* family (up to eight composed by bootstrap) — the resolution cascade's Path A steps 3-4, "Confirm the override with the developer", each skill declaring its own prompt;
  • the map-* family (/pair-capability-map-subdomains Step 3, /pair-capability-map-contexts Step 4) — "Approve or adjust?".

Any caller that must not ask — a quick/non-interactive depth, an automated run, a supervisor loop — therefore has only one option: declare that it suppresses the composed skill's approval round. Bootstrap now does exactly that, twice, as disclosed deviations 2 and 3 in quick-mode-defaults.md (#278, PR #408).

That is the wrong place for the fix, and the shape of the bug is instructive: the same defect recurred twice in two review rounds on #408, in two different surfaces, because a caller-side suppression note cannot structurally see the next composed skill that asks. Round 2 fixed assess-*; round 3 found map-*. Nothing prevents a fourth surface.

What the real fix looks like

A first-class non-interactive signal on the composed skill, so a caller states its depth once and every composed skill honours it — instead of each caller enumerating, per composed skill, an approval round it happens to know about.

Scope, and it is why this is its own story:

  1. Decide the mechanism and record it as an ADR — a shared parameter honoured by both families, versus extending the resolution cascade convention itself. This changes the convention, not just skills.
  2. Apply it to the assess-* family (eight skills) and the map-* family (two), in both corpora.
  3. Rewrite the approval steps so they are conditional on it, without changing guided behaviour at all.
  4. Retire bootstrap's disclosed deviations 2 and 3, and the caller-side notes in SKILL.md Steps 2.2 and 3.5 that exist only to describe them.
  5. Decide what happens to the one gate that must survive: /map-contexts HALTs on an unbalanced + volatile relationship offered with neither mitigation nor acceptance. Quickstart path in bootstrap — opinionated one-command setup #278 deliberately keeps it even in quick mode — writing a domain model that records a coupling risk nobody judged is worse than asking. A generic non-interactive signal must not silently swallow it.

Dependencies

Origin

Raised as review finding 5 on PR #408 (untracked deferred scope), and reinforced by finding 1 of the same round: the deferral had no issue number, and the gap had just widened from one family to two.

Classification

risk:yellow · cost:green · coupling: not assessed

Matrix — per dimension
Dimension Tier Source Note
Service/domain criticality yellow KB default no Criticality Table declared ⇒ Medium (D21)
Change/diff risk yellow blast radius ten skills plus a shared convention; map-* are modified by #387
Business impact yellow subdomain class Knowledge & Standards (Supporting) — changes a convention every future skill inherits
Security relevance green path heuristic prose + skill definitions; no credential, no runtime code
Coupling balance not assessed absent no new integration point; it removes per-caller coupling

Acceptance Criteria

Given-When-Then:

  1. Given a caller that must not ask (a quick depth, an automated run, a supervisor loop)
    When it composes any assess-* or map-* skill
    Then it passes one signal and every composed skill honours it — the caller never enumerates, per composed skill, an approval round it happens to know about

  2. Given a caller that passes nothing
    When it composes those skills
    Then behaviour is unchanged: the approval round runs exactly as today. Guided must not shift by one word

  3. Given the signal is honoured
    When bootstrap's quick mode runs
    Then disclosed deviations 2 and 3 are retired from quick-mode-defaults.md, and the caller-side notes in Steps 2.2 and 3.5 that exist only to describe them are gone

  4. Given the one gate that must survive — /map-contexts HALTing on an unbalanced + volatile relationship with neither mitigation nor acceptance
    When the non-interactive signal is passed
    Then that HALT still fires. A generic signal must not swallow a judgement gate; Quickstart path in bootstrap — opinionated one-command setup #278 kept it deliberately and this story must not undo that decision silently

  5. Given a new skill added to either family later
    When it declares an approval round
    Then the convention obliges it to honour the signal — so the defect cannot recur in an eleventh surface, which is the whole point of this story

  6. Given the conformance suite
    When it runs
    Then it asserts the signal is honoured per skill present, data-driven, with no hardcoded count — the families grow

Business Rules

  • The mechanism belongs to the convention, not to a caller. The current shape — each caller declaring suppression — is what let the same defect ship twice in two review rounds on [US-278] feat: bootstrap quick mode — a second resolution depth, guided stays the default #408.
  • Guided is untouchable. Any behaviour change to the default depth makes this a different, larger story.
  • The surviving HALT is a feature. Writing a domain model that records a coupling risk nobody judged is worse than asking one question.

Edge Cases

  • A skill whose approval round has a side effect (writes before asking) — must be found during T-2, not assumed absent.
  • A caller that passes the signal but IS interactive — the signal means "do not ask", not "do not report": the summary obligation stays.
  • Partial adoption — if only some skills honour it, a caller gets a worse guarantee than today's explicit suppression, because it looks total and is not. T-2 lands the family atomically or not at all.

Definition of Done

  • All acceptance criteria implemented and verified
  • The mechanism recorded as an ADR — it changes a shared convention
  • Conformance is data-driven over the skills present; no count asserted
  • Every assertion injection-tested
  • pnpm quality-gate green; PR follows pr-template.md

Task Breakdown

  • T-1: Decide the mechanism (shared parameter vs cascade-convention extension) + ADR
  • T-2: Apply it to the eight assess-* skills, both corpora, atomically
  • T-3: Apply it to map-subdomains + map-contexts, preserving the unbalanced+volatile HALT
  • T-4: Retire bootstrap's deviations 2 and 3 and the Step 2.2 / 3.5 caller-side notes
  • T-5: Update the convention so a future family member must honour the signal (AC5)
  • T-6: Conformance, data-driven and injection-tested; CP9's MT-CP903 simplified accordingly

Dependency Graph

T-1 ──┬── T-2 ──┬── T-4 ── T-6
      ├── T-3 ──┘
      └── T-5 ─────────────┘

T-2 and T-3 are parallel once the mechanism exists; T-4 only after both, or bootstrap loses a suppression it still needs. T-5 is independent of the application work but must land in the same PR — a convention that obliges nothing until later is how this defect got here.

AC Coverage

AC Tasks
1 one signal, all skills T-1, T-2, T-3
2 guided unchanged T-2, T-3
3 deviations retired T-4
4 HALT survives T-3, T-6
5 future skills obliged T-5
6 data-driven conformance T-6

Metadata

Metadata

Assignees

Labels

risk:yellowClassification: medium risk tiertech-debtTracked technical debt (living backlog, R7.2 — never blocks a PR)user storyWork item representing a user story

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions