Task — engineering-spec@1

Uninstall summary names what it kept

doneTASK-IMP-106
module improvement · class product · priority p1 · created 2026-07-17 · shipped null
depends on TASK-IMP-103 · blocks none

TASK-IMP-106: Uninstall summary names what it kept

Summary

uninstall.sh deliberately keeps the operator's corpus, status page, CHANGELOG, and BRAIN - the right default - and never says so. Someone who uninstalls expects the repo to be clean and finds task folders and memory still there, with no way to know it was intentional. Add a summary that names what was removed, what was kept and why, and how to remove the kept material by hand.

Problem

uninstall.sh references docs/tasks twice and leaves it alone by design: the corpus is the operator's work, not the machine's. But the summary says nothing about it. This is the same failure shape as TASK-IMP-095 (gates.env clobbered silently) and TASK-IMP-096 (non-git install silently useless) - a correct default, undocumented at the exact moment it surprises someone - and both of those proved worth fixing.

Silence at that moment has a specific cost: the operator either assumes the uninstall failed and re-runs it, or deletes the corpus by hand to "finish the job" and loses the work the default existed to protect.

Proposed Solution

Print a two-part summary on successful uninstall. Removed: the vendored machine and the agent surface, each named. Kept: docs/tasks/ (your corpus), docs/status/, CHANGELOG.md, .cyberos/memory (BRAIN) - with a one-line reason and the verbatim command to remove them for an operator who means it. Names come from what the run actually did, not a hard-coded list, so the summary cannot drift from the behavior.

Alternatives Considered

Success Metrics

Scope

In scope: the uninstall summary block, suite arms.

Out of scope / Non-Goals

Dependencies

depends_on TASK-IMP-103: both edit uninstall.sh, and 103 adds the lock-removal branch whose outcome this summary must report. Serialised, not parallel. Per TASK-IMP-101's evidence gate, 103's coverage-gate artefact is the evidence.

AI Authorship Disclosure

1. Description (normative)

2. Acceptance criteria

3. Edge cases

Audit

§1 - Verdict summary

Spec is 72 lines, 5 §1 clauses, 3 ACs, 5 edge cases. Same failure shape as TASK-IMP-095/096 - a correct default undocumented at the moment it surprises someone - and both proved worth fixing. Passes after 6 findings.

§2 - Findings (all resolved)

ISS-001 - depends_on was empty despite sharing uninstall.sh with 103

103 adds the lock-removal branch this summary reports; concurrent edits to one file violate §11a. Resolved: depends_on: [TASK-IMP-103] with reciprocal blocks, evidence gate named.

ISS-002 - A hard-coded kept list would drift from behavior

Printing four fixed paths claims a path that may not exist. Resolved: §1 #1.4 requires derivation; AC 2 asserts a missing status dir is not claimed.

ISS-003 - Scope creep toward a purge flag

The defect is silence, not a missing capability. Resolved: explicit Non-Goal, keeping the task at one hour.

ISS-004 - Summary could imply uninstall changed behavior

A new kept list might read as a new policy. Resolved: §1 #1.5 forbids behavior change; AC 3 asserts the post-uninstall file set is byte-identical.

ISS-005 - Never-installed repo would print a misleading kept list

Nothing was kept because nothing was removed. Resolved: §3 edge case suppresses the block entirely.

ISS-006 - Printed removal command is a shell string

A command in output the script might later execute is an injection surface. Resolved: §3 security-class fixes it as documentation, never executed, no interpolation.

§3 - Resolution

All 6 concerns addressed. The machine floor (task-lint) ran FIRST and was clean before any judgment family was applied, per TASK-IMP-084. Score = 10/10.


End of TASK-IMP-106 audit.