Skip to content

P0013: search canon before designing, not just before asking (accept or defer-pending-second-incident both legitimate) - #307

Merged
git-repo-auth[bot] merged 3 commits into
mainfrom
promo/P0013-search-canon-before-designing
Jul 20, 2026
Merged

P0013: search canon before designing, not just before asking (accept or defer-pending-second-incident both legitimate)#307
git-repo-auth[bot] merged 3 commits into
mainfrom
promo/P0013-search-canon-before-designing

Conversation

@git-repo-auth

@git-repo-auth git-repo-auth Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Promotion from the first distillation sweep (C1, successor charter, 2026-07-20). Drafted by sweep flight run_fb133d81, transplanted by the dispatch seat (klappy.dev push refused to the flight — documented fallback). Patch was git apply --check verified against main. Merging is the maintainer's alone (M3) — defer and reject are legitimate outcomes and each promotion's Evidence section says so honestly.

Full report + kirigami foldout: docs/reports/2026-07-20-first-distillation-sweep.md on sweep/2026-07-20-first-distillation in outcomes-driven-development.



uri: klappy://docs/promotions/P0013-search-canon-before-designing
title: "P0013: Search Canon Before Designing, Not Just Before Asking"
audience: docs
exposure: nav
tier: 3
voice: neutral
stability: evolving
tags: ["promotions", "proposed", "canon-search", "design-time", "mode-discipline", "anti-cache-lying"]
promotion_status: proposed

P0013: Search Canon Before Designing, Not Just Before Asking

canon/constraints/mode-discipline-and-bottleneck-respect.md already binds "search canon before asking anything, in any mode." It does not yet bind the earlier moment: search canon before designing — before a solution shape is chosen, not just before a question is about to be surfaced to the maintainer. A violated constraint that had existed since February was rediscovered the hard way when a design decision skipped the search step entirely.

Observed Pattern

A design decision with a named canon domain (in this case, caching) was made without first consulting the canon domain that already governed it. The existing "search before asking" rule did not catch this, because the failure never reached the asking step — it was a fully-formed design before any question would have been surfaced. The rule closes the gap between "a question is about to be asked" and "canon already answered it." It does not close the earlier gap: "a design is about to be chosen" and "canon already constrains this domain."

  • Affects: any design decision with a named canon domain (caching, storage, identity, disclosure, and by extension any future domain that accumulates a canon constraint)
  • Outcome without the corollary: canon can exist, be stable, and still be violated twice, because the discipline only fires at the asking boundary, which a fully-formed design can bypass entirely

Evidence

Validation Session Date Outcome Notes
Corpus v1 caching design (per-isolate cache) 2026-07-19 FAIL (canon violated) Violated odd/constraint/anti-cache-lying.md (E0005, stable canon since 2026-02-12, itself proven necessary by the earlier OddKit Stale-Cache Incident) — a TTL-shaped per-isolate cache for derived content, without a canon search at design time
Corpus v1 caching design (mutable-key R2 write-through) 2026-07-19 FAIL (canon violated, same incident) Second, independent design choice in the same rebuild that also violated the same already-stable constraint; caught only when the captain caught it in conversation, not by a design-time canon search
Folded seed: "a cache is a lie in wait" (debrief line, odd/debriefs/2026-07-19-weekend-closeout.md) 2026-07-19 Supporting evidence, not independently promoted The sweep judged this debrief line's substance already fully covered by stable canon (anti-cache-lying.md); its value here is as proof that the constraint's existence alone did not prevent violation — the actionable gap is the design-time search corollary this promotion proposes, not a restatement of the caching rule itself

Total observations: 2 independent design decisions violating the same pre-existing constraint in one incident, plus one folded corroborating debrief line
Independent occurrences: 2 (two distinct design choices, same incident) — honestly below this pipeline's usual ≥2-independent-incidents bar (see P0004/P0006, which each cite 2 distinct repositories/projects). Flagged for the maintainer: this promotion may be better dispositioned as deferred pending a second, separate incident rather than accepted outright, precisely because the sweep's own honesty mandate does not want to inflate a same-incident double-count into cross-incident evidence.
Affected workflows: any design-mode work touching a canon-governed domain

Current Handling

  • Detection today: canon/constraints/mode-discipline-and-bottleneck-respect.md binds "search canon before asking anything, in any mode" — this fires at the question-surfacing boundary
  • **Closest existi

Note

Low Risk
Documentation and governance text only; no runtime, auth, or data-path changes.

Overview
Extends canon/constraints/mode-discipline-and-bottleneck-respect.md with a design-time corollary to the existing “search canon before asking” rule: for any decision in a named canon domain (caching, storage, identity, disclosure, etc.), the model must search canon before picking a solution shape, because confident designs can skip the ask step entirely.

Introduces docs/promotions/P0013-search-canon-before-designing.md, which records the caching-incident evidence, the proposed wording (now reflected in canon), and maintainer notes that accept vs defer-pending-a-second-incident are both legitimate given the evidence bar.

The promotion file’s Status section mixes “LANDED AS ACTIVE CANON” with proposed and empty review/execution fields—worth reconciling on merge if this PR is meant to reflect final disposition only.

Reviewed by Cursor Bugbot for commit 1798f3f. Bugbot is set up for automated code reviews on this repo. Configure here.

@github-actions

Copy link
Copy Markdown

Canon Quality — Homepage Surfacing ✅

50 essay(s) scanned. Soft report — never blocks; the hard field gate is the Frontmatter Schema job.

All published essays resolve to the homepage feed.

Report: scripts/surfacing-report.py · Canon: klappy://canon/constraints/frontmatter-validation-before-merge

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown

Canon Quality — oddkit_audit

No dead klappy:// references or legacy link patterns found in writings/. 52 files scanned.

Spec: klappy://docs/oddkit/specs/oddkit-audit · Workflow: .github/workflows/canon-quality.yml · Run: #405

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown

Canon Quality — Frontmatter Schema ✅

All 50 file(s) in writings/ conform to klappy://canon/meta/frontmatter-schema.

Validator: scripts/validate-frontmatter.py · Canon: klappy://canon/constraints/frontmatter-validation-before-merge · Run: #405

@github-actions

github-actions Bot commented Jul 20, 2026

Copy link
Copy Markdown

Canon Quality — P0010 Retrieval-Readiness ⚠️

Soft report for klappy://canon/constraints/retrieval-disclosure-contract. 707 files scanned. Never blocks — informational until the corpus is ready to enforce.

  • Blocking-class findings: 15 (structural fields the contract would filter on)
  • Warnings: 0 (kind resolves to unknown)
  • Informational: 13 (exempt templates/archive/drafts)

Kind distribution: {'essays': 52, 'canon': 244, 'apocrypha': 38, 'docs': 307, 'journals': 60, 'unknown': 6}
Kind source: {'path': 572, 'frontmatter': 129, 'none': 6} (frontmatter-primary, path-secondary)
Default-include visibility: 603 visible, 104 hidden (journals/apocrypha/unknown)

By rule: {'audience-invalid': 2, 'exposure-missing': 5, 'tier-missing': 5, 'tier-invalid': 7, 'fm-missing': 3, 'kind-unresolvable': 6}

These are not schema violations (see the Frontmatter Schema job for those on writings/). They are corpus-readiness signals for the retrieval contract: invalid/missing audience, exposure, tier, and docs whose kind cannot be resolved. Fix in a corpus-cleanup PR before the contract flips to enforcing. See the retrieval-readiness-findings artifact for the full list.

Validator: scripts/audit-retrieval-readiness.py · Constraint: klappy://canon/constraints/retrieval-disclosure-contract · Run: #405

klappy added 2 commits July 20, 2026 13:20
Corollary appended verbatim at the promotion's named anchor in
canon/constraints/mode-discipline-and-bottleneck-respect.md per captain
instruction 2026-07-20 ('307 a and merge') — one-merge landing shape.
@git-repo-auth
git-repo-auth Bot merged commit d6a9969 into main Jul 20, 2026
5 checks passed
@git-repo-auth
git-repo-auth Bot deleted the promo/P0013-search-canon-before-designing branch July 20, 2026 13:20
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.

1 participant