Gå til hovedinnhold

Content context lab

Different readers.
The same service facts.

Explore how shared constraints survive audience-specific presentation. Inspect the recorded checks, their provenance and the limits of what they establish.

One profile · four reading situations

Change the audience. Keep the constraint.

Recorded playback
Paragraph

Child: Reading with a trusted adult. Familiar words and one step at a time.

Child, Violation. 1 constraint findings. Exit 3.

Recorded input

Talk to us on a screen

A prohibited assurance is inserted into the same file.

A video appointment is risk-free.

site/locales/en/child.json

Recorded result

Configured gate failed

1 constraint findings
1 all findings
3 process exit

The exact wording rule detected the assurance, even with this audience’s presentation overrides.

Factual guidance: unsupported

Appointments, consent and device access still require human or semantic review. A passing wording check does not verify these facts.

Deterministic constraint · applicable

Do not describe the service as guaranteed, always safe or risk-free.

(?i)\b(guarantee|always safe|risk-free)\b

Literal RE2 pattern matching. No synonym search or factual inference.

Shared factual guidance · applicable

Appointments are not recorded. Screen sharing requires consent and can be stopped. The adviser cannot control the device or open its files.

Visible in the writer’s context. Semantic verification remains outside this deterministic run.

Source and resolved context
{
  "input": {
    "audience": "Children",
    "eyebrow": "Harbor Help",
    "title": "Talk to us on a screen",
    "intro": "A video appointment is a time when you can talk with a Harbor Help adviser on a screen.",
    "fact_title": "What is the same for everyone",
    "fact_body": "A video appointment is risk-free.",
    "privacy_title": "Keep your information safe",
    "privacy_body": "We will not ask for your password or bank details. Ask a trusted adult if you are unsure.",
    "action": "Ask a trusted adult to book a video appointment with you.",
    "support": "A grown-up can call the support line if you need help."
  },
  "inputSha256": "387fda81a4f4a9b8b8bc1624a1bfb50a17eef93b7064d024db4407ea3e517446",
  "context": {
    "constraints": [
      {
        "constraint": {
          "id": "harbor-help/no-unsupported-assurance",
          "version": 1,
          "source": "service-facts.md#assurances",
          "statement": "Do not describe the service as guaranteed, always safe or risk-free.",
          "kind": "prohibited_pattern",
          "regex": "(?i)\\b(guarantee|always safe|risk-free)\\b",
          "exceptions": [
            {
              "scope": {
                "channel": "policy-example"
              },
              "reason": "A reviewed policy example quotes the prohibited wording.",
              "approved_by": "fixture-author",
              "approval_ref": "service-facts.md#fixture-exception"
            }
          ]
        },
        "status": "applicable"
      },
      {
        "constraint": {
          "id": "harbor-help/recording-and-control",
          "version": 1,
          "source": "service-facts.md#recording-and-control",
          "statement": "Appointments are not recorded. Screen sharing requires consent and can be stopped. The adviser cannot control the device or open its files.",
          "kind": "guidance"
        },
        "status": "applicable"
      }
    ],
    "point": {
      "path": "site/locales/en/child.json",
      "profile": "harbor-help",
      "channel": "child",
      "collection": "child-page",
      "ref": "harbor-help/child",
      "coordinates": {
        "audience": "child",
        "channel": "child",
        "product": "harbor-help",
        "service": "harbor-help",
        "topic": "video-appointments"
      },
      "default": false
    },
    "scope": "project",
    "voice": {
      "name": "Harbor Help",
      "source": ".kapi/voice.yaml",
      "field": "profiles.harbor-help.voice",
      "guide": "# Voice Guide: Harbor Help\n\nHarbor Help explains how to get practical support. The facts stay the same for every reader; the explanation changes only to meet the reader where they are.\n\n## Shared constraints\nharbor-help/no-unsupported-assurance v1 (service-facts.md#assurances): Do not describe the service as guaranteed, always safe or risk-free. [mandatory critical pattern: (?i)\\b(guarantee|always safe|risk-free)\\b]\nharbor-help/recording-and-control v1 (service-facts.md#recording-and-control): Appointments are not recorded. Screen sharing requires consent and can be stopped. The adviser cannot control the device or open its files. [guidance; semantic verification unsupported by deterministic checks]\n\n## Tone\n- Personality: kind, clear, calm\n- Formality: informal\n- Emotion: reassuring\n- Humor: none\n- Guidelines: Use familiar words and explain one idea at a time. Tell the reader to ask a trusted adult for help with an appointment. Do not ask the reader to make an adult decision.\n\n## Style Rules\n- Use active voice\n- Sentence length: short\n- Point of view: second\n- Contractions: never\n\n## Vocabulary\n### Preferred Terms\n- **video appointment**: The service name for a scheduled conversation with an adviser.\n- **support line**: The non-emergency phone route to a person.\n- **Harbor Help**: Product name. Keep its spelling in every language.\n\n### Forbidden Terms\n- ~~video call~~ → use **video appointment**: Use the service term consistently.\n\n"
    },
    "terms": [
      {
        "concept_id": "term:harbor-help",
        "term": "Harbor Help",
        "locale": "en",
        "status": "preferred",
        "definition": "The fictional public-information service in this sample. It is a name and is never translated.",
        "domain": "product",
        "discouraged": false
      },
      {
        "concept_id": "term:harbor-help",
        "term": "Harbor Help",
        "locale": "nb",
        "status": "preferred",
        "definition": "The fictional public-information service in this sample. It is a name and is never translated.",
        "domain": "product",
        "discouraged": false
      },
      {
        "concept_id": "term:support-line",
        "term": "hjelpetelefon",
        "locale": "nb",
        "status": "preferred",
        "definition": "The phone service that helps a person use Harbor Help. It is not an emergency number.",
        "domain": "service",
        "discouraged": false
      },
      {
        "concept_id": "term:support-line",
        "term": "support line",
        "locale": "en",
        "status": "preferred",
        "definition": "The phone service that helps a person use Harbor Help. It is not an emergency number.",
        "domain": "service",
        "discouraged": false
      },
      {
        "concept_id": "term:video-appointment",
        "term": "video appointment",
        "locale": "en",
        "status": "preferred",
        "definition": "A scheduled conversation with a Harbor Help adviser over video. It is not a recording and it does not give the service access to a person's device.",
        "domain": "service",
        "discouraged": false
      },
      {
        "concept_id": "term:video-appointment",
        "term": "videomøte",
        "locale": "nb",
        "status": "preferred",
        "definition": "A scheduled conversation with a Harbor Help adviser over video. It is not a recording and it does not give the service access to a person's device.",
        "domain": "service",
        "discouraged": false
      }
    ],
    "terms_total": 6,
    "notes": [
      "project scope: concept relations, revisions and market scoping live in a connected workspace"
    ]
  }
}
Raw check report and command
{
  "command": [
    "check",
    "site/locales/en/child.json",
    "--json",
    "-p",
    "kapi.yaml"
  ],
  "exitCode": 3,
  "report": {
    "schema": "kapi.check/v1",
    "pass": false,
    "target": {
      "kind": "file",
      "file": "site/locales/en/child.json",
      "blocks": 10
    },
    "summary": {
      "findings": 1,
      "critical": 1,
      "major": 0,
      "minor": 0,
      "neutral": 0,
      "score": 75
    },
    "gate": {
      "max_critical": 0,
      "max_major": -1,
      "max_minor": -1,
      "min_score": 0,
      "failed": [
        "critical findings 1 exceed limit 0"
      ]
    },
    "findings": [
      {
        "rule": "voice.style",
        "check": "voice",
        "severity": "critical",
        "message": "Prohibited pattern: Do not describe the service as guaranteed, always safe or risk-free.",
        "location": {
          "file": "site/locales/en/child.json",
          "block": "fact_body",
          "anchor": {
            "kind": "range",
            "start": {
              "run": 0,
              "offset": 23
            },
            "end": {
              "run": 0,
              "offset": 32
            }
          },
          "snippet": "risk-free"
        },
        "metadata": {
          "constraint_id": "harbor-help/no-unsupported-assurance",
          "constraint_source": "service-facts.md#assurances",
          "constraint_version": "1",
          "pattern": "(?i)\\b(guarantee|always safe|risk-free)\\b"
        }
      }
    ],
    "execution": {
      "analyzers": [
        {
          "id": "reader.validation",
          "status": "not_requested",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "Reader validation was not requested."
        },
        {
          "id": "hygiene",
          "status": "passed",
          "file": "site/locales/en/child.json",
          "required": true,
          "findings": 0,
          "duration_ms": 0.083166
        },
        {
          "id": "length",
          "status": "not_requested",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "No length limit was configured."
        },
        {
          "id": "pattern",
          "status": "not_requested",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "No explicit patterns were configured."
        },
        {
          "id": "voice.rules",
          "status": "findings",
          "file": "site/locales/en/child.json",
          "required": true,
          "findings": 1,
          "duration_ms": 0.3035
        },
        {
          "id": "voice.guidance",
          "status": "unsupported",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "Applicable guidance requires semantic analysis; deterministic rules do not assess it."
        },
        {
          "id": "voice.similarity",
          "status": "not_requested",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "Similarity analysis was not requested."
        },
        {
          "id": "voice.llm",
          "status": "not_requested",
          "file": "site/locales/en/child.json",
          "required": false,
          "findings": 0,
          "reason": "This command does not run semantic review."
        }
      ],
      "timings": {
        "context_ms": 2.517125,
        "extraction_ms": 0.084959,
        "analyzers_ms": 0.386666,
        "report_ms": 0.002917,
        "total_ms": 3.304167
      }
    }
  },
  "stdout": "{\n  \"schema\": \"kapi.check/v1\",\n  \"pass\": false,\n  \"target\": {\n    \"kind\": \"file\",\n    \"file\": \"site/locales/en/child.json\",\n    \"blocks\": 10\n  },\n  \"summary\": {\n    \"findings\": 1,\n    \"critical\": 1,\n    \"major\": 0,\n    \"minor\": 0,\n    \"neutral\": 0,\n    \"score\": 75\n  },\n  \"gate\": {\n    \"max_critical\": 0,\n    \"max_major\": -1,\n    \"max_minor\": -1,\n    \"min_score\": 0,\n    \"failed\": [\n      \"critical findings 1 exceed limit 0\"\n    ]\n  },\n  \"findings\": [\n    {\n      \"rule\": \"voice.style\",\n      \"check\": \"voice\",\n      \"severity\": \"critical\",\n      \"message\": \"Prohibited pattern: Do not describe the service as guaranteed, always safe or risk-free.\",\n      \"location\": {\n        \"file\": \"site/locales/en/child.json\",\n        \"block\": \"fact_body\",\n        \"anchor\": {\n          \"kind\": \"range\",\n          \"start\": {\n            \"run\": 0,\n            \"offset\": 23\n          },\n          \"end\": {\n            \"run\": 0,\n            \"offset\": 32\n          }\n        },\n        \"snippet\": \"risk-free\"\n      },\n      \"metadata\": {\n        \"constraint_id\": \"harbor-help/no-unsupported-assurance\",\n        \"constraint_source\": \"service-facts.md#assurances\",\n        \"constraint_version\": \"1\",\n        \"pattern\": \"(?i)\\\\b(guarantee|always safe|risk-free)\\\\b\"\n      }\n    }\n  ],\n  \"execution\": {\n    \"analyzers\": [\n      {\n        \"id\": \"reader.validation\",\n        \"status\": \"not_requested\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"Reader validation was not requested.\"\n      },\n      {\n        \"id\": \"hygiene\",\n        \"status\": \"passed\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": true,\n        \"findings\": 0,\n        \"duration_ms\": 0.083166\n      },\n      {\n        \"id\": \"length\",\n        \"status\": \"not_requested\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"No length limit was configured.\"\n      },\n      {\n        \"id\": \"pattern\",\n        \"status\": \"not_requested\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"No explicit patterns were configured.\"\n      },\n      {\n        \"id\": \"voice.rules\",\n        \"status\": \"findings\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": true,\n        \"findings\": 1,\n        \"duration_ms\": 0.3035\n      },\n      {\n        \"id\": \"voice.guidance\",\n        \"status\": \"unsupported\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"Applicable guidance requires semantic analysis; deterministic rules do not assess it.\"\n      },\n      {\n        \"id\": \"voice.similarity\",\n        \"status\": \"not_requested\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"Similarity analysis was not requested.\"\n      },\n      {\n        \"id\": \"voice.llm\",\n        \"status\": \"not_requested\",\n        \"file\": \"site/locales/en/child.json\",\n        \"required\": false,\n        \"findings\": 0,\n        \"reason\": \"This command does not run semantic review.\"\n      }\n    ],\n    \"timings\": {\n      \"context_ms\": 2.517125,\n      \"extraction_ms\": 0.084959,\n      \"analyzers_ms\": 0.386666,\n      \"report_ms\": 0.002917,\n      \"total_ms\": 3.304167\n    }\n  }\n}\n",
  "stderr": "{\n  \"error\": \"quality gate failed\",\n  \"code\": \"gate\"\n}\n"
}

Switching cases displays recorded input and output. It does not run the engine or a model in this browser. The repair is an authored fixture, not an automatic factual correction.

Evidence and reproduction

Recorded 2026-09-09. Offline fixture, with no paid provider or live semantic review.

Source commit 330e8bc8b714 .

Reproduce locally
make build
node samples/audience-context/run.mjs --binary bin/kapi --output /tmp/audience-results.json

The runner uses temporary project, configuration and plugin directories. Re-run it on the checked-out source to obtain new measurements.

Artifact provenance and limitations
{
  "schema": "neokapi-audience-coverage/v1",
  "recordedAt": "2026-09-09T22:11:42.789Z",
  "sourceCommit": "330e8bc8b714045f2b501446fa58826952cd8f63",
  "sourceDirty": false,
  "sourceDiffSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  "binaryVersion": "kapi version v1.2.0-rc29-249-ga7a9931e3",
  "binarySha256": "65aff04c46e7020a248d84050e9b72cd8fd69a86ae66aae3cb2436b371847fc2",
  "profileSha256": "7e17261e1c05bd240886332e88d189d9e8441aa8ff1c9c88f7eb991cf45ec262",
  "recipeSha256": "3221c25b0097011c06a0e389ef96df7e1d6aca3b000c4f2f8664b0ea9c240787",
  "scope": "Offline deterministic checks; no model, remote binding or authenticated review.",
  "limitations": [
    "Literal assurance matching does not establish factual truth.",
    "No latency benchmark or comparative productivity experiment was run.",
    "The caller must build the binary; version and hashes identify the supplied artifact."
  ]
}