Checklists
requirements.md
Specification Quality Checklist: CLI Upgrade Nag and Lazy Project Migration
Purpose: Validate the quality of spec.md — its completeness, clarity, consistency, measurability, and coverage — before /spec-kitty.plan. This checklist tests the requirements writing, not the future implementation. Created: 2026-04-27 Mission: cli-upgrade-nag-lazy-project-migrations-01KQ6YDN Spec: ../spec.md Audience: Reviewer / planner (the person about to read the spec into /spec-kitty.plan). Depth: Standard. Block planning on any unchecked item in Requirement Completeness, Acceptance Criteria Quality, or Non-Functional Requirements.
Requirement Completeness
- □ CHK001 — Are all five FR-023 user-facing case names (
cli_update_available,project_migration_needed,project_too_new_for_cli,project_not_initialized,install_method_unknown) traceable to at least one user scenario? [Completeness, Spec §FR-023, §"User Scenarios & Testing"] - □ CHK002 — Is the full enumeration of "unsafe" commands explicitly listed (not just exemplified) in the Safe/Unsafe Command Classification section? [Completeness, Spec §"Safe / Unsafe Command Classification"]
- □ CHK003 — Is the full enumeration of "safe" commands explicitly listed (not just exemplified)? [Completeness, Spec §"Safe / Unsafe Command Classification"]
- □ CHK004 — Are requirements defined for the case where
.kittify/metadata.yamlis missing or unreadable, distinguishing it from "incompatible schema"? [Completeness, Spec §"Edge cases", §"Key Entities → Compatibility plan"] - □ CHK005 — Are requirements defined for the "developer / source install" case in addition to packaged installs (pipx, pip, brew)? [Completeness, Spec §A-008, §"Key Entities → Install-method descriptor"]
- □ CHK006 — Are requirements specified for what the nag prints when the latest-version source is unreachable (network error, offline, malformed payload)? [Completeness, Spec §NFR-002, §"Edge cases"]
- □ CHK007 — Are requirements defined for invalidating or warming the nag cache when the user installs a different CLI version? [Completeness, Spec §FR-025]
- □ CHK008 — Are requirements documented for what configuration surface controls the throttle window (env var name, file path, key)? [Completeness, Spec §NFR-009] [Gap]
- □ CHK009 — Are requirements documented for what configuration / environment variable disables the nag (
SPEC_KITTY_NO_NAG,--no-nag)? [Completeness, Spec §A-007] [Gap] - □ CHK010 — Is the JSON output schema for
spec-kitty upgrade --dry-run --jsonandspec-kitty upgrade --jsondescribed at field-name level (not just "structured plan")? [Completeness, Spec §FR-022, §"Key Entities → Compatibility plan"] [Gap] - □ CHK011 — Are documentation deliverables (which docs files must change) named, beyond the single mention of
docs/how-to/install-and-upgrade.md? [Completeness, Spec §SC-008, §"Dependencies"] - □ CHK012 — Are requirements specified for the exit codes used when the CLI blocks an unsafe command (specific non-zero values, distinguishing "needs migration" from "needs CLI upgrade")? [Completeness] [Gap]
Requirement Clarity
- □ CHK013 — Is "throttled" quantified everywhere it appears with a specific window (the spec says 24h default — is that consistently referenced)? [Clarity, Spec §FR-004, §A-005, §NFR-009]
- □ CHK014 — Is "passive" defined operationally (one line, before command output, no prompt) so readers cannot interpret it differently? [Clarity, Spec §"Scenario A", §NFR-007]
- □ CHK015 — Is "unsafe state-mutating command" defined by reference to the Safe/Unsafe section, not left to reader judgment? [Clarity, Spec §FR-008, §"Safe / Unsafe Command Classification"]
- □ CHK016 — Is "lazy" defined (checked only when inside a Spec Kitty project, only on command invocation, never proactively across projects)? [Clarity, Spec §"Purpose", §"Problem Statement"]
- □ CHK017 — Is "non-interactive" defined as an explicit predicate (CI env var OR no-TTY OR explicit opt-out) and not left ambiguous? [Clarity, Spec §A-007, §FR-005]
- □ CHK018 — Is "fail open" defined for the network-check path (no stack trace, no nag printed, no non-zero exit attributable to the nag)? [Clarity, Spec §NFR-002] [Ambiguity]
- □ CHK019 — Is the difference between
--cli,--project, and the unflaggedspec-kitty upgradeclear at the level of which behaviors each enables and suppresses? [Clarity, Spec §FR-013, §FR-015, §FR-016] - □ CHK020 — Are "diagnostic mode" vs "repair mode" of
doctor, and "read-only mode" vs "write/init/sync/repair mode" ofdashboard, defined in terms a reader can verify from the spec alone? [Clarity, Spec §"Safe / Unsafe Command Classification", §"Edge cases"] - □ CHK021 — Is "concise" in NFR-007 quantified with the stated thresholds (one-line nag, ≤4-line block message)? [Clarity, Spec §NFR-007]
Requirement Consistency
- □ CHK022 — Do FR-017 (
--yesnon-interactive confirmation) and A-006 (--yesis a functional alias of--force) describe the same semantics without contradiction? [Consistency, Spec §FR-017, §A-006] - □ CHK023 — Are the safe-command lists in §"Safe / Unsafe Command Classification" and §"Scenario G" consistent with each other? [Consistency, Spec §"Safe / Unsafe Command Classification", §"Scenario G"]
- □ CHK024 — Do FR-014 (no "not a Spec Kitty project" failure when
upgradeis run outside a project) and FR-016 (--clirestricts to CLI guidance) compose without ambiguity for the no-flag case? [Consistency, Spec §FR-014, §FR-016] - □ CHK025 — Do FR-005 (no network checks in CI) and SC-005 (zero outbound network calls in CI) refer to the same scope (the nag path), and not accidentally to the entire CLI? [Consistency, Spec §FR-005, §SC-005]
- □ CHK026 — Do C-008 (single compatibility planner authority) and FR-024 (planner emits the structured plan) line up without leaving a third surface that could decide compatibility independently? [Consistency, Spec §C-008, §FR-024]
- □ CHK027 — Are FR-012 (dry-run shows CLI + project + decision + migration plan) and SC-004 (stable JSON across all five scenarios) jointly satisfiable, i.e., does every scenario yield each of those four sections? [Consistency, Spec §FR-012, §SC-004]
- □ CHK028 — Do "current project" usages in the spec consistently refer to the project containing the working directory, never to "the most recently used project" or any cached selection? [Consistency, Spec §"Domain Language → Current project", §FR-021]
Acceptance Criteria Quality
- □ CHK029 — Are all eight Success Criteria measurable from outside the implementation (no internal-state assertions)? [Measurability, Spec §"Success Criteria"]
- □ CHK030 — Are SC thresholds stated with units everywhere (seconds, milliseconds, count, percent), and consistent with NFR thresholds? [Measurability, Spec §"Success Criteria", §"Non-Functional Requirements"]
- □ CHK031 — Is "warm cache" defined with a concrete predicate (cache file exists AND mtime within throttle window AND CLI version key matches)? [Measurability, Spec §SC-002, §SC-003, §SC-006] [Ambiguity]
- □ CHK032 — Is "100% of test scenarios" in SC-006 paired with an explicit enumeration of those scenarios (not left to interpretation)? [Measurability, Spec §SC-006]
- □ CHK033 — Are AC-001…AC-010 from the source brief each traceable to at least one FR/NFR/SC in the spec (no acceptance criterion is orphaned)? [Traceability, Spec §"User Scenarios & Testing", §"Functional Requirements"]
Scenario Coverage
- □ CHK034 — Are requirements present for the primary path (compatible CLI, compatible project, normal command)? [Coverage, Spec §"Scenario A"]
- □ CHK035 — Are requirements present for the alternate path (compatible CLI, no project at all)? [Coverage, Spec §"Scenario F"]
- □ CHK036 — Are requirements present for the exception path (incompatible project — both directions)? [Coverage, Spec §"Scenario B", §"Scenario C"]
- □ CHK037 — Are requirements present for the recovery path after a blocked unsafe command (i.e., the user runs
upgrade, command becomes runnable)? [Coverage, Spec §"Scenario B"] - □ CHK038 — Are requirements present for the non-functional path in CI / non-interactive / no-TTY environments? [Coverage, Spec §"Scenario H", §FR-005, §NFR-004]
- □ CHK039 — Is the "nag suppression while still gating unsafe commands" combination (interactive but
--no-nag, schema mismatch) explicitly addressed? [Coverage, Spec §A-007] [Gap] - □ CHK040 — Are requirements specified for re-entry into the same project shortly after a successful migration (no re-block, no re-prompt within the throttle window)? [Coverage] [Gap]
Edge Case Coverage
- □ CHK041 — Are requirements defined for corrupt or partial
.kittify/metadata.yaml(parse error, missing fields)? [Edge Case, Spec §"Edge cases"] - □ CHK042 — Are requirements defined for the user passing mutually-exclusive flags (
--project+--cli)? [Edge Case, Spec §"Edge cases"] - □ CHK043 — Are requirements defined for the user passing redundant equivalent flags (
--yes+--forcetogether)? [Edge Case, Spec §"Edge cases", §A-006] - □ CHK044 — Are requirements defined for clock skew affecting the throttle window (system clock moved backward, far-future cache mtime)? [Edge Case] [Gap]
- □ CHK045 — Are requirements defined for read-only home directories where the nag cache cannot be written? [Edge Case] [Gap]
- □ CHK046 — Are requirements defined for the case where the PyPI provider returns an older version than the installed CLI (no nag, no spurious downgrade hint)? [Edge Case] [Gap]
- □ CHK047 — Are requirements defined for the case where the migration registry is empty for the current project (no migrations needed even though schema differs at the patch level)? [Edge Case] [Gap]
- □ CHK048 — Are requirements defined for invocation *inside a Spec Kitty project that is also a git submodule or worktree of another project*, so "current project" remains unambiguous? [Edge Case] [Gap]
Non-Functional Requirements Quality
- □ CHK049 — Is the NFR-001 100 ms threshold attached to a stated measurement protocol (median of N runs, on what kind of machine)? [Measurability, Spec §NFR-001]
- □ CHK050 — Is NFR-002's 2 s timeout binding on every network path the nag could take (not only on the success path)? [Measurability, Spec §NFR-002]
- □ CHK051 — Is NFR-003 ("no normal command writes project files") testable via a single observable predicate (e.g., file-system writes under
.kittify/andkitty-specs/)? [Measurability, Spec §NFR-003] - □ CHK052 — Is NFR-005's "testable without network" expressed as an architectural constraint (provider abstraction) rather than a wish? [Clarity, Spec §NFR-005, §A-002]
- □ CHK053 — Is NFR-006's "preserve existing project upgrade behavior" backed by a named test set that must continue to pass? [Traceability, Spec §NFR-006, §"Verification Expectations"]
- □ CHK054 — Is NFR-008's prohibition on SaaS / tracker / hosted-auth dependencies expressed as something a code reviewer can check (no new imports, no new outbound hostnames)? [Measurability, Spec §NFR-008] [Ambiguity]
- □ CHK055 — Is NFR-009's "configurable throttle window" tied to a specific configuration surface (file or env var) rather than left implicit? [Completeness, Spec §NFR-009] [Gap]
JSON & CLI Contract Quality
- □ CHK056 — Is the stability promise for the
--jsonschema scoped (across patch releases? minor releases? both?), with a documented breakage policy? [Clarity, Spec §FR-022] [Ambiguity] - □ CHK057 — Are the FR-023 case-name strings (
cli_update_available, etc.) declared as stable JSON tokens, not just example labels? [Clarity, Spec §FR-023, §"Key Entities → Upgrade message catalog"] - □ CHK058 — Are exit-code semantics specified for
--dry-run(always 0? non-zero when migrations pending? non-zero when CLI is too old)? [Completeness] [Gap] - □ CHK059 — Are help-text requirements specified for the new flags (
--yes,--cli,--project,--no-nag)? [Completeness] [Gap]
Domain Language Quality
- □ CHK060 — Does every term in §"Domain Language" have a definition that is testable (a reviewer can label a real-world example as matching or not)? [Clarity, Spec §"Domain Language"]
- □ CHK061 — Are the avoided synonyms in §"Domain Language" actually absent from the rest of the spec body? [Consistency, Spec §"Domain Language"]
- □ CHK062 — Does the spec consistently use "current project" rather than "the workspace" / "this repo" / "the project"? [Consistency, Spec §"Domain Language"]
Dependencies & Assumptions
- □ CHK063 — Are A-001 (cache location), A-002 (injectable provider), A-003 (planner architecture), and A-006 (
--yes/--forcealiasing) each annotated with their revision triggers (what would invalidate them)? [Traceability, Spec §"Assumptions"] - □ CHK064 — Are the existing modules listed in §"Dependencies" each annotated with the kind of change expected (refactor / wrap / replace / unchanged)? [Completeness, Spec §"Dependencies"] [Gap]
- □ CHK065 — Is the assumption that PyPI is the canonical authoritative source for "latest version" validated against the project's release process (i.e., no parallel release channel that would lie)? [Assumption, Spec §A-002]
- □ CHK066 — Is the assumption that
platformdirs-equivalent logic is acceptable for cache location validated against C-009 (no new mandatory runtime dependency)? [Assumption, Spec §A-001, §C-009]
Ambiguities & Conflicts
- □ CHK067 — Does any FR/NFR/C in the spec leave the decision of whether to print the nag in addition to a block message ambiguous? [Ambiguity, Spec §FR-002, §FR-009, §"Scenario B"]
- □ CHK068 — Does the spec resolve whether
spec-kitty upgrade --climay attempt a self-upgrade or only print guidance? FR-016 says "supported self-upgrade behavior" — is that scoped to install methods that support it? [Ambiguity, Spec §FR-016] - □ CHK069 — Does the spec resolve whether the planner runs (and consults the network) for
--helpand--version? [Ambiguity, Spec §"Scenario G"] [Gap] - □ CHK070 — Does the spec resolve whether the nag's fetch-on-first-call behavior in an interactive shell counts as "uncached network in CI" if
CI=1is unset but stdout is not a TTY (e.g., piping toless)? [Ambiguity, Spec §A-007] [Gap]
Notes
- Items marked
[Gap]denote missing content that the spec should add (or the planner should explicitly defer with rationale). - Items marked
[Ambiguity]denote present-but-imprecise content that should be sharpened before planning. - Items marked
[Assumption]denote claims that should be validated against external reality before becoming load-bearing. - A passing checklist does not mean implementation is correct — it means the requirements are well-written enough to plan against. Implementation correctness is verified later by
/spec-kitty.reviewand the test matrix in §"Verification Expectations". - Address
[Gap]and[Ambiguity]items by editingspec.md(preferred) or by recording a justified deferral in the plan's decision log.
security.md
Security Requirements Quality Checklist
Purpose: Validate that spec.md writes its security-relevant requirements with enough completeness, clarity, and measurability that a planner and reviewer can hold the implementation accountable. This checklist tests requirements quality, not implementation behavior. Created: 2026-04-27 Mission: cli-upgrade-nag-lazy-project-migrations-01KQ6YDN Spec: ../spec.md Audience: Reviewer / security-conscious planner. Depth: Standard. Threat surface in scope: a local CLI tool that (a) reads project metadata from the current directory, (b) writes a per-user cache file, (c) optionally fetches a "latest version" string from a remote source, (d) prints user-actionable upgrade hints, and (e) applies on-disk migrations to the current project. Attacker model: untrusted project on disk, untrusted network response, locally-controlled environment variables, multi-tenant CI runners.
Threat Model & Trust Boundaries
- □ CHK001 — Is the threat model for the upgrade-nag and lazy-migration paths documented (attackers, assets, trust boundaries)? [Gap, Traceability]
- □ CHK002 — Are the trust boundaries between installed CLI, current-project metadata on disk, per-user cache, and remote latest-version source explicitly named in the spec? [Completeness, Spec §"Key Entities"]
- □ CHK003 — Is it specified that
.kittify/metadata.yamlfrom the current directory is treated as untrusted input (in case the usercds into a hostile project)? [Gap, Spec §"Edge cases"] - □ CHK004 — Is it specified that the latest-version source response is treated as untrusted input (no implicit trust of payload contents beyond a documented schema)? [Gap, Spec §A-002, §NFR-002]
- □ CHK005 — Is the assumption that the user's
$XDG_CACHE_HOME(or fallback) is a trusted, user-only writable location validated, including the case of multi-user systems? [Assumption, Spec §A-001]
Data Protection at Rest
- □ CHK006 — Are file-permission requirements specified for the per-user nag cache (e.g., 0600, owner-only)? [Gap, Spec §A-001]
- □ CHK007 — Are requirements specified for what data the nag cache may NOT contain (no usernames, no project paths, no telemetry IDs)? [Gap, Spec §A-001, §NFR-008]
- □ CHK008 — Are requirements specified for behavior when the cache file already exists with permissions wider than required (refuse to read? rewrite with tighter mode? warn?)? [Gap, Edge Case]
- □ CHK009 — Is symlink-attack resistance for cache reads/writes addressed in the requirements (refuse to follow symlinks pointing outside the cache dir)? [Gap, Edge Case]
- □ CHK010 — Are requirements specified for what happens when the cache directory itself is a symlink to an attacker-controlled location? [Gap, Edge Case]
Network Path Security (Latest-Version Source)
- □ CHK011 — Are TLS / certificate-verification requirements specified for the latest-version network call? [Gap, Spec §A-002, §NFR-002]
- □ CHK012 — Is a maximum response size for the latest-version fetch specified, to bound resource exhaustion from a hostile or compromised endpoint? [Gap, Spec §NFR-002]
- □ CHK013 — Is the allowlist of hostnames the nag path is permitted to contact specified (and pinned to a small documented set, with no DNS-rebind surprises)? [Gap, Spec §NFR-008] [Ambiguity]
- □ CHK014 — Are requirements specified for what HTTP redirects are followed (and to what schemes / hosts), or that redirects are not followed at all? [Gap, Edge Case]
- □ CHK015 — Are requirements specified for handling responses that parse but contain a lower version than installed (no "downgrade" hint, no panic)? [Gap, Spec §"Edge cases"]
- □ CHK016 — Are requirements specified for handling responses with non-semver, malformed, or unexpectedly-large version strings (no command injection into upgrade hints)? [Gap]
- □ CHK017 — Are requirements specified for proxy /
HTTP(S)_PROXYhandling, including whether the spec opts in or refuses to use a proxy, given that a hostile proxy can rewrite version data? [Gap, Edge Case] - □ CHK018 — Is it specified that the network call MUST NOT include any user-identifying headers (username, machine ID, project path, query strings)? [Gap, Spec §NFR-008]
Input Validation — Project Metadata
- □ CHK019 — Are YAML-loading requirements specified to use a safe-load path (no arbitrary tag construction, no Python-object instantiation from
.kittify/metadata.yaml)? [Gap, Spec §"Key Entities → Current-project metadata"] - □ CHK020 — Are bounds specified for sizes/depth of
.kittify/metadata.yamlparsing (to prevent YAML bombs / aliasing attacks)? [Gap, Edge Case] - □ CHK021 — Are validation requirements specified for the
spec_kitty.schema_versionfield (must be integer in a documented range; reject negative, NaN, strings, lists)? [Completeness, Spec §"Key Entities → Current-project metadata"] [Gap] - □ CHK022 — Is "current project detection" defined precisely enough (e.g., walks upward looking for
.kittify/) that an attacker cannot trick the CLI into treating an attacker-controlled directory as the current project? [Clarity, Spec §"Domain Language → Current project"] [Gap] - □ CHK023 — Is the case where
.kittify/exists but is owned by a different user explicitly addressed (refuse, warn, or proceed)? [Gap, Edge Case]
Input Validation — Environment & CLI Surfaces
- □ CHK024 — Is the precedence between
CI=*, no-TTY detection,--no-nag, andSPEC_KITTY_NO_NAGdefined precisely so a single attacker-controlled env var cannot re-enable network access against the user's intent (or vice versa)? [Clarity, Spec §A-007] - □ CHK025 — Is the configuration surface for the throttle window (NFR-009) constrained to safe value ranges (e.g., refuse negative or absurdly large values rather than silently divide by zero or overflow)? [Completeness, Spec §NFR-009] [Gap]
- □ CHK026 — Is the case where the attacker controls
$XDG_CACHE_HOME(and points it at a sensitive system file) addressed in the requirements? [Gap, Edge Case] - □ CHK027 — Is the case where the attacker controls
$HOME(e.g., container shell) addressed? [Gap, Edge Case]
Output Hygiene & User-Facing Messages
- □ CHK028 — Are requirements specified for sanitizing version strings, install-method strings, and migration IDs before embedding them in human-readable upgrade hints (no ANSI-escape injection, no shell-metacharacter injection into shown commands)? [Gap, Spec §FR-006]
- □ CHK029 — Are requirements specified for sanitizing the same fields before embedding in JSON output (so a hostile latest-version response cannot break consumer parsers or smuggle structured data)? [Gap, Spec §FR-022]
- □ CHK030 — Is it specified that error messages and stack traces from the nag path MUST NOT leak local filesystem paths beyond what the user provided? [Gap, Spec §NFR-002]
- □ CHK031 — Is the upgrade hint for
unknowninstall method explicitly not a runnable shell command (to prevent users blindly pasting into a shell)? [Gap, Spec §FR-007, §A-008] - □ CHK032 — Are requirements specified for what the CLI prints when the install-method detection itself errors out (must not leak environment, must not crash the host command)? [Gap]
Migration Path Security
- □ CHK033 — Are requirements specified for the integrity of the migration registry (only ship migrations that are part of the installed CLI package; do not load migration code from the project's
.kittify/)? [Gap, Spec §FR-018] - □ CHK034 — Is the rule "migrations execute under the user's privileges and may write anywhere a normal command can" stated explicitly, so users understand what
spec-kitty upgradeis authorized to do? [Gap, Spec §"Scenario E"] [Ambiguity] - □ CHK035 — Are requirements specified for the dry-run path (FR-012, FR-019) being read-only at the OS level, with no side-effects beyond reading project files? [Completeness, Spec §FR-012, §FR-019]
- □ CHK036 — Are requirements specified for behavior when a migration fails partway: is the project left in a documented partial state, or rolled back? Without this, an attacker could engineer a project that triggers a partial-state where downstream commands behave unsafely. [Gap, Recovery]
- □ CHK037 — Is it specified that
--yes/--forcedoes NOT bypass schema-incompatibility blocks (FR-010 — too-new project), only confirmation prompts? [Clarity, Spec §FR-010, §FR-017, §A-006] - □ CHK038 — Are requirements specified for what happens when two
spec-kitty upgradeprocesses race against the same project (file lock, refuse, last-write-wins)? [Gap, Edge Case]
Self-Upgrade Path (--cli) Security
- □ CHK039 — Is the scope of "supported self-upgrade behavior" in FR-016 enumerated by install method, with explicit exclusions for any method that cannot be self-upgraded safely (e.g., system package, source install)? [Clarity, Spec §FR-016] [Ambiguity]
- □ CHK040 — Are requirements specified for whether
--cliever executes an upgrade command on the user's behalf vs. only prints it, and the security implications of either choice are noted? [Gap, Spec §FR-016, §C-004] - □ CHK041 — Is C-004 (no forced CLI self-update during normal command startup) consistent with FR-016, so no startup path can be coaxed into self-upgrade by env var or flag? [Consistency, Spec §C-004, §FR-016]
Determinism & Side-Channel Hardening
- □ CHK042 — Are requirements specified that the nag must not behave differently between two invocations purely because a remote source is reachable (i.e., no observable side channel that leaks "network is up" beyond the printed line itself)? [Clarity, Spec §"Scenario A"] [Ambiguity]
- □ CHK043 — Are requirements specified to prevent timing differences between the "fresh cache, no network" path and the "stale cache, network call" path being used as an oracle for whether a particular CLI version is installed? [Gap, Edge Case]
- □ CHK044 — Are requirements specified that NFR-001's <100 ms target must hold even when the cache file is corrupt or maliciously crafted (no exponential parser blowup)? [Completeness, Spec §NFR-001]
Supply Chain & Dependency Posture
- □ CHK045 — Is the explicit prohibition on adding hosted SaaS / tracker / sync dependencies (NFR-008, C-007) accompanied by a requirement that the planner's allowed hostnames are reviewed at PR time? [Completeness, Spec §NFR-008, §C-007] [Gap]
- □ CHK046 — Is C-009 ("no new mandatory runtime dependency outside
typer,rich,ruamel.yaml, plus stdlib") enforceable at review time (e.g., dependency-policy test)? [Measurability, Spec §C-009] - □ CHK047 — Is the requirement that
ruamel.yaml(per the charter) must be invoked in safe mode for any externally-influenced YAML stated in the spec or deferred to plan with a clear note? [Gap, Spec §"Key Entities → Current-project metadata"]
Privacy
- □ CHK048 — Is it specified that no telemetry, analytics ping, or user-identifying string leaves the machine from the upgrade-nag path (beyond the unavoidable User-Agent of the network library, which itself should be documented)? [Completeness, Spec §NFR-008] [Gap]
- □ CHK049 — Is the User-Agent / request signature for the latest-version call specified (or required to be specified during planning) so security review can audit the outbound surface? [Gap]
- □ CHK050 — Are requirements specified that the nag cache and any debug logs MUST NOT record project paths, project slugs, or mission identifiers? [Gap]
Failure & Exception Path Security
- □ CHK051 — Are exception-path requirements specified so that an unexpected error in the planner cannot bypass the safe/unsafe gate (i.e., "fail closed" for unsafe commands when planner errors out)? [Completeness, Spec §FR-008, §FR-024]
- □ CHK052 — Are exception-path requirements specified so that an unexpected error in the nag path is "fail open" but does not cascade into corrupting the cache file? [Clarity, Spec §NFR-002] [Ambiguity]
- □ CHK053 — Are requirements specified for handling SIGINT / SIGTERM mid-cache-write, mid-network-fetch, and mid-migration apply (no half-written cache, no partially-applied migration without flag)? [Gap, Edge Case, Recovery]
Security Acceptance Criteria & Traceability
- □ CHK054 — Are at least one Success Criterion or Acceptance Criterion explicitly tied to a security property (e.g., "zero outbound network calls in CI" — SC-005 covers this; are similar SCs needed for cache-perm hardening, YAML safe-load, payload size limit)? [Coverage, Spec §SC-005] [Gap]
- □ CHK055 — Is there a documented mapping from each security-relevant requirement to a verification mechanism (unit test, integration test, dependency policy, doc review)? [Traceability] [Gap]
- □ CHK056 — Are security-relevant assumptions (A-001 cache location trust, A-002 PyPI as authoritative source, A-007 CI/non-interactive predicate) flagged for security review during planning? [Assumption, Spec §"Assumptions"]
Notes
- This checklist deliberately stays at the requirements level. Any item marked
[Gap]should be either added tospec.mdbefore planning, or deferred with a recorded rationale in the plan's decision log (per DIRECTIVE_003 — Decision Documentation Requirement). - Security defaults the spec already gets right: no SaaS dependency (C-007/NFR-008), no forced self-update at startup (C-004), no global registry (C-002/FR-021), no cross-project state (FR-021), CI determinism (FR-005/NFR-004/SC-005), injectable latest-version source (A-002), local-only operation (C-001/C-007).
- The dominant unaddressed surfaces are: (1) network-path hardening for the latest-version fetch, (2) safe-load and bounds on
.kittify/metadata.yaml, (3) cache file permissions and symlink resistance, (4) output sanitization in upgrade hints, (5) fail-closed behavior of the planner for unsafe commands. - Address
[Gap]and[Ambiguity]items by editingspec.md(preferred) or by recording a justified deferral in the plan's decision log.