diff --git a/canon/definitions/dolcheo-vocabulary.md b/canon/definitions/dolcheo-vocabulary.md index 7866ae6b..0b281583 100644 --- a/canon/definitions/dolcheo-vocabulary.md +++ b/canon/definitions/dolcheo-vocabulary.md @@ -1,14 +1,14 @@ --- uri: klappy://canon/definitions/dolcheo-vocabulary -title: "DOLCHEO — Seven Dimensions of Session Capture" +title: "DOLCHEOT — Eight Dimensions of Session Capture" audience: canon exposure: nav tier: 2 voice: neutral stability: semi_stable -tags: ["canon", "definitions", "dolcheo", "dolche", "oldc-h", "vocabulary", "session-capture", "project-journal", "open-items", "priority-bands", "epoch-8.3"] -epoch: E0008.3 -date: 2026-04-19 +tags: ["canon", "definitions", "dolcheot", "dolcheo", "dolche", "oldc-h", "vocabulary", "session-capture", "project-journal", "open-items", "priority-bands", "tension", "tensions", "derived", "epoch-9"] +epoch: E0009 +date: 2026-06-24 derives_from: "canon/values/axioms.md, canon/definitions/epistemic-modes.md, docs/oddkit/proactive/dolche-vocabulary.md, docs/oddkit/proactive/oldc-h-vocabulary.md, odd/ledger/2026-04-19-agent-team-pilot.md" complements: "canon/meta/writing-canon.md, docs/oddkit/proactive/continuous-encoding.md, docs/oddkit/proactive/encode-does-not-persist.md, odd/ledger/project-journal-best-practices.md" governs: "All session capture, project journals, and encode invocations in oddkit-powered projects" @@ -17,9 +17,9 @@ supersedes: "docs/oddkit/proactive/dolche-vocabulary.md" target_repo: "outcomes-driven-development" --- -# DOLCHEO — Seven Dimensions of Session Capture +# DOLCHEOT — Eight Dimensions of Session Capture -> Decisions, Observations (closed), Learnings, Constraints, Handoffs, Encodes, Opens. Six artifact types and one meta-level action, with Open added as the seventh letter: the forward-pointing thread that stays with the current owner. DOLCHE tracked what happened but had no home for what remained unresolved. Open items fill that gap. Unfinished work, unanswered questions, and live threads get captured as first-class artifacts with priority bands, separate from Handoffs (which transfer work to another owner). Both Os retain the single letter `O`; section placement disambiguates closed Observation from Open item. A DOLCHE journal tells you what was done; a DOLCHEO journal also tells you what is still alive. +> Decisions, Observations (closed), Learnings, Constraints, Handoffs, Encodes, Opens, Tensions. Six artifact types, one meta-level action, one forward-pointing thread, and one derived dimension — with Open added as the seventh letter and Tension as the eighth: the forward-pointing thread that stays with the current owner. DOLCHE tracked what happened but had no home for what remained unresolved. Open items fill that gap. Unfinished work, unanswered questions, and live threads get captured as first-class artifacts with priority bands, separate from Handoffs (which transfer work to another owner). Both Os retain the single letter `O`; section placement disambiguates closed Observation from Open item. A DOLCHE journal tells you what was done; a DOLCHEO journal also tells you what is still alive; a DOLCHEOT journal also surfaces what the captured artifacts, taken together, contradict — and Tension is the only one of the eight that is derived rather than asserted. --- @@ -33,9 +33,11 @@ DOLCHEO adds **Open** as that something else. The second `O` joins the letter se DOLCHEO is backward compatible with DOLCHE. Every DOLCHE journal is a valid DOLCHEO journal with zero Open items. Migration is additive: start capturing Open items, nothing else changes. +**The eighth letter, Tension, is different in kind.** Where the first seven are *asserted* — an author states what was decided, seen, learned, constrained, handed off, encoded, or left open — Tension is *derived*: a retrospective pass reads across the captured artifacts and surfaces what they contradict. For months this happened by accident, in the prose of encode output; DOLCHEOT makes it a first-class, typed, synthesized artifact. Tension is the only second-order dimension, and like Open it is additive: every DOLCHEO journal is a valid DOLCHEOT journal with zero Tensions. See `odd/encoding-types/tension.md`. + --- -## The Seven Letters +## The Eight Letters **Decisions (D)** — What was chosen. Explicit commitments with rationale. Decisions close options and create direction. They are the highest-stakes artifacts because they constrain all subsequent work. A decision without rationale is a debt (Axiom 2). A decision without a constraint test is untested. @@ -51,6 +53,8 @@ DOLCHEO is backward compatible with DOLCHE. Every DOLCHE journal is a valid DOLC **Opens (O, forward-pointing)** — Unresolved threads that stay with the current owner. Work begun and awaiting next action, questions raised and awaiting answer, decisions pending further evidence, items deferred to the next pass. Open items carry a priority band (P1, P2, P3…) so the list is scannable. They close by becoming Decisions (resolved), Handoffs (transferred), or Observations (completed and now history). +**Tensions (T, derived)** — A contradiction or unresolved conflict visible only *across* two or more captured artifacts, never in a single one. Unlike the other seven, a Tension is not asserted by the author; it is inferred by a pass over the artifacts already captured — synthesized by default, advisory, and sha-bound to the artifacts it spans. It closes when an author resolves it (a Decision) or retracts a pole. Tension is the eighth letter and the first second-order dimension; see `odd/encoding-types/tension.md`. + --- ## Both Os Remain O — The Collision Is Intentional @@ -94,6 +98,20 @@ Bands are a communication tool, not a scheduling system. They say "if I only had --- +## Tension Is Derived, Not Asserted — The Eighth Dimension + +The first seven dimensions are *asserted*: an author or agent states them as content. Tension is the exception — it is **derived**, computed by a pass over the other artifacts. This is what makes it the first *second-order* DOLCHEOT type and why it behaves differently from its siblings. + +**Synthesized by default.** A Tension is emitted by a detection pass, not entered by an author, so its custody is `synthesized` — a regeneratable projection, never sovereign. An operator who asserts a contradiction in their own voice creates an *authored* Tension, which is sovereign and supersedes the inferred one. An author who *resolves* a Tension (a Decision) closes it by reference and drops its priority; the Tension is marked `resolved`, not deleted. + +**Advisory and sha-bound.** A Tension is sha-bound to the artifacts it spans. When any of them changes, it goes stale and is re-derived — staleness *detection* is reliable, but re-derivation is not bitwise reproducible, because detection is an inference, not a deterministic transform. A false-positive Tension is dismissable and never blocks. + +**Three senses, one letter.** "Tension" is overloaded; the `T` dimension is precise. The *quality-attribute tradeoff* (`canon/principles/quality-attributes-are-in-tension`) is one `kind` of Tension. The *challenge-vs-canon contradiction* surfaced by oddkit challenge is the challenge-time sibling. The DOLCHEOT `T` is the encode-time, within-source primitive: a contradiction across the captured artifacts. They share machinery; they are not the same artifact. + +**Why core, not a domain extension.** The extension mechanism below admits domain-specific letters (P for Prayer, R for Rulings). Tension is not domain-specific — it emerged across every oddkit-powered project, in the prose of ordinary encodes. It is promoted into the core letter set for that reason. + +--- + ## Example Ledger Structure A DOLCHEO-compliant session ledger looks roughly like this: @@ -143,16 +161,17 @@ The `odd/ledger/2026-04-19-agent-team-pilot.md` ledger is the first DOLCHEO-nati --- -## Tool-Level Implication — oddkit_encode Must Accept All Seven +## Tool-Level Implication — oddkit_encode Must Accept All Eight -The `oddkit_encode` tool currently recognizes four hardcoded artifact types and collapses batched input into a single typed blob. DOLCHEO expands the recognized set to seven and requires per-artifact output. +The `oddkit_encode` tool currently recognizes four hardcoded artifact types and collapses batched input into a single typed blob. DOLCHEOT expands the recognized set to eight and requires per-artifact output. Concrete requirements that follow from this vocabulary: -1. The tool must accept prefix-tagged input for all seven letters: `[D]`, `[O]`, `[L]`, `[C]`, `[H]`, `[E]`, and the Open variant (`[O-open]` or equivalent, with an optional priority band like `[O-open P1]`). +1. The tool must accept prefix-tagged input for all eight letters: `[D]`, `[O]`, `[L]`, `[C]`, `[H]`, `[E]`, the Open variant (`[O-open]` or equivalent, with an optional priority band like `[O-open P1]`), and `[T]` for an authored Tension. 2. Batched input with multiple prefixes must return a per-artifact array, not a single collapsed blob. Each artifact gets its own quality score and persistence flag. 3. Single-artifact input without a prefix must still work — the existing heuristic that infers type from content remains as fallback. 4. The vocabulary itself must be read from this document at runtime, not hardcoded in the tool. That is the prompt-over-code pattern applied to encode — canon defines the vocabulary, code reads it, the three-tier resolution stack (live canon → bundled baseline → fail-loud) governs fallback. +5. Tension (`T`) is **derived, not prefixed** in the common case: after typing the assertable artifacts, the tool runs a detection pass across them and emits `T` rows for genuine cross-artifact contradictions, marked `synthesized`. An operator may also assert a `[T]` Tension directly. See `odd/encoding-types/tension.md` for the detection pass and quality criteria. The implementation PR for these requirements is tracked separately from this canon doc; this document is the governance contract the tool must satisfy. @@ -160,23 +179,25 @@ The implementation PR for these requirements is tracked separately from this can ## Storage at Scale -DOLCHEO entries are structured data: each has a type (one of D / O / L / C / H / E / O-open), a timestamp, a summary, a body, tags, and — for Open items — a priority band. At personal scale, a few entries per session, markdown journals work well. At production scale, dozens per day across multiple projects, tabular formats like TSV or CSV offer faster parsing, easier appending, and cleaner git diffs. +DOLCHEOT entries are structured data: each has a type (one of D / O / L / C / H / E / O-open / T), a timestamp, a summary, a body, tags, and — for Open items — a priority band. At personal scale, a few entries per session, markdown journals work well. At production scale, dozens per day across multiple projects, tabular formats like TSV or CSV offer faster parsing, easier appending, and cleaner git diffs. -Storage format is an implementation concern, not a vocabulary concern. DOLCHEO defines what to capture. How entries are stored, indexed, and queried depends on the deployment context: markdown for human-readable journals, tabular formats for machine-queryable session history, or both in parallel. The vocabulary travels across any format that can carry the seven-letter type field. +Storage format is an implementation concern, not a vocabulary concern. DOLCHEOT defines what to capture. How entries are stored, indexed, and queried depends on the deployment context: markdown for human-readable journals, tabular formats for machine-queryable session history, or both in parallel. The vocabulary travels across any format that can carry the eight-letter type field. --- ## Extensibility — Custom Types Through Governance -DOLCHEO's seven letters are defaults, not a closed set. Any knowledge base can extend the vocabulary by adding a governance document that defines a new type letter, describes when it should be used, gives examples of valid entries, and explains how it relates to the existing seven. +DOLCHEOT's eight letters are defaults, not a closed set. Any knowledge base can extend the vocabulary by adding a governance document that defines a new type letter, describes when it should be used, gives examples of valid entries, and explains how it relates to the existing seven. A pastoral knowledge base might add `P` for Prayer Requests. A legal knowledge base might add `R` for Rulings. A smart-home knowledge base might add `A` for Automations. The extension mechanism is governance, not code: the server infrastructure treats the type field as a string and searches, filters, and counts entries without needing to know what each letter means. Prompt-over-code applies to the vocabulary itself. The defaults are universal. The extensions are domain-specific. The capability is open. The semantics are governed. +Tension (`T`) was the first letter promoted *into* the core set rather than added as a domain extension: it is universal, surfacing in every project's encode prose, so it earned a core letter rather than a knowledge-base-local one. + --- -## Migration from DOLCHE +## Migration from DOLCHE and DOLCHEO DOLCHEO is backward compatible with DOLCHE. All six original dimensions retain their definitions. The only additions are: @@ -188,6 +209,10 @@ Existing DOLCHE journals do not need to be rewritten — they are valid DOLCHEO Agents that were previously taught DOLCHE have one concrete behavior change: at session end, before writing the Handoff section, scan the session for unresolved threads and record them as Open items with priority bands. If there are genuinely none, note that explicitly. An absent Open section is different from an empty one; the former suggests the agent forgot, the latter confirms the agent checked. +### From DOLCHEO to DOLCHEOT + +DOLCHEOT adds one dimension: Tension (`T`), the derived contradiction. Every DOLCHEO journal is a valid DOLCHEOT journal with zero Tensions. The one behavior change: when encoding a session, after typing the assertable artifacts, run a detection pass across them and emit Tensions for genuine cross-artifact contradictions. Because Tension is derived and advisory, an absent Tension set is fine — it means the pass found none, or was not run; it is not a malformed journal. + --- ## Scope, Prior Art, and Retraction Conditions @@ -200,12 +225,15 @@ DOLCHEO is a working vocabulary for session capture inside oddkit-powered knowle **Prior art the Open letter relates to.** The Open/Handoff distinction has relatives in several established systems: Getting Things Done separates Next Actions (owner is self) from Waiting For (owner is someone else), which is a close analogue of the Open/Handoff split. Kanban boards distinguish in-progress work from done work, but do not separate forward-pointing threads with the current owner from transferred work. Issue trackers track tickets with status fields, but a ticket is a heavier unit of work than a session-scope Open item. DOLCHEO's contribution is not the distinction itself but its compact letter-based notation inside a session journal, alongside the six other DOLCHE dimensions, with a single-letter disambiguation rule that preserves backward compatibility. +**Prior art the Tension letter relates to.** Surfacing and preserving contradictions rather than silently resolving them is the move in truth-maintenance systems and defeasible/argumentation frameworks, and resembles a merge-conflict marker that is kept rather than auto-resolved. DOLCHEOT's contribution is again notational and operational: a derived, sha-bound, advisory contradiction captured in the same letter-based journal as the asserted artifacts, emitted by the encode pass rather than entered by hand. + **Retraction conditions.** DOLCHEO should be retracted, revised, or replaced if any of the following hold after sustained use: - Open items in practice convert almost entirely to Handoffs at session end, with near-zero in-session closure. If that pattern holds, the Open dimension is not earning its place and can be collapsed back into Handoff. - The letter collision between closed Observation and Open (both `O`) causes operators or agents to consistently confuse the two despite the section-placement convention. If disambiguation fails in practice, either the collision should be resolved by using a distinct letter (e.g., `U` for Unresolved), or the convention should be strengthened. - Priority bands are used inconsistently to the point where they provide no scanning value. If bands become noise, drop them and accept flat Open lists. - A more general session-capture framework emerges in the broader AI-augmented-workflow literature that DOLCHEO does not add value beyond. If prior art catches up, adopt it. +- Tension (`T`) rows are mostly false positives, or are recorded but never acted on at the same rate they were when buried in prose. If making tensions explicit and typed earns nothing over the prose habit, tighten the detector or retract the dimension. These conditions will be evaluated against live ledgers over the coming weeks. The first ledger written against DOLCHEO, `odd/ledger/2026-04-19-agent-team-pilot.md`, is the initial data point. @@ -213,19 +241,19 @@ These conditions will be evaluated against live ledgers over the coming weeks. T ## Discoverability -This article exists so that any search for "DOLCHEO," "DOLCHE," "OLDC+H," "session capture," "journal vocabulary," "project journal format," "open items," "priority bands," "forward-pointing threads," "decisions observations learnings constraints handoffs encodes opens," or "what to track in a session" surfaces this vocabulary. +This article exists so that any search for "DOLCHEO," "DOLCHE," "OLDC+H," "session capture," "journal vocabulary," "project journal format," "open items," "priority bands," "forward-pointing threads," "decisions observations learnings constraints handoffs encodes opens tensions," "DOLCHEOT," "tensions," "contradictions across artifacts," or "what to track in a session" surfaces this vocabulary. --- ## Anti-Pattern — Do Not Write "DOLCHEO+H" -The vocabulary is **DOLCHEO**. The seven letters are D-O-L-C-**H**-E-O — Handoffs is the fifth letter, already inside the acronym. Writing **DOLCHEO+H** is malformed: +The vocabulary is **DOLCHEOT**. The eight letters are D-O-L-C-**H**-E-O-**T** — Handoffs is the fifth letter and Tension the eighth, already inside the acronym. Writing **DOLCHEO+H** (or **DOLCHEOT+T**) is malformed: - It doubles the H (once inside the acronym, once as the suffix). - It is residue from the superseded `OLDC+H` vocabulary (`docs/oddkit/proactive/oldc-h-vocabulary.md`), in which Handoffs were appended with `+H` because the original four letters did not include them. DOLCHEO absorbed Handoffs into the acronym; the suffix is no longer needed. - It propagates because agents see "OLDC+H" in canon-adjacent context (this doc's See Also, ledger headers in older artifacts) and pattern-match the suffix onto the new vocabulary by mistake. -When tagging or describing session capture, write **DOLCHEO**. The Handoff section is named with the letter `H` inside the acronym, just like Decision is `D` and Encode is `E`. +When tagging or describing session capture, write **DOLCHEOT**. The Handoff section is named with the letter `H` inside the acronym, just like Decision is `D` and Encode is `E`. The same rule applies to Tension: `T` is the eighth letter, inside the acronym — never append it as a suffix (`DOLCHEOT+T` is malformed for the same reason as `DOLCHEO+H`). ### If you are reading an older artifact that uses "DOLCHEO+H" @@ -246,5 +274,6 @@ Treat it as a typo equivalent to "DOLCHEO." Do not propagate the form into new a - [Continuous Encoding](klappy://docs/oddkit/proactive/continuous-encoding) — encoding at every turn, not just session end - [Project Journal Best Practices](klappy://odd/ledger/project-journal-best-practices) — sizing, timestamps, and format for journals - [Agent-Team Pilot Ledger](klappy://odd/ledger/2026-04-19-agent-team-pilot) — the first DOLCHEO-native ledger, used as a working reference +- [Encoding Type: Tension](klappy://odd/encoding-types/tension) — the derived eighth dimension's type governance - [Epistemic Modes](klappy://canon/epistemic-modes) — the four modes that govern when capture happens - [Writing Canon](klappy://canon/meta/writing-canon) — the checklist every canon document must pass diff --git a/odd/encoding-types/tension.md b/odd/encoding-types/tension.md new file mode 100644 index 00000000..dca9778b --- /dev/null +++ b/odd/encoding-types/tension.md @@ -0,0 +1,134 @@ +--- +uri: klappy://odd/encoding-types/tension +kind: canon +title: "Encoding Type: Tension (T, derived)" +audience: docs +exposure: nav +tier: 2 +voice: neutral +stability: semi_stable +tags: ["odd", "oddkit", "encode", "dolche", "dolcheo", "dolcheot", "tension", "tensions", "contradiction", "tradeoff", "drift", "derived", "second-order", "projection", "encoding-type", "tsv", "governance", "epoch-9"] +epoch: E0009 +date: 2026-06-24 +derives_from: "canon/definitions/dolcheo-vocabulary.md, odd/encoding-types/how-to-write-encoding-types.md, canon/principles/quality-attributes-are-in-tension.md, canon/principles/prompt-over-code.md" +complements: "odd/encoding-types/observation.md, odd/encoding-types/decision.md, odd/encoding-types/learning.md, odd/encoding-types/constraint.md, odd/encoding-types/handoff.md, odd/encoding-types/encode.md, odd/encoding-types/open.md, odd/encoding-types/how-to-write-encoding-types.md, odd/encoding-types/serialization-format.md" +governs: "oddkit_encode parsing and quality scoring for type T (derived/second-order)" +status: active +target_repo: "outcomes-driven-development" +--- + +# Encoding Type: Tension (T, derived) + +> A contradiction or unresolved conflict visible only *across* two or more captured artifacts — never in any single one. Unlike every other DOLCHEOT type, a Tension is synthesized by default rather than asserted in the common case; when an operator asserts the contradiction in their own voice, it becomes an authored, sovereign Tension. It is advisory and sha-bound to the artifacts it spans: when they change, it goes stale and is re-derived. A Tension closes when an author resolves it (a Decision) or retracts one of its poles. + +--- + +## Summary — The Derived Dimension: What the Artifacts, Together, Contradict + +For months, `oddkit_encode` surfaced tensions as a side effect: writing a project journal in prose, the model would notice that two captured items disagreed and write about it — but the contradiction had no type, no schema, and no home. It lived in prose or vanished. Tension makes that emergent behavior first-class. + +Tension is the first **second-order** DOLCHEOT type. Every other letter is *asserted* — an author or agent states a Decision, an Observation, a Constraint as content. Tension is *inferred* — computed by a detection pass *over* the other captured artifacts. That is what makes it a projection off the source map rather than a fact entered into it: regeneratable, advisory, and never sovereign unless an author asserts it in their own voice. See `canon/definitions/dolcheo-vocabulary.md` for how Tension joins the core letter set and why it is core (universal) rather than a domain extension. + +--- + +## Type Identity + +| Field | Value | +|---|---| +| Letter | T | +| Name | Tension | +| Custody | Synthesized by default (derived); authored only when an operator asserts the contradiction in their own voice | +| Priority | Derived / second-order — emitted by a detection pass after the assertable types by default; entered by hand only when an operator asserts the contradiction | + +--- + +## Field Schema + +When encoding a Tension, the model outputs a row with the following fields (serialization format governed by `odd/encoding-types/serialization-format.md`): + +``` +T {title} {body} {between} {kind} {status} +``` + +| Field | Recommended | Description | +|---|---|---| +| type | yes | Always `T` | +| title | yes | Short summary of the contradiction (≤12 words) | +| body | yes | What disagrees, and why the two sides cannot both stand as written | +| between | yes | The ≥2 artifacts/claims in conflict — references (artifact ids, row ids, or short source labels). A tension needs ≥2 poles | +| kind | no | `tradeoff` (two goods in tension), `contradiction` (factual conflict), or `drift` (canon vs implementation/observed) | +| status | yes | `open` with what would close it, or `resolved:{ref}` (the Decision or retraction that closed it) | + +Example: + +``` +T Per-artifact encode output vs observed batch collapse Canon requires oddkit_encode to return a per-artifact array for batched input; an observed run collapsed six prefix-tagged artifacts into one Decision blob. canon/definitions/dolcheo-vocabulary#tool-level-implication, encode-run-2026-06-24 drift open — closes when the tool ships per-artifact output, or the requirement is retracted +``` + +--- + +## Trigger Words (Fallback Classification) + +When encode input is unstructured (not TSV), these trigger words classify a paragraph as Tension: + +``` +contradicts, conflicts with, in tension, at odds, doesn't square, inconsistent with, can't both, mutually exclusive, trade-off, tradeoff, pulls against, disagrees with, contradiction, conflict between +``` + +Classification preference: a paragraph prefixed `[T]` is classified as Tension. Because a Tension is *derived*, the primary way it enters a journal is not an author prefix but the detection pass (below) emitting `T` rows over the other artifacts. + +These words build the dynamic fallback regex only. On the primary TSV path, the type letter `T` is the classifier. + +--- + +## Quality Criteria + +Each criterion adds 1 to the quality score (max 5): + +| Criterion | Check | Gap message if missing | +|---|---|---| +| Substance | Body is ≥10 words describing the conflict | "Tension is too brief — state what disagrees and why both can't stand" | +| Two poles named | `between` references ≥2 distinct artifacts/claims | "A tension needs ≥2 sides — name what is in conflict" | +| Each pole sourced | Each pole in `between` points to a captured artifact, not an unanchored assertion | "Anchor each side to a source — which artifacts contradict?" | +| Genuine opposition | Body shows the poles actually conflict, not two unrelated facts | "Show the opposition — why can't both hold as written?" | +| Closure path | `status` is `resolved:{ref}`, or `open` with what would close it | "How does this close? A Decision, a retraction, or a specific event?" | + +Quality levels: + +| Score | Level | Status | +|---|---|---| +| 5 | strong | recorded | +| 3–4 | adequate | recorded | +| 2 | weak | draft | +| 0–1 | insufficient | draft | + +--- + +## The Detection Pass — How Tensions Get Emitted + +Because a Tension is synthesized by default, it is usually produced by a pass rather than an author. After the assertable artifacts (D, O, L, C, H, E, Open) are typed for a session, the encoder runs one scan across them — and across any cited source documents — and emits a `T` row for each genuine cross-artifact contradiction. Guidance: + +- Emit a Tension only when ≥2 captured artifacts (or an artifact and a cited source) genuinely conflict. Two unrelated facts are not a tension. +- Keep it signal: cap emitted tensions per session and require the opposition and sourced-pole criteria. A detector that flags everything is worse than the prose habit it replaces. +- Mark custody `synthesized`. A Tension an operator asserts in their own voice is authored and sovereign; a Tension the pass infers is advisory and dismissable. +- Bind it to its poles. A Tension is sha-bound to the artifacts in `between`; when any changes, it goes stale and is re-derived. Re-derivation is **not guaranteed identical** — detection is an inference, not a deterministic transform. + +--- + +## What Makes a Good Tension Encoding + +A strong Tension answers four questions: What two (or more) things disagree? Where is each side sourced? Why can't both stand as written? What would resolve it? The most common gap is a single-pole "tension" that is really just an Observation — if there is only one side, it is not a tension. The second most common gap is a vague opposition ("these are in tension") with no statement of why both cannot hold. + +Three senses of "tension" must not be confused. The *quality-attribute tradeoff* (`canon/principles/quality-attributes-are-in-tension`) is one `kind` of Tension. The *challenge-vs-canon contradiction* surfaced by oddkit challenge is the challenge-time sibling. The DOLCHEOT `T` is the **encode-time, within-source** primitive: a contradiction across the captured artifacts. They share machinery; they are not the same artifact. + +A Tension earns its place only if it stays honest about its own confidence: it is a derived guess at a contradiction, valuable precisely because it is cheap to emit and cheap to dismiss. If the detector becomes noise, raise the bar or retract the type (see the vocabulary's retraction conditions). + +--- + +## See Also + +- [DOLCHEOT Vocabulary](klappy://canon/definitions/dolcheo-vocabulary) — the eight-dimension framework this type belongs to; why Tension is core, not a domain extension +- [How to Write an Encoding Type](klappy://odd/encoding-types/how-to-write-encoding-types) — the meta-governance this doc follows +- [Quality Attributes Are In Tension](klappy://canon/principles/quality-attributes-are-in-tension) — the `tradeoff` kind of Tension, as a structural principle +- [Encoding Type: Encode](klappy://odd/encoding-types/encode) — the meta-level letter for encode-action receipts +- [Prompt Over Code](klappy://canon/principles/prompt-over-code) — why this governance doc exists instead of server code