@prefix owl:  <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .
@prefix dct:  <http://purl.org/dc/terms/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xeo:  <https://xeoontology.org/xeo#> .
@prefix xeos: <https://xeoontology.org/schemes#> .

# XEO Reference Schemes — the values, published.
#
# XEO ships CLASSES, never VALUES. xeo:Gap is in the ontology; "thin content" is
# not — xeo:gapType is a skos:Concept slot and the ontology tells you to bring
# your own scheme. That is the right rule for a public standard, and it has a
# consequence: a slot nobody fills gets filled locally, once per consumer, in
# prose. Nine MCP servers describing the same recommendation status five
# different ways is what that looks like.
#
# This module fills the slots. Every scheme here is the vocabulary one agency —
# Inbound Found — actually runs in production, lifted verbatim from the repo named
# in its dct:source, and published under its own namespace (xeos:) so it stays
# separable from the ontology proper. Adopt a scheme as-is, extend it, or replace
# it wholesale: the SLOT is what XEO defines; a scheme is one answer.
#
# Two conventions make these consumable by software rather than only by people:
#   * skos:notation on every concept is the exact string a system stores or sends
#     ('missing_page', 'P0'). It is the code. prefLabel is what an operator reads.
#   * schemes.json is a generated projection of this file (tools/gen_schemes.py):
#     the same schemes as plain JSON, so a Python catalog or a JSON Schema enum
#     can read them at boot without parsing Turtle. Never edit it by hand.
#
# Ordered schemes carry a skos:OrderedCollection; the order is meaningful (a
# lifecycle, a priority ladder, the stated priority of gap types).

xeo:schemes-module a owl:Ontology ;
    dct:title "XEO Reference Schemes" ;
    dct:description "SKOS concept schemes filling the slots the XEO ontology leaves open — gap types, verdicts, priorities, the intervention catalogue, lifecycles, metrics. Published reference values, not part of the ontology's class vocabulary; adopt, extend, or replace." ;
    dct:creator "Inbound Found" ;
    rdfs:seeAlso <https://xeoontology.org/schemes.json> ;
    owl:versionInfo "0.5.0" .

xeo:fillsSlot a owl:AnnotationProperty ;
    rdfs:comment "Names the XEO property whose skos:Concept range (or controlled-string value) this scheme is a reference filling for — xeo:gapType, xeo:atPriority, xeo:inIntervention, xeo:status. A consumer reading a slot property can follow this to a published default; nothing in the ontology requires it." .

# --- Gap types -----------------------------------------------------------------

xeos:gapType a skos:ConceptScheme ;
    skos:prefLabel "Gap types"@en ;
    xeo:fillsSlot xeo:gapType ;
    dct:source "if-control-center packages/contracts/src/gap.ts (GAP_TYPES, GAP_TYPE_LABELS, GAP_TYPE_HINTS) · launch-guardian LG_GAP_TYPES" ;
    dct:description "The kinds of Gap a Diagnostic can reveal, in the priority order the structural comparison states them. Five structural findings, four deep-content axes (a missing FAQ block, a missing spec table, a missing certification and a page written for the wrong buyer stage are four different interventions drawn from different tactic categories), four non-structural findings, and one site-level finding. There is deliberately no backlink value: the referring-domain profile is a separate remit. domain_authority_deficit is not that — it is the finding that the page fight is already winnable and the SITE is what is losing." .

xeos:gapType-missing_page a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "missing_page" ;
    skos:prefLabel "No page for this topic"@en ;
    skos:definition "They hold a page for this topic and we have none"@en .

xeos:gapType-orphaned a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "orphaned" ;
    skos:prefLabel "Orphaned page"@en ;
    skos:definition "Strong content almost nothing links to — a promotion problem, not a content one"@en .

xeos:gapType-buried a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "buried" ;
    skos:prefLabel "Buried in the architecture"@en ;
    skos:definition "Served from too deep in the site against a top-level page"@en .

xeos:gapType-thin_content a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "thin_content" ;
    skos:prefLabel "Thin page"@en ;
    skos:definition "Comparable page, materially less on it"@en .

xeos:gapType-split a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "split" ;
    skos:prefLabel "Split across pages"@en ;
    skos:definition "Several of our pages share this topic and compete with each other"@en .

xeos:gapType-content_subtopic a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "content_subtopic" ;
    skos:prefLabel "Missing subtopic"@en ;
    skos:definition "Questions their page answers and ours does not"@en .

xeos:gapType-content_format_asset a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "content_format_asset" ;
    skos:prefLabel "Missing format asset"@en ;
    skos:definition "Specs, comparison tables, calculators, downloads or schema we lack"@en .

xeos:gapType-content_proof a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "content_proof" ;
    skos:prefLabel "Missing proof"@en ;
    skos:definition "Named projects, data or certifications we do not show"@en .

xeos:gapType-content_intent_fit a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "content_intent_fit" ;
    skos:prefLabel "Buyer-stage mismatch"@en ;
    skos:definition "Theirs is written for a different stage of the buyer journey"@en .

xeos:gapType-visibility_deficit a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "visibility_deficit" ;
    skos:prefLabel "Visibility shortfall"@en ;
    skos:definition "Estimated traffic we are losing on this topic"@en .

xeos:gapType-position_climb a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "position_climb" ;
    skos:prefLabel "Position climb"@en ;
    skos:definition "We already rank here — this is a climb on an asset we own"@en .

xeos:gapType-zero_click a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "zero_click" ;
    skos:prefLabel "Ranking without clicks"@en ;
    skos:definition "On page one, drawing impressions and no clicks — snippet and intent work"@en .

xeos:gapType-project_footprint a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "project_footprint" ;
    skos:prefLabel "Project footprint"@en ;
    skos:definition "They rank for named projects that represent a portfolio asset"@en .

xeos:gapType-domain_authority_deficit a skos:Concept ;
    skos:inScheme xeos:gapType ;
    skos:topConceptOf xeos:gapType ;
    skos:notation "domain_authority_deficit" ;
    skos:prefLabel "Outranked by the site, not the page"@en ;
    skos:definition "Our page holds up, but their domain outranks ours — a satellite, not a page edit"@en .

xeos:gapType-order a skos:OrderedCollection ;
    skos:prefLabel "Gap types (ordered)"@en ;
    skos:inScheme xeos:gapType ;
    skos:memberList ( xeos:gapType-missing_page xeos:gapType-orphaned xeos:gapType-buried xeos:gapType-thin_content xeos:gapType-split xeos:gapType-content_subtopic xeos:gapType-content_format_asset xeos:gapType-content_proof xeos:gapType-content_intent_fit xeos:gapType-visibility_deficit xeos:gapType-position_climb xeos:gapType-zero_click xeos:gapType-project_footprint xeos:gapType-domain_authority_deficit ) .

# --- Gap verdicts --------------------------------------------------------------

xeos:gapVerdict a skos:ConceptScheme ;
    skos:prefLabel "Gap verdicts"@en ;
    xeo:fillsSlot xeo:verdict ;
    dct:source "if-control-center packages/contracts/src/gap.ts (GAP_VERDICTS) · launch-guardian LG_GAP_VERDICTS" ;
    dct:description "A topic's disposition on the scoreboard — the operator-facing decision about a Gap. Carried by exactly one finding per topic per analysis: a verdict is a property of the topic, and a topic's other findings carry none rather than repeating a disposition the analysis did not reach for them." .

xeos:gapVerdict-attack a skos:Concept ;
    skos:inScheme xeos:gapVerdict ;
    skos:topConceptOf xeos:gapVerdict ;
    skos:notation "attack" ;
    skos:prefLabel "Attack"@en ;
    skos:definition "They hold a strong page and we have none or a weak one"@en .

xeos:gapVerdict-fix_first a skos:Concept ;
    skos:inScheme xeos:gapVerdict ;
    skos:topConceptOf xeos:gapVerdict ;
    skos:notation "fix_first" ;
    skos:prefLabel "Fix first"@en ;
    skos:definition "Our content is strong but orphaned, split or buried"@en .

xeos:gapVerdict-defend a skos:Concept ;
    skos:inScheme xeos:gapVerdict ;
    skos:topConceptOf xeos:gapVerdict ;
    skos:notation "defend" ;
    skos:prefLabel "Defend"@en ;
    skos:definition "Comparable, and our own trend is falling"@en .

xeos:gapVerdict-hold a skos:Concept ;
    skos:inScheme xeos:gapVerdict ;
    skos:topConceptOf xeos:gapVerdict ;
    skos:notation "hold" ;
    skos:prefLabel "Hold"@en ;
    skos:definition "Ours is the stronger page"@en .

xeos:gapVerdict-ignore a skos:Concept ;
    skos:inScheme xeos:gapVerdict ;
    skos:topConceptOf xeos:gapVerdict ;
    skos:notation "ignore" ;
    skos:prefLabel "Ignore"@en ;
    skos:definition "Off-ICP or unwinnable"@en .

# --- Magnitude units -----------------------------------------------------------

xeos:magnitudeUnit a skos:ConceptScheme ;
    skos:prefLabel "Magnitude units"@en ;
    xeo:fillsSlot xeo:magnitudeUnit ;
    dct:source "if-control-center packages/contracts/src/gap.ts (MAGNITUDE_UNITS) · launch-guardian LG_MAGNITUDE_UNITS" ;
    dct:description "The unit of a Gap's size, where the finding IS a size. A magnitude is never rendered bare. sessions_estimated names the CTR-model provenance in the unit itself, so a derived session figure can never render as a measured one. referring_domains counts domains pointing at a site and is deliberately a separate unit from inlinks, which counts a crawl's internal links — one unit for both would invite a comparison between them." .

xeos:magnitudeUnit-sessions_estimated a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "sessions_estimated" ;
    skos:prefLabel "Sessions (estimated)"@en ;
    skos:definition "≈{n} sessions/mo, derived by a CTR model — never a measured figure"@en .

xeos:magnitudeUnit-impressions a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "impressions" ;
    skos:prefLabel "Impressions"@en ;
    skos:definition "{n} impressions"@en .

xeos:magnitudeUnit-clicks a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "clicks" ;
    skos:prefLabel "Clicks"@en ;
    skos:definition "{n} clicks"@en .

xeos:magnitudeUnit-inlinks a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "inlinks" ;
    skos:prefLabel "Internal links"@en ;
    skos:definition "{n} internal links, counted by a crawl"@en .

xeos:magnitudeUnit-referring_domains a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "referring_domains" ;
    skos:prefLabel "Referring domains"@en ;
    skos:definition "{n} referring domains pointing at the site"@en .

xeos:magnitudeUnit-words a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "words" ;
    skos:prefLabel "Words"@en ;
    skos:definition "{n} words"@en .

xeos:magnitudeUnit-positions a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "positions" ;
    skos:prefLabel "Positions"@en ;
    skos:definition "{n} positions"@en .

xeos:magnitudeUnit-keywords a skos:Concept ;
    skos:inScheme xeos:magnitudeUnit ;
    skos:topConceptOf xeos:magnitudeUnit ;
    skos:notation "keywords" ;
    skos:prefLabel "Keywords"@en ;
    skos:definition "{n} keywords"@en .

# --- Priority tiers ------------------------------------------------------------

xeos:priority a skos:ConceptScheme ;
    skos:prefLabel "Priority tiers"@en ;
    xeo:fillsSlot xeo:atPriority ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (RECOMMENDATION_PRIORITY_TIERS) · launch-guardian" ;
    dct:description "The priority a Recommendation is issued at. Three tiers, read as a horizon rather than a severity: now, next, later. Where another system speaks critical/high/medium/low, map critical and high to P0, medium to P1, low to P2 — the mapping is documented here so it is not re-decided per consumer." .

xeos:priority-P0 a skos:Concept ;
    skos:inScheme xeos:priority ;
    skos:topConceptOf xeos:priority ;
    skos:notation "P0" ;
    skos:prefLabel "Now"@en ;
    skos:definition "Do this in the current cycle"@en .

xeos:priority-P1 a skos:Concept ;
    skos:inScheme xeos:priority ;
    skos:topConceptOf xeos:priority ;
    skos:notation "P1" ;
    skos:prefLabel "Next"@en ;
    skos:definition "Queued behind the current cycle"@en .

xeos:priority-P2 a skos:Concept ;
    skos:inScheme xeos:priority ;
    skos:topConceptOf xeos:priority ;
    skos:notation "P2" ;
    skos:prefLabel "Later"@en ;
    skos:definition "Worth doing; not yet scheduled"@en .

xeos:priority-order a skos:OrderedCollection ;
    skos:prefLabel "Priority tiers (ordered)"@en ;
    skos:inScheme xeos:priority ;
    skos:memberList ( xeos:priority-P0 xeos:priority-P1 xeos:priority-P2 ) .

# --- Interventions — the service catalogue -------------------------------------

xeos:intervention a skos:ConceptScheme ;
    skos:prefLabel "Interventions — the service catalogue"@en ;
    xeo:fillsSlot xeo:inIntervention ;
    dct:source "xeo-graph-kit seed/framework.cypher (InterventionType) · if-event-ledger tactic_category (numeric codes, served by the ledger's catalog endpoint)" ;
    dct:description "The categories of work an agency can deploy — its service catalogue, as XEO's Intervention taxonomy. A Tactic is inIntervention exactly one of these; a Project's contract scope is expressed over them. Each carries who controls the work (agency, client, or the community) and a typical lead time, because both decide whether a recommendation is deliverable or advisory. The experiment ledger keys the same categories by numeric code; that crosswalk is the ledger's own catalogue, not restated here." .

xeos:intervention-editorial-placement a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "editorial-placement" ;
    skos:prefLabel "Third-party editorial placement"@en ;
    skos:definition "Earned media: a placement on a third-party editorial surface"@en ;
    skos:note "category earned media · controlled by agency · lead time 2–4 weeks"@en .

xeos:intervention-local-placement a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "local-placement" ;
    skos:prefLabel "Local / community placement"@en ;
    skos:definition "Earned media: a placement on a local or community surface"@en ;
    skos:note "category earned media · controlled by agency · lead time 2–4 weeks"@en .

xeos:intervention-owned-content-creation a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "owned-content-creation" ;
    skos:prefLabel "Owned content creation"@en ;
    skos:definition "New pages or assets on the client's own site"@en ;
    skos:note "category content creation · controlled by agency · lead time 4–8 weeks"@en .

xeos:intervention-content-optimization a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "content-optimization" ;
    skos:prefLabel "Content optimization / refresh"@en ;
    skos:definition "Revising pages the client already holds"@en ;
    skos:note "category content optimization · controlled by agency · lead time 1–2 weeks"@en .

xeos:intervention-technical-onsite a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "technical-onsite" ;
    skos:prefLabel "Technical onsite work"@en ;
    skos:definition "Site infrastructure, rendering, schema, performance — executed by the client's engineers"@en ;
    skos:note "category consulting · controlled by client · lead time variable"@en .

xeos:intervention-onsite-content-advisory a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "onsite-content-advisory" ;
    skos:prefLabel "Onsite content advisory"@en ;
    skos:definition "Content direction the client's own team executes"@en ;
    skos:note "category consulting · controlled by client · lead time variable"@en .

xeos:intervention-brand-entity-ops a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "brand-entity-ops" ;
    skos:prefLabel "Brand / entity operations"@en ;
    skos:definition "Entity truth, author entities, brand accuracy across the web"@en ;
    skos:note "category consulting · controlled by client · lead time variable"@en .

xeos:intervention-community-mobilization a skos:Concept , xeo:Intervention ;
    skos:inScheme xeos:intervention ;
    skos:topConceptOf xeos:intervention ;
    skos:notation "community-mobilization" ;
    skos:prefLabel "Community mobilization"@en ;
    skos:definition "The floor beneath the floor — only works if the counter-narrative already exists unprompted"@en ;
    skos:note "category community · controlled by community · lead time 8+ weeks"@en .

# --- Recommendation execution lifecycle ----------------------------------------

xeos:recommendationStatus a skos:ConceptScheme ;
    skos:prefLabel "Recommendation execution lifecycle"@en ;
    xeo:fillsSlot xeo:status ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (RECOMMENDATION_STATUSES) · launch-guardian LG_RECOMMENDATION_STATUSES" ;
    dct:description "The execution lifecycle of a Recommendation, as xeo:status on that node. pending, in_progress and blocked are the OPEN states — they still consume an engagement's intervention quota. The delivery board buckets these five into recommended / active / blocked / measuring / completed, where measuring is a completed recommendation still inside its results window; that bucketing is a derived view, not a second vocabulary. A system with a skipped state maps it to cancelled." .

xeos:recommendationStatus-pending a skos:Concept ;
    skos:inScheme xeos:recommendationStatus ;
    skos:topConceptOf xeos:recommendationStatus ;
    skos:notation "pending" ;
    skos:prefLabel "Proposed"@en ;
    skos:definition "Issued and not yet started; counts as open work"@en .

xeos:recommendationStatus-in_progress a skos:Concept ;
    skos:inScheme xeos:recommendationStatus ;
    skos:topConceptOf xeos:recommendationStatus ;
    skos:notation "in_progress" ;
    skos:prefLabel "In progress"@en ;
    skos:definition "Being executed; counts as open work"@en .

xeos:recommendationStatus-blocked a skos:Concept ;
    skos:inScheme xeos:recommendationStatus ;
    skos:topConceptOf xeos:recommendationStatus ;
    skos:notation "blocked" ;
    skos:prefLabel "Blocked"@en ;
    skos:definition "Cannot proceed — a dependency, an approval, or a client direction; still counts as open work"@en .

xeos:recommendationStatus-cancelled a skos:Concept ;
    skos:inScheme xeos:recommendationStatus ;
    skos:topConceptOf xeos:recommendationStatus ;
    skos:notation "cancelled" ;
    skos:prefLabel "Cancelled"@en ;
    skos:definition "Withdrawn with a recorded reason; never silently dropped"@en .

xeos:recommendationStatus-completed a skos:Concept ;
    skos:inScheme xeos:recommendationStatus ;
    skos:topConceptOf xeos:recommendationStatus ;
    skos:notation "completed" ;
    skos:prefLabel "Done"@en ;
    skos:definition "Shipped; measuring until its results window closes"@en .

xeos:recommendationStatus-order a skos:OrderedCollection ;
    skos:prefLabel "Recommendation execution lifecycle (ordered)"@en ;
    skos:inScheme xeos:recommendationStatus ;
    skos:memberList ( xeos:recommendationStatus-pending xeos:recommendationStatus-in_progress xeos:recommendationStatus-blocked xeos:recommendationStatus-cancelled xeos:recommendationStatus-completed ) .

# --- Effort estimates ----------------------------------------------------------

xeos:effort a skos:ConceptScheme ;
    skos:prefLabel "Effort estimates"@en ;
    xeo:fillsSlot xeo:effortEstimate ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (RECOMMENDATION_EFFORTS)" ;
    dct:description "How long a Recommendation is expected to take to execute — a categorical horizon, not a score. Scored dimensions (impact, risk, time-to-value) belong on a TacticAssessment via onDimension; this is the delivery-side estimate an operator plans a cycle around." .

xeos:effort-hours a skos:Concept ;
    skos:inScheme xeos:effort ;
    skos:topConceptOf xeos:effort ;
    skos:notation "hours" ;
    skos:prefLabel "Hours"@en ;
    skos:definition "Done inside a working day"@en .

xeos:effort-days a skos:Concept ;
    skos:inScheme xeos:effort ;
    skos:topConceptOf xeos:effort ;
    skos:notation "days" ;
    skos:prefLabel "A day or two"@en ;
    skos:definition "A short, bounded piece of work"@en .

xeos:effort-weeks a skos:Concept ;
    skos:inScheme xeos:effort ;
    skos:topConceptOf xeos:effort ;
    skos:notation "weeks" ;
    skos:prefLabel "Weeks"@en ;
    skos:definition "A multi-week deliverable"@en .

xeos:effort-quarter a skos:Concept ;
    skos:inScheme xeos:effort ;
    skos:topConceptOf xeos:effort ;
    skos:notation "quarter" ;
    skos:prefLabel "A quarter"@en ;
    skos:definition "A programme, not a task"@en .

xeos:effort-order a skos:OrderedCollection ;
    skos:prefLabel "Effort estimates (ordered)"@en ;
    skos:inScheme xeos:effort ;
    skos:memberList ( xeos:effort-hours xeos:effort-days xeos:effort-weeks xeos:effort-quarter ) .

# --- Who executes --------------------------------------------------------------

xeos:execution a skos:ConceptScheme ;
    skos:prefLabel "Who executes"@en ;
    xeo:fillsSlot xeo:execution ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (RECOMMENDATION_EXECUTIONS)" ;
    dct:description "Who does the work a Recommendation calls for. ours spends the engagement's intervention allowance; advised does not, because advisory work is not agency capacity. This is the delivery-side half of the scope gate: requiresCapability says whether the work is possible, execution says whose hours it costs." .

xeos:execution-ours a skos:Concept ;
    skos:inScheme xeos:execution ;
    skos:topConceptOf xeos:execution ;
    skos:notation "ours" ;
    skos:prefLabel "We do it"@en ;
    skos:definition "Spends the engagement allowance"@en .

xeos:execution-advised a skos:Concept ;
    skos:inScheme xeos:execution ;
    skos:topConceptOf xeos:execution ;
    skos:notation "advised" ;
    skos:prefLabel "Client does it"@en ;
    skos:definition "Advisory — outside the allowance; the client executes"@en .

# --- What a Practice did -------------------------------------------------------

xeos:practiceOutcome a skos:ConceptScheme ;
    skos:prefLabel "What a Practice did"@en ;
    xeo:fillsSlot xeo:practiceOutcome ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (PRACTICE_OUTCOMES) · launch-guardian LG_PRACTICE_OUTCOMES" ;
    dct:description "What a Practice did to a candidate when it fired — the value carried on the appliedPractice audit edge. One outcome per practiceKind: a guardrail vetoes, a preference reranks, guidance caveats." .

xeos:practiceOutcome-vetoed a skos:Concept ;
    skos:inScheme xeos:practiceOutcome ;
    skos:topConceptOf xeos:practiceOutcome ;
    skos:notation "vetoed" ;
    skos:prefLabel "Blocked"@en ;
    skos:definition "A guardrail removed the candidate"@en .

xeos:practiceOutcome-reranked a skos:Concept ;
    skos:inScheme xeos:practiceOutcome ;
    skos:topConceptOf xeos:practiceOutcome ;
    skos:notation "reranked" ;
    skos:prefLabel "Reordered"@en ;
    skos:definition "A preference moved the candidate up or down"@en .

xeos:practiceOutcome-caveated a skos:Concept ;
    skos:inScheme xeos:practiceOutcome ;
    skos:topConceptOf xeos:practiceOutcome ;
    skos:notation "caveated" ;
    skos:prefLabel "Flagged"@en ;
    skos:definition "Guidance attached a caveat and changed nothing else"@en .

# --- Practice kinds ------------------------------------------------------------

xeos:practiceKind a skos:ConceptScheme ;
    skos:prefLabel "Practice kinds"@en ;
    xeo:fillsSlot xeo:practiceKind ;
    dct:source "xeo-strategy.ttl (xeo:practiceKind) · if-control-center PRACTICE_KINDS" ;
    dct:description "How a Practice acts on a candidate recommendation. Kept as a small controlled value rather than a subclass." .

xeos:practiceKind-guardrail a skos:Concept ;
    skos:inScheme xeos:practiceKind ;
    skos:topConceptOf xeos:practiceKind ;
    skos:notation "guardrail" ;
    skos:prefLabel "Guardrail"@en ;
    skos:definition "Veto a matching candidate"@en .

xeos:practiceKind-preference a skos:Concept ;
    skos:inScheme xeos:practiceKind ;
    skos:topConceptOf xeos:practiceKind ;
    skos:notation "preference" ;
    skos:prefLabel "Preference"@en ;
    skos:definition "Reorder a matching candidate"@en .

xeos:practiceKind-guidance a skos:Concept ;
    skos:inScheme xeos:practiceKind ;
    skos:topConceptOf xeos:practiceKind ;
    skos:notation "guidance" ;
    skos:prefLabel "Guidance"@en ;
    skos:definition "Attach a caveat; change nothing"@en .

# --- Practice provenance -------------------------------------------------------

xeos:practiceSource a skos:ConceptScheme ;
    skos:prefLabel "Practice provenance"@en ;
    xeo:fillsSlot xeo:source ;
    dct:source "xeo-strategy.ttl (xeo:source, on a Practice) · if-control-center PRACTICE_SOURCES" ;
    dct:description "Where a Practice came from — the confidence ratchet. authored stands on a human's authority; claimed ships low-confidence with a halfLife and decays unless experiments promote it; learned is earned from the experiment ledger, and its confidence ratchets with Outcomes. One class holds a firm SOP and a fragile claim without conflating their trust." .

xeos:practiceSource-authored a skos:Concept ;
    skos:inScheme xeos:practiceSource ;
    skos:topConceptOf xeos:practiceSource ;
    skos:notation "authored" ;
    skos:prefLabel "Authored"@en ;
    skos:definition "A human SOP or best-practice — high standing, durable"@en .

xeos:practiceSource-learned a skos:Concept ;
    skos:inScheme xeos:practiceSource ;
    skos:topConceptOf xeos:practiceSource ;
    skos:notation "learned" ;
    skos:prefLabel "Learned"@en ;
    skos:definition "Earned from the experiment ledger; confidence ratchets with Outcomes"@en .

xeos:practiceSource-claimed a skos:Concept ;
    skos:inScheme xeos:practiceSource ;
    skos:topConceptOf xeos:practiceSource ;
    skos:notation "claimed" ;
    skos:prefLabel "Claimed"@en ;
    skos:definition "An unproven assertion — ships low-confidence, decays over its halfLife unless promoted"@en .

# --- Practice lifecycle --------------------------------------------------------

xeos:practiceStatus a skos:ConceptScheme ;
    skos:prefLabel "Practice lifecycle"@en ;
    xeo:fillsSlot xeo:status ;
    dct:source "xeo-strategy.ttl (xeo:status, on a Practice) · if-control-center PRACTICE_STATUSES" ;
    dct:description "Lifecycle of a Practice, as xeo:status on that node. A proposed Practice is visible but does not fire; superseding one deprecates it — retired, never deleted, so the record of what it vetoed survives." .

xeos:practiceStatus-proposed a skos:Concept ;
    skos:inScheme xeos:practiceStatus ;
    skos:topConceptOf xeos:practiceStatus ;
    skos:notation "proposed" ;
    skos:prefLabel "Proposed"@en ;
    skos:definition "Visible; does not fire"@en .

xeos:practiceStatus-active a skos:Concept ;
    skos:inScheme xeos:practiceStatus ;
    skos:topConceptOf xeos:practiceStatus ;
    skos:notation "active" ;
    skos:prefLabel "Active"@en ;
    skos:definition "Fires on matching candidates"@en .

xeos:practiceStatus-deprecated a skos:Concept ;
    skos:inScheme xeos:practiceStatus ;
    skos:topConceptOf xeos:practiceStatus ;
    skos:notation "deprecated" ;
    skos:prefLabel "Deprecated"@en ;
    skos:definition "Superseded; retained for the audit trail"@en .

xeos:practiceStatus-order a skos:OrderedCollection ;
    skos:prefLabel "Practice lifecycle (ordered)"@en ;
    skos:inScheme xeos:practiceStatus ;
    skos:memberList ( xeos:practiceStatus-proposed xeos:practiceStatus-active xeos:practiceStatus-deprecated ) .

# --- Experiment lifecycle ------------------------------------------------------

xeos:experimentStatus a skos:ConceptScheme ;
    skos:prefLabel "Experiment lifecycle"@en ;
    xeo:fillsSlot xeo:status ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (EXPERIMENT_STATUSES)" ;
    dct:description "Lifecycle of an Experiment, as xeo:status on that node. unmeasurable covers two arrivals with one word — an operator cleared the measured set, or the website has no search-performance history to measure against; the record says which." .

xeos:experimentStatus-measuring a skos:Concept ;
    skos:inScheme xeos:experimentStatus ;
    skos:topConceptOf xeos:experimentStatus ;
    skos:notation "measuring" ;
    skos:prefLabel "Measuring"@en ;
    skos:definition "Inside its results window; observations still arriving"@en .

xeos:experimentStatus-concluded a skos:Concept ;
    skos:inScheme xeos:experimentStatus ;
    skos:topConceptOf xeos:experimentStatus ;
    skos:notation "concluded" ;
    skos:prefLabel "Concluded"@en ;
    skos:definition "Window closed; an Outcome is recorded and immutable"@en .

xeos:experimentStatus-cancelled a skos:Concept ;
    skos:inScheme xeos:experimentStatus ;
    skos:topConceptOf xeos:experimentStatus ;
    skos:notation "cancelled" ;
    skos:prefLabel "Cancelled"@en ;
    skos:definition "Stopped before conclusion, with a reason"@en .

xeos:experimentStatus-unmeasurable a skos:Concept ;
    skos:inScheme xeos:experimentStatus ;
    skos:topConceptOf xeos:experimentStatus ;
    skos:notation "unmeasurable" ;
    skos:prefLabel "Not measurable"@en ;
    skos:definition "No usable baseline or observation stream"@en .

xeos:experimentStatus-order a skos:OrderedCollection ;
    skos:prefLabel "Experiment lifecycle (ordered)"@en ;
    skos:inScheme xeos:experimentStatus ;
    skos:memberList ( xeos:experimentStatus-measuring xeos:experimentStatus-concluded xeos:experimentStatus-cancelled xeos:experimentStatus-unmeasurable ) .

# --- Outcome results -----------------------------------------------------------

xeos:outcomeResult a skos:ConceptScheme ;
    skos:prefLabel "Outcome results"@en ;
    xeo:fillsSlot xeo:result ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (OUTCOME_RESULTS)" ;
    dct:description "Whether an Outcome moved. A regression IS significant: result answers did this move, and the lift's sign answers which way. The labels must not smuggle a direction in." .

xeos:outcomeResult-significant a skos:Concept ;
    skos:inScheme xeos:outcomeResult ;
    skos:topConceptOf xeos:outcomeResult ;
    skos:notation "significant" ;
    skos:prefLabel "Moved"@en ;
    skos:definition "The measured change clears the significance bar, in either direction"@en .

xeos:outcomeResult-no_change a skos:Concept ;
    skos:inScheme xeos:outcomeResult ;
    skos:topConceptOf xeos:outcomeResult ;
    skos:notation "no_change" ;
    skos:prefLabel "No change"@en ;
    skos:definition "Measured, and it did not move"@en .

xeos:outcomeResult-inconclusive a skos:Concept ;
    skos:inScheme xeos:outcomeResult ;
    skos:topConceptOf xeos:outcomeResult ;
    skos:notation "inconclusive" ;
    skos:prefLabel "Inconclusive"@en ;
    skos:definition "Could not be judged — see resultReason"@en .

# --- Why an outcome was inconclusive -------------------------------------------

xeos:outcomeResultReason a skos:ConceptScheme ;
    skos:prefLabel "Why an outcome was inconclusive"@en ;
    xeo:fillsSlot xeo:resultReason ;
    dct:source "if-control-center packages/contracts/src/recommendation.ts (OUTCOME_RESULT_REASONS)" ;
    dct:description "Why an Outcome could not be read cleanly. The two confounder reasons read differently on purpose: co_intervention keeps its lift and names the rows it shares attribution with; confounded_external records none. below_volume_floor and no_page_data are not the same sentence — the second asserts an absence, the first says there is data and not yet enough of it." .

xeos:outcomeResultReason-no_qualifying_snapshot a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "no_qualifying_snapshot" ;
    skos:prefLabel "Waiting on a reading"@en ;
    skos:definition "No qualifying rank snapshot has arrived yet"@en .

xeos:outcomeResultReason-window_incomplete a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "window_incomplete" ;
    skos:prefLabel "Window still filling"@en ;
    skos:definition "The results window has not closed"@en .

xeos:outcomeResultReason-co_intervention a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "co_intervention" ;
    skos:prefLabel "Shared with other work of ours"@en ;
    skos:definition "Another of our interventions touched the same pages in the window; lift is kept and attribution is shared"@en .

xeos:outcomeResultReason-confounded_external a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "confounded_external" ;
    skos:prefLabel "Something outside our work changed the page"@en ;
    skos:definition "An external event confounds the window; no lift is recorded"@en .

xeos:outcomeResultReason-baseline_unavailable a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "baseline_unavailable" ;
    skos:prefLabel "No search history before this shipped"@en ;
    skos:definition "Nothing to compare against"@en .

xeos:outcomeResultReason-no_page_data a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "no_page_data" ;
    skos:prefLabel "No search data for this page"@en ;
    skos:definition "A complete window with no rows at all on the address"@en .

xeos:outcomeResultReason-below_volume_floor a skos:Concept ;
    skos:inScheme xeos:outcomeResultReason ;
    skos:topConceptOf xeos:outcomeResultReason ;
    skos:notation "below_volume_floor" ;
    skos:prefLabel "Not enough traffic to judge"@en ;
    skos:definition "The page has data, and not yet enough for a percentage to mean anything"@en .

# --- Objective metrics ---------------------------------------------------------

xeos:objectiveMetric a skos:ConceptScheme ;
    skos:prefLabel "Objective metrics"@en ;
    xeo:fillsSlot xeo:metric ;
    dct:source "if-control-center packages/contracts/src/objective-metric.ts (OBJECTIVE_METRICS, METRIC_DIRECTIONS, METRIC_UNIT_OF) · launch-guardian LG_OBJECTIVE_METRICS" ;
    dct:description "The metrics a MetricTarget can be set on. Half the vocabulary is lower-is-better — position and rank_absolute are 1-based ranks — so a target's direction is DERIVED from the metric, never client input; a shared +20% across metrics would silently ask for a rank 20% worse. The note on each concept records direction and unit." .

xeos:objectiveMetric-clicks a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "clicks" ;
    skos:prefLabel "Clicks"@en ;
    skos:definition "Search clicks over the window"@en ;
    skos:note "direction up · unit count · source GSC"@en .

xeos:objectiveMetric-impressions a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "impressions" ;
    skos:prefLabel "Impressions"@en ;
    skos:definition "Search impressions over the window"@en ;
    skos:note "direction up · unit count · source GSC"@en .

xeos:objectiveMetric-ctr a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "ctr" ;
    skos:prefLabel "CTR"@en ;
    skos:definition "Clickthrough rate over the window"@en ;
    skos:note "direction up · unit percent · source GSC"@en .

xeos:objectiveMetric-position a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "position" ;
    skos:prefLabel "Avg position"@en ;
    skos:definition "Average SERP position over the window"@en ;
    skos:note "direction down · unit rank · source GSC"@en .

xeos:objectiveMetric-rank_absolute a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "rank_absolute" ;
    skos:prefLabel "Rank"@en ;
    skos:definition "Absolute rank from a rank tracker"@en ;
    skos:note "direction down · unit rank · source DataForSEO"@en .

xeos:objectiveMetric-etv a skos:Concept ;
    skos:inScheme xeos:objectiveMetric ;
    skos:topConceptOf xeos:objectiveMetric ;
    skos:notation "etv" ;
    skos:prefLabel "Est. traffic value"@en ;
    skos:definition "Estimated traffic value"@en ;
    skos:note "direction up · unit currency · source DataForSEO"@en .

# --- Engagement types ----------------------------------------------------------

xeos:engagementType a skos:ConceptScheme ;
    skos:prefLabel "Engagement types"@en ;
    xeo:fillsSlot xeo:engagementType ;
    dct:source "if-control-center packages/contracts/src/objective-metric.ts (ENGAGEMENT_TYPES) · launch-guardian LG_ENGAGEMENT_TYPES" ;
    dct:description "The shape of a Project's contract — the discriminator for how its scope is expressed. A retainer caps interventions per recurring period (cadence); a one-off caps them over a fixed run (durationDays). The intervention quota is common to both and always required: a scope of work with no ceiling is not a scope." .

xeos:engagementType-retainer a skos:Concept ;
    skos:inScheme xeos:engagementType ;
    skos:topConceptOf xeos:engagementType ;
    skos:notation "retainer" ;
    skos:prefLabel "Retainer"@en ;
    skos:definition "Recurring; the quota resets every cadence period"@en .

xeos:engagementType-oneoff a skos:Concept ;
    skos:inScheme xeos:engagementType ;
    skos:topConceptOf xeos:engagementType ;
    skos:notation "oneoff" ;
    skos:prefLabel "One-off"@en ;
    skos:definition "Fixed run; the quota covers durationDays"@en .

# --- Retainer cadences ---------------------------------------------------------

xeos:cadence a skos:ConceptScheme ;
    skos:prefLabel "Retainer cadences"@en ;
    xeo:fillsSlot xeo:cadence ;
    dct:source "if-control-center packages/contracts/src/objective-metric.ts (PROJECT_CADENCES) · launch-guardian LG_PROJECT_CADENCES" ;
    dct:description "The recurring period a retainer's intervention quota resets over. Applies to retainer Projects only." .

xeos:cadence-monthly a skos:Concept ;
    skos:inScheme xeos:cadence ;
    skos:topConceptOf xeos:cadence ;
    skos:notation "monthly" ;
    skos:prefLabel "Monthly"@en ;
    skos:definition "Quota resets each month"@en .

xeos:cadence-quarterly a skos:Concept ;
    skos:inScheme xeos:cadence ;
    skos:topConceptOf xeos:cadence ;
    skos:notation "quarterly" ;
    skos:prefLabel "Quarterly"@en ;
    skos:definition "Quota resets each quarter"@en .

xeos:cadence-order a skos:OrderedCollection ;
    skos:prefLabel "Retainer cadences (ordered)"@en ;
    skos:inScheme xeos:cadence ;
    skos:memberList ( xeos:cadence-monthly xeos:cadence-quarterly ) .

# --- Target kinds --------------------------------------------------------------

xeos:targetKind a skos:ConceptScheme ;
    skos:prefLabel "Target kinds"@en ;
    xeo:fillsSlot xeo:targetKind ;
    dct:source "if-control-center packages/contracts/src/objective-metric.ts (OBJECTIVE_TARGET_KINDS) · launch-guardian LG_OBJECTIVE_TARGET_KINDS" ;
    dct:description "How a MetricTarget's targetValue is read: as an absolute value of the metric, or as a percent change from the captured baseline." .

xeos:targetKind-absolute a skos:Concept ;
    skos:inScheme xeos:targetKind ;
    skos:topConceptOf xeos:targetKind ;
    skos:notation "absolute" ;
    skos:prefLabel "Absolute"@en ;
    skos:definition "targetValue is a value of the metric itself"@en .

xeos:targetKind-percent a skos:Concept ;
    skos:inScheme xeos:targetKind ;
    skos:topConceptOf xeos:targetKind ;
    skos:notation "percent" ;
    skos:prefLabel "Percent lift"@en ;
    skos:definition "targetValue is a relative change from baseline, in the metric's better direction"@en .

# --- Epistemic layers ----------------------------------------------------------

xeos:epistemicLayer a skos:ConceptScheme ;
    skos:prefLabel "Epistemic layers"@en ;
    xeo:fillsSlot xeo:epistemicLayer ;
    dct:source "xeo-core.ttl (xeo:epistemicLayer)" ;
    dct:description "The six kinds of claim an XEO term can make, in order from bedrock to governance. The annotation property types TERMS; publishing the six here as a scheme gives a consumer tagging INSTANCES the same six values under one IRI each. Whether XEO itself should own an instance-level layer property is a separate decision this scheme does not make." .

xeos:epistemicLayer-entity a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "entity" ;
    skos:prefLabel "Entity"@en ;
    skos:definition "A durable identity — a website, a page, a term, a brand"@en .

xeos:epistemicLayer-episode a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "episode" ;
    skos:prefLabel "Episode"@en ;
    skos:definition "Something that happened at a time; immutable once finished — a crawl, a captured response, an experiment"@en .

xeos:epistemicLayer-observation a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "observation" ;
    skos:prefLabel "Observation"@en ;
    skos:definition "A measured fact, grounded in a standard or an API contract"@en .

xeos:epistemicLayer-derivation a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "derivation" ;
    skos:prefLabel "Derivation"@en ;
    skos:definition "Model or algorithm output; carries method, model and confidence"@en .

xeos:epistemicLayer-interpretation a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "interpretation" ;
    skos:prefLabel "Interpretation"@en ;
    skos:definition "A labeled claim — a diagnosed gap, a recommendation, an objective"@en .

xeos:epistemicLayer-norm a skos:Concept ;
    skos:inScheme xeos:epistemicLayer ;
    skos:topConceptOf xeos:epistemicLayer ;
    skos:notation "norm" ;
    skos:prefLabel "Norm"@en ;
    skos:definition "A standing rule about a class of cases — a Practice"@en .

xeos:epistemicLayer-order a skos:OrderedCollection ;
    skos:prefLabel "Epistemic layers (ordered)"@en ;
    skos:inScheme xeos:epistemicLayer ;
    skos:memberList ( xeos:epistemicLayer-entity xeos:epistemicLayer-episode xeos:epistemicLayer-observation xeos:epistemicLayer-derivation xeos:epistemicLayer-interpretation xeos:epistemicLayer-norm ) .
