← Kingy Local AI

FULL THREE-PAIR DOCUMENT STUDY · V1.5

Kingy and native LM Studio: three paired PDF repetitions

document-comparison-v15-20261014.1 · analysis completed 2026-10-14T08:34:36.027744+00:00

40 unique question clusters × 3 paired repetitions = 120 attempts per workflow.

Ten independently authored synthetic English PDFs with selectable text, 30 pages, 20 direct factual questions, 10 cross-document questions and 10 unanswerable questions. The recorded Mac has an Apple M4 Pro (14 CPU cores, 20 GPU cores), 24 GiB memory and macOS 26.3 build 25D125. Both complete workflows use identical Qwen3-4B Q4_K_M bytes and seeded generation settings. Kingy 1.5 uses llama.cpp b11429; native LM Studio 0.4.26+4 uses engine 2.56.0 and unmodified stock RAG revision 8 with eight retrieved chunks. Three fresh model sessions per workflow follow the frozen A1, B1, B2, A2, A3, B3 order.

Each pair contains the same 30 answerable and 10 unknown questions. Repetitions measure repeatability on the declared system; these are 40 unique cases, not 120 independent questions or an independent physical reproduction.

Read the method audit before the scores

The frozen native citation scores are not a valid citation-quality comparison. Our frozen resolver required a quote to fit one PDF page. All 132 emitted native citation instances across the three runs quote chunks spanning pages. The automatic zeros below reflect this mapping limitation. Cited UNKNOWN answers and some valid full-sentence or section-heading answers were also undercredited. Original scores and effect files remain downloadable; their apparent source-support advantages cannot be used as product claims.

Kingy 1.5 has not passed the frozen qualification: each run retained 26/30 confirmed supported answers and one unresolved case, below the 90% lower-bound target. The active downloadable recipe remains 1.4.

Supplemental source review, unblinded

The reviewer in this Kingy project checked all 240 originals against the exact PDFs after measurement. This review maps whole native chunks to page ranges, credits supported full sentences and section names, and retains missing facts, wrong citation IDs and semantic uncertainty. It is not blinded, independent validation or replacement qualification. Separate unblinded source review of all 240 originals

Separate post-output review; original answers unchanged
Workflow / repetitionFactsComplete supported answersCitations supporting the requested claimCorrect decline
Kingy A127/30 (90.0%)0 unresolved · bounds 90.0%–90.0%27/30 (90.0%)0 unresolved · bounds 90.0%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%
Native LM Studio B128/30 (93.3%)1 unresolved · bounds 93.3%–96.7%25/30 (83.3%)1 unresolved · bounds 83.3%–86.7%38/44 (86.4%)1 unresolved · bounds 86.4%–88.6%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%
Kingy A227/30 (90.0%)0 unresolved · bounds 90.0%–90.0%27/30 (90.0%)0 unresolved · bounds 90.0%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%
Native LM Studio B228/30 (93.3%)1 unresolved · bounds 93.3%–96.7%25/30 (83.3%)1 unresolved · bounds 83.3%–86.7%38/44 (86.4%)1 unresolved · bounds 86.4%–88.6%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%
Kingy A327/30 (90.0%)0 unresolved · bounds 90.0%–90.0%27/30 (90.0%)0 unresolved · bounds 90.0%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%
Native LM Studio B328/30 (93.3%)1 unresolved · bounds 93.3%–96.7%25/30 (83.3%)1 unresolved · bounds 83.3%–86.7%38/44 (86.4%)1 unresolved · bounds 86.4%–88.6%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%

All native emitted markers resolve to real source ranges. Some markers select the wrong document or a chunk missing the requested fact; source existence alone is not claim support. Factual correctness and complete supported answers are separate outcomes. This review does not establish a general accuracy winner.

Kingy returned sooner on 120/120 recorded paired attempts, including incorrect and unresolved answers. Complete-query time is descriptive on this Mac and corpus. Explicit document/page/quote output is a recorded Kingy format advantage; ease of use and comparative privacy were not tested.

Preserved original automatic scores and effects (method limitation)

Frozen automatic scores, preserved

All A1/B1, A2/B2 and A3/B3 attempts are retained. Confirmed passes form the conservative rate. The upper bound additionally includes unresolved judgments. These bounds are not confidence intervals. Canonical facts and complete supported answers are reported separately. Displayed native retrieval cards count only when claimed in the answer; uniquely quote-mapped citations can receive credit, with page capability retained separately.

Frozen common rubric; all six complete sessions
Workflow / repetitionCanonical factsSupported answersEmitted citation precisionCorrect abstentionAttempt accounting
Kingy workflow 1.5A126/30 (86.7%)2 unresolved · bounds 86.7%–93.3%26/30 (86.7%)1 unresolved · bounds 86.7%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%40/40 retained0 errors · 0 timeouts
Native LM Studio PDF chatB122/30 (73.3%)8 unresolved · bounds 73.3%–100.0%0/30 (0.0%)0 unresolved · bounds 0.0%–0.0%0/44 (0.0%)0 unresolved · bounds 0.0%–0.0%6/10 (60.0%)0 unresolved · bounds 60.0%–60.0%40/40 retained0 errors · 0 timeouts
Kingy workflow 1.5A226/30 (86.7%)2 unresolved · bounds 86.7%–93.3%26/30 (86.7%)1 unresolved · bounds 86.7%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%40/40 retained0 errors · 0 timeouts
Native LM Studio PDF chatB222/30 (73.3%)8 unresolved · bounds 73.3%–100.0%0/30 (0.0%)0 unresolved · bounds 0.0%–0.0%0/44 (0.0%)0 unresolved · bounds 0.0%–0.0%6/10 (60.0%)0 unresolved · bounds 60.0%–60.0%40/40 retained0 errors · 0 timeouts
Kingy workflow 1.5A326/30 (86.7%)2 unresolved · bounds 86.7%–93.3%26/30 (86.7%)1 unresolved · bounds 86.7%–90.0%37/38 (97.4%)0 unresolved · bounds 97.4%–97.4%10/10 (100.0%)0 unresolved · bounds 100.0%–100.0%40/40 retained0 errors · 0 timeouts
Native LM Studio PDF chatB322/30 (73.3%)8 unresolved · bounds 73.3%–100.0%0/30 (0.0%)0 unresolved · bounds 0.0%–0.0%0/44 (0.0%)0 unresolved · bounds 0.0%–0.0%6/10 (60.0%)0 unresolved · bounds 60.0%–60.0%40/40 retained0 errors · 0 timeouts

Errors and timeouts can overlap and are not added together. Both remain failed attempts. Citation denominators include emitted partial or unresolved citations. Original frozen common scoring rules · Original frozen paired protocol

Qualification and unresolved judgments

The declared thresholds are at least 90% supported-answer success, 95% emitted-citation precision and 90% correct abstention in every repetition, using conservative lower bounds.

Unresolved semantic or citation judgments remain. Their possible outcomes remain in the displayed bounds; an unreviewed ambiguity does not establish a comparative winner. Qualification is an absolute threshold for this workflow and test scope. A relative score does not automatically qualify a buying recommendation.

Paired effects and uncertainty

The effects below retain the original automatic calculation. The citation-mapping limitation invalidates comparative source-support, citation and cited-abstention interpretations. These apparent effects cannot be cited as product advantages; use the separate source review with its limits.

Effects below are Kingy minus native LM Studio. The 10,000-draw sensitivity analysis resamples whole unique-question clusters and keeps the three repetitions together. The envelope describes case-resampling sensitivity on this fixed corpus. It is not a population confidence interval, p-value or market-wide ranking.

Arithmetic unresolved bounds and whole-question sensitivity
Outcome / clustersEffect bounds95% case-resampling sensitivity envelope
complete question success40 unique clusters75.0 pp to 77.5 pp62.5 pp to 90.0 pp
supported answer success30 unique clusters86.7 pp to 90.0 pp73.3 pp to 100.0 pp
canonical fact correctness30 unique clusters-13.3 pp to 20.0 pp-26.7 pp to 36.7 pp
correct abstention10 unique clusters40.0 pp to 40.0 pp10.0 pp to 70.0 pp
emitted citation precision40 unique clusters97.4 pp to 97.4 pp90.9 pp to 100.0 pp

No automatic winner is declared. Original frozen paired calculations; method limitation disclosed

Complete-answer latency

Descriptive time includes each workflow's full answer pipeline. Native timing includes native preprocessing, embedding/retrieval and inference. Kingy timing includes retrieval, selection, source resolution and sufficiency checks. Import, cold start and neutral warmup are recorded separately. Median and nearest-rank p95 include retained measured failures; unavailable observations remain visible. These measurements do not establish model throughput, novice setup speed or a population speed advantage.

Seconds; descriptive observations only
SessionMeasured / unavailableMedianp95Maximum
A140 / 02.6183.9344.096
A240 / 02.6183.9874.003
A340 / 02.6153.9583.988
B140 / 08.79015.11037.187
B240 / 08.5369.7259.861
B340 / 07.3458.91011.747
Actual timing boundaries

Control provenance and instrumentation amendment

Instrumentation changed after Kingy A1 and before native B1. The amendment occurred before the first native held-out question. The candidate, corpus, frozen prompts and common scorer remained unchanged. This change limits what can be attributed to native app reliability; it is retained as control provenance rather than hidden or treated as a model result.

Curtis explicitly authorized AppleScript/System Events. PID/window-guarded native activation and file-picker control plus observed CUA chat controls were disclosed after Kingy A1 and before the first native heldout question. Blank-draft preparation interruptions were preserved and recovered before any prompt submission; no answer was retried. During B3, selecting the original empty template through native search restored a sidebar viewport precondition before calling the unchanged frozen clone, submit and capture helpers. That later metadata-only navigation is separately retained. Candidate, corpus, prompts, scorer, native stock RAG, effective settings and scheduled order remained unchanged. No competitor reliability claim follows from these control interruptions.

Disclosed original control amendment after A1 and before native B1 · Actual native control recovery and instrumentation provenance · Audit bundle: candidate, corpus, original records/logs and controls; not a qualified recipe

Exact configurations and failures

Kingy settings
{
  "configuration": {
    "machine": {
      "platform": "apple-silicon",
      "chip": "M4 Pro",
      "model": "Mac16,7",
      "cpuCores": 14,
      "gpuCores": 20,
      "memoryGiB": 24,
      "osFamily": "macOS",
      "osVersion": "26.3",
      "osBuild": "25D125"
    },
    "runtime": {
      "name": "llama.cpp",
      "version": "b11429",
      "commit": "d81235049",
      "binarySha256": "51afbf4ea6485b9ada19e99af97181f12baca42ef704b1e291c26a9ac0644eae"
    },
    "python": "3.12.14",
    "pypdf": "6.10.0",
    "model": {
      "id": "Qwen3-4B",
      "quantization": "Q4_K_M",
      "repository": "Qwen/Qwen3-4B-GGUF",
      "revision": "bc640142c66e1fdd12af0bd68f40445458f3869b",
      "file": "Qwen3-4B-Q4_K_M.gguf",
      "bytes": 2497280256,
      "sha256": "7485fe6f11af29433bc51cab58009521f205840f5b4ae3a32fa7f92e8534fdf5",
      "license": "Apache-2.0"
    }
  },
  "workflowVersion": "1.5.0",
  "runnerSha256": "d5e3c68878af3926c8844e7406a5f9f2666c133eabe624bc34836a85161f17b2",
  "generationSeed": 271828,
  "context": 8192,
  "temperature": 0,
  "maxOutputTokens": 512,
  "thinking": false,
  "cpuThreads": 10,
  "gpuOffload": "full Metal",
  "parallel": 1,
  "flashAttention": true,
  "kv": "F16",
  "retrieval": "Local BM25 pages and generic field/clause selection; source-ID selection then local sufficiency inference",
  "answerModelRequests": [
    79,
    79,
    79
  ],
  "warmupRequests": 3,
  "cachePolicy": "cache_prompt false; no claim that OS file caches were flushed.",
  "timingBoundary": "runner.ask entry through its complete returned answer, source resolution and sufficiency check; excludes prior PDF import/index, cold start, warmup and later grading.",
  "nativeEgressComparison": "unverified; no comparative privacy claim"
}

Actual pinned Kingy configuration and full-answer timing boundary

Native LM Studio settings
{
  "load_config": {
    "fields": [
      {
        "key": "llm.load.llama.autoFit",
        "value": false
      },
      {
        "key": "llm.load.mlx.autoFit",
        "value": false
      },
      {
        "key": "llm.load.llama.cpuThreadPoolSize",
        "value": 10
      },
      {
        "key": "llm.load.contextLength",
        "value": 8192
      },
      {
        "key": "llm.load.llama.flashAttention",
        "value": true
      },
      {
        "key": "llm.load.promptTemplate",
        "value": {
          "type": "jinja",
          "jinjaPromptTemplate": {
            "template": "{%- if tools %}\n    {{- '<|im_start|>system\\n' }}\n    {%- if messages[0].role == 'system' %}\n        {{- messages[0].content + '\\n\\n' }}\n    {%- endif %}\n    {{- \"# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>\" }}\n    {%- for tool in tools %}\n        {{- \"\\n\" }}\n        {{- tool | tojson }}\n    {%- endfor %}\n    {{- \"\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\\"name\\\": <function-name>, \\\"arguments\\\": <args-json-object>}\\n</tool_call><|im_end|>\\n\" }}\n{%- else %}\n    {%- if messages[0].role == 'system' %}\n        {{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}\n    {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}\n{%- for index in range(ns.last_query_index, -1, -1) %}\n    {%- set message = messages[index] %}\n    {%- if ns.multi_step_tool and message.role == \"user\" and not('<tool_response>' in message.content and '</tool_response>' in message.content) %}\n        {%- set ns.multi_step_tool = false %}\n        {%- set ns.last_query_index = index %}\n    {%- endif %}\n{%- endfor %}\n{%- for message in messages %}\n    {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) %}\n        {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n    {%- elif message.role == \"assistant\" %}\n        {%- set content = message.content %}\n        {%- set reasoning_content = '' %}\n        {%- if message.reasoning_content is defined and message.reasoning_content is not none %}\n            {%- set reasoning_content = message.reasoning_content %}\n        {%- else %}\n            {%- if '</think>' in message.content %}\n                {%- set content = message.content.split('</think>')[-1].lstrip('\\n') %}\n                {%- set reasoning_content = message.content.split('</think>')[0].rstrip('\\n').split('<think>')[-1].lstrip('\\n') %}\n            {%- endif %}\n        {%- endif %}\n        {%- if loop.index0 > ns.last_query_index %}\n            {%- if loop.last or (not loop.last and reasoning_content) %}\n                {{- '<|im_start|>' + message.role + '\\n<think>\\n' + reasoning_content.strip('\\n') + '\\n</think>\\n\\n' + content.lstrip('\\n') }}\n            {%- else %}\n                {{- '<|im_start|>' + message.role + '\\n' + content }}\n            {%- endif %}\n        {%- else %}\n            {{- '<|im_start|>' + message.role + '\\n' + content }}\n        {%- endif %}\n        {%- if message.tool_calls %}\n            {%- for tool_call in message.tool_calls %}\n                {%- if (loop.first and content) or (not loop.first) %}\n                    {{- '\\n' }}\n                {%- endif %}\n                {%- if tool_call.function %}\n                    {%- set tool_call = tool_call.function %}\n                {%- endif %}\n                {{- '<tool_call>\\n{\"name\": \"' }}\n                {{- tool_call.name }}\n                {{- '\", \"arguments\": ' }}\n                {%- if tool_call.arguments is string %}\n                    {{- tool_call.arguments }}\n                {%- else %}\n                    {{- tool_call.arguments | tojson }}\n                {%- endif %}\n                {{- '}\\n</tool_call>' }}\n            {%- endfor %}\n        {%- endif %}\n        {{- '<|im_end|>\\n' }}\n    {%- elif message.role == \"tool\" %}\n        {%- if loop.first or (messages[loop.index0 - 1].role != \"tool\") %}\n            {{- '<|im_start|>user' }}\n        {%- endif %}\n        {{- '\\n<tool_response>\\n' }}\n        {{- message.content }}\n        {{- '\\n</tool_response>' }}\n        {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n            {{- '<|im_end|>\\n' }}\n        {%- endif %}\n    {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n    {{- '<|im_start|>assistant\\n' }}\n    {%- if enable_thinking is defined and enable_thinking is false %}\n        {{- '<think>\\n\\n</think>\\n\\n' }}\n    {%- endif %}\n{%- endif %}"
          }
        }
      },
      {
        "key": "llm.load.llama.tryDirectIO",
        "value": false
      },
      {
        "key": "llm.load.llama.acceleration.offloadRatio",
        "value": 1
      },
      {
        "key": "llm.load.numParallelSessions",
        "value": 1
      },
      {
        "key": "llm.load.seed",
        "value": {
          "checked": true,
          "value": 271828
        }
      }
    ]
  },
  "prediction_config": {
    "fields": [
      {
        "key": "llm.prediction.promptTemplate",
        "value": {
          "type": "jinja",
          "jinjaPromptTemplate": {
            "template": "{%- if tools %}\n    {{- '<|im_start|>system\\n' }}\n    {%- if messages[0].role == 'system' %}\n        {{- messages[0].content + '\\n\\n' }}\n    {%- endif %}\n    {{- \"# Tools\\n\\nYou may call one or more functions to assist with the user query.\\n\\nYou are provided with function signatures within <tools></tools> XML tags:\\n<tools>\" }}\n    {%- for tool in tools %}\n        {{- \"\\n\" }}\n        {{- tool | tojson }}\n    {%- endfor %}\n    {{- \"\\n</tools>\\n\\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags:\\n<tool_call>\\n{\\\"name\\\": <function-name>, \\\"arguments\\\": <args-json-object>}\\n</tool_call><|im_end|>\\n\" }}\n{%- else %}\n    {%- if messages[0].role == 'system' %}\n        {{- '<|im_start|>system\\n' + messages[0].content + '<|im_end|>\\n' }}\n    {%- endif %}\n{%- endif %}\n{%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) %}\n{%- for index in range(ns.last_query_index, -1, -1) %}\n    {%- set message = messages[index] %}\n    {%- if ns.multi_step_tool and message.role == \"user\" and not('<tool_response>' in message.content and '</tool_response>' in message.content) %}\n        {%- set ns.multi_step_tool = false %}\n        {%- set ns.last_query_index = index %}\n    {%- endif %}\n{%- endfor %}\n{%- for message in messages %}\n    {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) %}\n        {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n    {%- elif message.role == \"assistant\" %}\n        {%- set content = message.content %}\n        {%- set reasoning_content = '' %}\n        {%- if message.reasoning_content is defined and message.reasoning_content is not none %}\n            {%- set reasoning_content = message.reasoning_content %}\n        {%- else %}\n            {%- if '</think>' in message.content %}\n                {%- set content = message.content.split('</think>')[-1].lstrip('\\n') %}\n                {%- set reasoning_content = message.content.split('</think>')[0].rstrip('\\n').split('<think>')[-1].lstrip('\\n') %}\n            {%- endif %}\n        {%- endif %}\n        {%- if loop.index0 > ns.last_query_index %}\n            {%- if loop.last or (not loop.last and reasoning_content) %}\n                {{- '<|im_start|>' + message.role + '\\n<think>\\n' + reasoning_content.strip('\\n') + '\\n</think>\\n\\n' + content.lstrip('\\n') }}\n            {%- else %}\n                {{- '<|im_start|>' + message.role + '\\n' + content }}\n            {%- endif %}\n        {%- else %}\n            {{- '<|im_start|>' + message.role + '\\n' + content }}\n        {%- endif %}\n        {%- if message.tool_calls %}\n            {%- for tool_call in message.tool_calls %}\n                {%- if (loop.first and content) or (not loop.first) %}\n                    {{- '\\n' }}\n                {%- endif %}\n                {%- if tool_call.function %}\n                    {%- set tool_call = tool_call.function %}\n                {%- endif %}\n                {{- '<tool_call>\\n{\"name\": \"' }}\n                {{- tool_call.name }}\n                {{- '\", \"arguments\": ' }}\n                {%- if tool_call.arguments is string %}\n                    {{- tool_call.arguments }}\n                {%- else %}\n                    {{- tool_call.arguments | tojson }}\n                {%- endif %}\n                {{- '}\\n</tool_call>' }}\n            {%- endfor %}\n        {%- endif %}\n        {{- '<|im_end|>\\n' }}\n    {%- elif message.role == \"tool\" %}\n        {%- if loop.first or (messages[loop.index0 - 1].role != \"tool\") %}\n            {{- '<|im_start|>user' }}\n        {%- endif %}\n        {{- '\\n<tool_response>\\n' }}\n        {{- message.content }}\n        {{- '\\n</tool_response>' }}\n        {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n            {{- '<|im_end|>\\n' }}\n        {%- endif %}\n    {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n    {{- '<|im_start|>assistant\\n' }}\n    {%- if enable_thinking is defined and enable_thinking is false %}\n        {{- '<think>\\n\\n</think>\\n\\n' }}\n    {%- endif %}\n{%- endif %}"
          },
          "stopStrings": []
        }
      },
      {
        "key": "llm.prediction.llama.cpuThreads",
        "value": 10
      },
      {
        "key": "llm.prediction.repeatPenalty",
        "value": {
          "checked": true,
          "value": 1
        }
      },
      {
        "key": "llm.prediction.topPSampling",
        "value": {
          "checked": true,
          "value": 1
        }
      },
      {
        "key": "llm.prediction.minPSampling",
        "value": {
          "checked": true,
          "value": 0
        }
      },
      {
        "key": "llm.prediction.temperature",
        "value": 0
      },
      {
        "key": "llm.prediction.maxPredictedTokens",
        "value": {
          "checked": true,
          "value": 512
        }
      },
      {
        "key": "llm.prediction.reasoning.enableThinking",
        "value": false
      },
      {
        "key": "llm.prediction.contextOverflowPolicy",
        "value": "stopAtLimit"
      },
      {
        "key": "llm.prediction.tools",
        "value": {
          "type": "none"
        }
      }
    ]
  },
  "plugins": [
    "lmstudio/rag-v1"
  ],
  "plugin_configs": {
    "lmstudio/rag-v1": {
      "preset": "",
      "config": {
        "fields": [
          {
            "key": "retrievalLimit",
            "value": 8
          }
        ]
      }
    }
  },
  "system_prompt": ""
}

Frozen native effective settings verified on every measured answer

Installed native engine and embedding artifact hashes · Installed unmodified stock RAG source hashes · Before-measurement complete study freeze · All six original-session integrity checks

The retained attempt records contain no runtime errors or timeouts. Quality failures and unresolved judgments remain in the score denominators and full raw evidence.

All 120 original Kingy responses and frozen grades · All 120 original native responses and frozen grades

Limits and history

The original immutable v1.4 paired pilot remains separate historical evidence, including its incomplete native repetitions and post-output source review. Its scores and files are preserved. This v1.5 report uses its own frozen rubric and fresh study; it does not rewrite that earlier comparison. Original immutable v1.4 manifest

Inspect and reproduce

Report data · File hashes and sizes · Completed frozen analysis and output hashes