Positioning as a Four-Element Framework — Orthogonal Axes (Qué / Para-Quién / Cómo) Bound by a Proof Seam with Self-Applied Coherence Rules

Accepted

ontoref
ADR-035 established the positioning layer as a queryable protocol surface, but

Context

ADR-035 established the positioning layer as a queryable protocol surface, but its schema entangled the axes of positioning: `ValueProp` carried the value difference inline (`unique_angle`), the target (`audience_ids`) and the backing (`evidence_adrs`) all in one record, and `Campaign` was the only model of outward action. There was no first-class home for "what is our differential value", competitors lived only as prose strings inside `ValueProp.alternatives`, difusión collapsed onto "campaign" (a website is difusión but not a campaign), and there was no model of validation — the success cases where all of it converges and becomes credible.

Working through the positioning of ontoref against Knowledge-Graph competitors surfaced that positioning has three orthogonal concerns — the same orthogonality ADR-009 already established for manifest self-interrogation (capabilities answer "what / why / how" as three orthogonal axes): WHAT (what differential value), FOR WHOM (which audience), HOW (how we diffuse). They are orthogonal much of the time and cross only at named seams. A fourth element — VALIDATION — is not a fourth axis but the seam (seam) that binds the other three and keeps them credible: a success case is the convergence of a differentiator, an audience and a difusión mechanism, signed by a real outcome.

The load-bearing risk is formalization-vs-adoption: adding four typed kinds and a coherence audit to the marketing surface could impose ceremony before value. The framing that resolves it is ADR-029 (tier-orthogonal, opt-in) plus all-defaulted fields: a project that writes zero differentiators pays zero adoption cost, and existing positioning files validate unchanged.

Decision

Model the positioning layer as four elements. Three orthogonal axes, each a first-class typed kind, bound by a Proof seam:

WHAT — `Differentiator` (one file per area of differential value) + `Competitor` (what they do / how ontoref differs). FOR WHOM — `Audience` (gains `status`: Hypothesis until a Proof references it). HOW — `DifusionMechanism` (kind: Web | DocsSite | McpServer | Repo | Content | Talk | Event; persistent vs event). Difusión is the category; `Campaign` is ONE time-boxed coordination within it. VALIDATION — `Proof`: the seam. `converges = { differentiator_ids, audience_ids, mechanism_ids }` — references the other three; nothing references Proof. A Proof is the triple convergence signed by a real outcome.

The crossings are explicit: `ValueProp` is the WHAT×WHOM seam (gains `differentiator_ids`); `Campaign` and `Proof` bind HOW and VALIDATION.

The marketing surface is governed by the same mechanism it sells. Five coherence rules run in `ontoref positioning audit` (local-first, daemon-independent):

1. AnchorDrift — a differentiator/proof evidence_adr must be Accepted. 2. UnprovenValidatedAudience — an Audience marked 'Validated needs >=1 Proof. 3. Live value-prop — must converge four elements (differentiator + audience + a difundiendo mechanism + a proven diff). 4. DanglingRef — a Proof's converges ids must all resolve. 5. CoverageGap (warn) — a differentiator with no Proof is an explicit reminder, never a silent gap.

ADR-drift severity is gated by value-prop status: a Draft claim citing a Proposed/Missing ADR is work-in-progress (informational, non-blocking); only Validated/Live claims must cite Accepted ADRs — mirroring the `_live_requires_evidence_adrs` contract. Coverage warnings never fail CI.

Constraints

  • Hard The positioning schema MUST keep WHAT (Differentiator), FOR WHOM (Audience) and HOW (DifusionMechanism) as separate typed kinds. Cross-axis binding MUST happen only through the seam kinds (ValueProp for what×whom; Campaign and Proof). Collapsing an axis back into another kind is forbidden.
  • Hard Proof MUST reference the other three axes (converges.differentiator_ids, audience_ids, mechanism_ids each non-empty) and MUST NOT be referenced by any other kind. The make_proof contract (`_proof_converges_all`) enforces the triple convergence.
  • Hard Every Differentiator MUST cite >=1 ontology node and >=1 evidence ADR, and name >=1 competitor category it beats (`vs`). The make_differentiator contracts (`_diff_requires_anchor`, `_diff_requires_vs`) enforce this.
  • Hard `ontoref positioning audit` MUST run the five coherence rules over the positioning layer and gate CI by value-prop status: hard ADR-drift on Validated/Live value-props and any coherence violation fail; Draft drift and coverage gaps are informational.
  • Soft A value-prop with status 'Live MUST bind >=1 differentiator (the WHAT axis); the `_live_requires_differentiator` contract enforces the local half, and the audit enforces the rest (a difundiendo mechanism and a proven differentiator).

Alternatives considered

  • Keep the entangled ValueProp model — value difference stays inline in unique_anglerejected: Entangling what (value), for-whom (audience) and backing in one record means any change to the differentiation story churns every claim, and competitors/differentiators are never queryable on their own. Orthogonal axes with a ValueProp seam keep each concern independently evolvable.
  • Competitors and validation as Markdown narratives, no typed kindsrejected: Markdown is not queryable and cannot be drift-checked. ADR-035's whole thesis is marketing-as-typed-protocol-surface; competitors and proofs belong as typed NCL with cross-references, not as prose the audit cannot see.
  • Validación as a fourth orthogonal axis (a fourth folder co-equal to the three)rejected: Validation is not parallel to what/for-whom/how — it is where they converge and get signed. Modeling it as a fourth axis implies a false fourth pole; modeling it as the Proof seam (references the three, referenced by none) is faithful to witness-as-axis-seam (ADR-031).
  • Fail CI on any ADR-drift regardless of value-prop statusrejected: A Draft claim citing a Proposed ADR is legitimate work-in-progress; hard-failing it forces deleting true citations or fabricating ratification. Gating severity by status keeps the hard gate on Live/Validated claims where _live_requires_evidence_adrs already places it.

Anti-patterns

  • Collapsing an Axis Back into Another Kind — A contributor inlines the value difference back into ValueProp.unique_angle, or folds competitors into alternatives[] strings, instead of using the Differentiator/Competitor kinds. The axes re-entangle and stop being independently queryable.
  • A Proof That Does Not Converge Three Axes — A success case is written as a testimonial that names an outcome but does not reference a differentiator, an audience and a mechanism. It is no longer the seam — it is unanchored marketing the audit cannot trace to the model.
  • Asserting a Validated Audience Without a Proof — An Audience is marked status='Validated to look credible, but no Proof references it. The validation is asserted, not earned — the exact failure mode the framework exists to prevent.
  • Routing Marketing Through Untyped Prose to Skip the Audit — A claim is published on the website or docs without a corresponding typed Live value-prop, so it escapes the coherence audit and can drift freely — re-introducing the prose-that-rots failure ADR-035 closed.

Related ADRs

ADR-035 · ADR-031 · ADR-009 · ADR-029 · ADR-012

Was this useful? Rate it
Got something to add? Tell me what you think, what you'd suggest, or whether we should keep exploring this topic.
· reads

We use cookies to help this site function, understand service usage, and support marketing efforts. Cookie Policy for more info.