<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>cameronqj</title>
    <link>https://cameronqj.com/</link>
    <description>Recent content on cameronqj</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <copyright>Cameron Jones</copyright>
    <lastBuildDate>Fri, 24 Jul 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://cameronqj.com/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>local-first-model-router</title>
      <link>https://cameronqj.com/projects/local-first-model-router/</link>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/local-first-model-router/</guid>
      <description>An experimental OpenAI-compatible router that treats privacy, capability, tool authority, and backend health as policy decisions.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Experimental<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/local-first-model-router">github.com/cameronqj/local-first-model-router</a></p>
<p>Routing to the cheapest model that might work is easy. Routing without leaking sensitive context, changing models halfway through a tool loop, or granting a weaker backend authority it should not have is a different problem.</p>
<p>I kept the hard decisions deterministic. Privacy rules, backend health, measured capability, tool authority, and session affinity take precedence over the learned classifier. A small local embedding model only advises on ambiguous requests; it cannot override those boundaries.</p>
<h2 id="what-the-evidence-says">What the evidence says</h2>
<p>In one clean five-repeat experiment, the aggressive policy sent 81.15% of requests to local inference, up from a 22.82% conservative baseline. It also completed 10 of 10 authorized write/execute tasks without transport failures or unexpected side effects.</p>
<p>That did not settle the larger question. Quality remained inconclusive, and the latency and remote-token gates failed. The result supports the routing architecture and its authority model, not a claim that local-first routing is automatically faster, cheaper, or production-ready.</p>
<h2 id="read-the-evidence">Read the evidence</h2>
<ul>
<li><a href="https://github.com/cameronqj/local-first-model-router/blob/main/docs/experiment-log.md">Experiment log</a></li>
<li><a href="https://github.com/cameronqj/local-first-model-router/blob/main/docs/adr/0011-aggressive-local-policy-profile-and-tool-authority.md">Aggressive-local policy and tool authority</a></li>
<li><a href="https://github.com/cameronqj/local-first-model-router/blob/main/eval/results/adr-0011-aggressive-local-execute-affinity-2026-07-19.json">Five-repeat execution result</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>incident-response-agent</title>
      <link>https://cameronqj.com/projects/incident-response-agent/</link>
      <pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/incident-response-agent/</guid>
      <description>A bounded proof of concept for human-approved remediation with typed evidence, expiring authority, verification, and audit.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Proof of concept<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/incident-response-agent">github.com/cameronqj/incident-response-agent</a></p>
<p>Incident automation is mostly an authority problem. A model can suggest a plausible fix; the harder question is whether it should be allowed to act, on what target, for how long, and with what evidence left behind.</p>
<p>This project follows one deliberately narrow remediation path from typed intake through assessment, an immutable proposal, human approval, atomic execution, verification, and audit. Approval grants short-lived authority to perform the exact proposed action. The model never receives open-ended access to the runtime.</p>
<h2 id="what-the-evidence-says">What the evidence says</h2>
<p>The current evidence includes 114 offline tests, 13 disposable-container tests, and two live integrations. In the strongest end-to-end run, the system took an owned service from HTTP 503 and an unhealthy container state to HTTP 200 and healthy, while preserving the container identity and recording each step.</p>
<p>It is not a production incident-response platform. One bearer token controls mutation, there is no RBAC or production target discovery, and remediation is restricted to disposable resources created by the proof of concept. The container restart is a vehicle for testing approval, telemetry, and authority boundaries, not the product claim.</p>
<h2 id="read-the-evidence">Read the evidence</h2>
<ul>
<li><a href="https://github.com/cameronqj/incident-response-agent/blob/main/docs/evidence.md">Verification record</a></li>
<li><a href="https://github.com/cameronqj/incident-response-agent/blob/main/docs/adr/004-real-disposable-service-recovery.md">Disposable-service recovery decision</a></li>
<li><a href="https://github.com/cameronqj/incident-response-agent/blob/main/SECURITY.md">Security boundary and remaining risks</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>agent-cockpit</title>
      <link>https://cameronqj.com/projects/agent-cockpit/</link>
      <pubDate>Tue, 16 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/agent-cockpit/</guid>
      <description>A repo-native control plane that computes agent dispatch readiness from versioned work orders, decisions, handoffs, and checks.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Working prototype<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/agent-cockpit">github.com/cameronqj/agent-cockpit</a></p>
<p>Once several coding agents are working in parallel, &ldquo;what should run next?&rdquo; stops being a prompt and becomes a control-plane question. Chat history is a poor source of truth for dependencies, decisions, stale handoffs, and work that is technically ready but unsafe to dispatch.</p>
<p>Agent Cockpit stores that state in the repository that owns the work. It reads versioned work orders, dependencies, decisions, handoffs, and health checks, then separates hard blockers from degraded signals. A missing approval can stop dispatch; a stale but noncritical signal can warn without freezing everything.</p>
<p>The CLI and synthetic demo exercise the model, including checks against the repository&rsquo;s own GitHub Actions state. It does not run agents, coordinate writes across repositories, or claim production adoption. Its job is narrower: make dispatch readiness inspectable and reviewable before another agent starts changing code.</p>
<h2 id="read-the-design">Read the design</h2>
<ul>
<li><a href="https://github.com/cameronqj/agent-cockpit#quick-start">Quick start and live-check behavior</a></li>
<li><a href="https://github.com/cameronqj/agent-cockpit/blob/main/docs/decisions/ADR-0010-trust-state-dispatch-semantics.md">Trust-state dispatch semantics</a></li>
<li><a href="https://github.com/cameronqj/agent-cockpit/blob/main/docs/decisions/ADR-0012-execution-is-repo-local.md">Repository-local execution boundary</a></li>
<li><a href="https://github.com/cameronqj/agent-cockpit/blob/main/docs/subagent-dispatch.md">Subagent dispatch standard</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>llm-dyno</title>
      <link>https://cameronqj.com/projects/llm-dyno/</link>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/llm-dyno/</guid>
      <description>A dependency-free harness for measuring the speed and discriminating accuracy of a specific OpenAI-compatible deployment.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Pre-release<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/llm-dyno">github.com/cameronqj/llm-dyno</a></p>
<p>A model name is not a performance result. Runtime, quantization, hardware, concurrency, context length, and prompting scaffold all change what a deployment can actually do.</p>
<p><code>llm-dyno</code> measures the endpoint in front of you. It uses one OpenAI-compatible interface, deterministic code-based graders, context and concurrency tests, and math/options suites designed to separate capable deployments instead of producing easy perfect scores. Prompt scaffolding is recorded as an experimental variable rather than disappearing into the result.</p>
<p>Three private targets have completed the full artifact pipeline and produced validated profiles and self-contained reports. Their identities and measurements stay local by design, so the public repository does not contain a model leaderboard or a comparative performance claim. The harness is still pre-release; the evidence currently supports the measurement pipeline, not a universal ranking.</p>
<h2 id="read-the-methodology">Read the methodology</h2>
<ul>
<li><a href="https://github.com/cameronqj/llm-dyno/blob/main/METHODOLOGY.md">Measurement and claim boundaries</a></li>
<li><a href="https://github.com/cameronqj/llm-dyno/blob/main/docs/integration-evidence.md">Private multi-target integration evidence</a></li>
<li><a href="https://github.com/cameronqj/llm-dyno/blob/main/docs/adr/0003-discriminating-suites.md">Why the suites are discriminating</a></li>
<li><a href="https://github.com/cameronqj/llm-dyno/blob/main/docs/adr/0004-deterministic-graders.md">Why grading stays deterministic</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>structured-output-agent</title>
      <link>https://cameronqj.com/projects/structured-output-agent/</link>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/structured-output-agent/</guid>
      <description>A small Python runtime for schema-validated model responses, bounded recovery, typed tool contracts, and sanitized audit events.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Experimental runtime<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/structured-output-agent">github.com/cameronqj/structured-output-agent</a></p>
<p>Valid JSON is only the first boundary. The shape can be correct while the requested tool is unauthorized, its arguments are unsafe, or the tool returns data the rest of the application should not trust.</p>
<p>This runtime puts schemas on both sides of the model/tool boundary. It uses Pydantic validation, a hard attempt budget, typed failures, and an explicit registry that validates tool arguments and results around application-owned code. Plain prose never becomes a tool call, and provider failures stop rather than entering a blind retry loop.</p>
<p>The evidence is intentionally modest. Hermetic tests with scripted models and deterministic tools cover malformed output, recovery budgets, authorization, and result validation. There is not yet a frozen provider-response corpus or enough provider-specific integration evidence to claim broad runtime reliability.</p>
<h2 id="read-the-design">Read the design</h2>
<ul>
<li><a href="https://github.com/cameronqj/structured-output-agent/blob/main/docs/architecture.md">Architecture and attempt semantics</a></li>
<li><a href="https://github.com/cameronqj/structured-output-agent/blob/main/docs/testing.md">Test coverage and evidence limits</a></li>
<li><a href="https://github.com/cameronqj/structured-output-agent/blob/main/docs/adr/0004-explicit-tool-registry.md">Explicit tool-authority decision</a></li>
<li><a href="https://github.com/cameronqj/structured-output-agent/blob/main/docs/experiment-log.md">Experiment status</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>react-planning-agent</title>
      <link>https://cameronqj.com/projects/react-planning-agent/</link>
      <pubDate>Sun, 19 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/react-planning-agent/</guid>
      <description>A typed ReAct state machine with explicit planning steps, separate budgets, cycle detection, and sanitized traces.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Experimental runtime<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/react-planning-agent">github.com/cameronqj/react-planning-agent</a></p>
<p>ReAct loops are easy to demo and surprisingly easy to leave unbounded. A model can repeat a plausible action, burn retries on malformed output, or keep planning after it has stopped making progress.</p>
<p>This project wraps <code>observe → decide → act → reflect</code> in a typed state machine. Iterations, tool calls, and structured-output recovery have separate budgets. Exact repeated actions and repeated application-visible state keys stop deterministic cycles. Model, validation, tool, and budget failures return typed summaries rather than escaping as uncontrolled exceptions.</p>
<p>The offline vertical slice covers single-tool and multistep flows. One live local-server run discovered a model and completed an addition tool call. That is useful integration evidence, but it is one narrow path. It does not establish open-ended planning reliability or broad compatibility across providers.</p>
<h2 id="read-the-evidence">Read the evidence</h2>
<ul>
<li><a href="https://github.com/cameronqj/react-planning-agent/blob/main/docs/architecture.md">Architecture and dependency boundary</a></li>
<li><a href="https://github.com/cameronqj/react-planning-agent/blob/main/docs/experiment-log.md">Offline and live experiment record</a></li>
<li><a href="https://github.com/cameronqj/react-planning-agent/blob/main/docs/testing.md">Testing boundaries</a></li>
<li><a href="https://github.com/cameronqj/react-planning-agent/blob/main/docs/adr/0004-cycle-detection.md">Cycle-detection decision</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>toolcall-repair-bench</title>
      <link>https://cameronqj.com/projects/toolcall-repair-bench/</link>
      <pubDate>Thu, 09 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/toolcall-repair-bench/</guid>
      <description>An archived precision-first benchmark whose follow-up testing disproved its original broad premise.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Concluded and archived<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/toolcall-repair-bench">github.com/cameronqj/toolcall-repair-bench</a></p>
<p>I built this benchmark to answer what looked like a practical question: how often could a conservative repair layer recover malformed local-model tool calls without inventing unsafe intent?</p>
<p>The first version treated unsafe false positives as more important than recall or F1. Then endpoint-controlled follow-up testing changed the conclusion. <code>llama.cpp</code> produced 27 of 27 clean non-streaming calls and 36 of 36 clean streaming/parallel calls. Ollama&rsquo;s parsed chat path produced 3 of 3 and then 16 of 16 clean calls, including the model that seeded the original investigation.</p>
<p>The broad &ldquo;local models need tool-call repair&rdquo; premise did not survive. The original 117-case corpus had captured raw, unparsed completion output, so its leaderboard cannot support a general model or library comparison. I archived the project rather than keep polishing a benchmark for a problem the normal serving path had already solved.</p>
<p>The useful artifact is the correction: capture point and serving stack mattered more than the model-level explanation I started with.</p>
<h2 id="read-the-finding">Read the finding</h2>
<ul>
<li><a href="https://github.com/cameronqj/toolcall-repair-bench/blob/main/findings/README.md">Finding and reproduction procedure</a></li>
<li><a href="https://github.com/cameronqj/toolcall-repair-bench/blob/main/docs/adr/0006-premise-is-a-serving-stack-artifact.md">Why the project was archived</a></li>
<li><a href="https://github.com/cameronqj/toolcall-repair-bench/blob/main/EVALUATION.md">Precision-first methodology</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>local-tool-proxy</title>
      <link>https://cameronqj.com/projects/local-tool-proxy/</link>
      <pubDate>Sun, 14 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/projects/local-tool-proxy/</guid>
      <description>An archived compatibility proxy for conservative repair of malformed local-model tool calls on raw-completion paths.</description>
      <content:encoded><![CDATA[<p><strong>Status:</strong> Concluded and archived<br>
<strong>Code:</strong> <a href="https://github.com/cameronqj/local-tool-proxy">github.com/cameronqj/local-tool-proxy</a></p>
<p>This started with a concrete failure: a local model expressed a tool call as JSON inside ordinary response text, while the client expected an OpenAI-style structured tool call.</p>
<p>The proxy repairs only a narrow class of responses. It checks the requested name and arguments against the tools declared by the client, then abstains when intent is unclear. On the companion 117-case raw-output corpus, version 0.1.0 reached 87.5% precision and 38.2% recall on recoverable cases, with two unsafe false positives. Real OpenCode samples still failed the final task-level check even when the protocol shape improved.</p>
<p>Later endpoint-controlled testing explained why. Current parsed chat endpoints already returned clean tool calls, including for the seed model. The proxy is therefore relevant mainly to raw-completion consumers and older or misconfigured serving stacks. It is archived because that scope is too narrow to justify an active compatibility layer.</p>
<h2 id="read-the-evidence">Read the evidence</h2>
<ul>
<li><a href="https://github.com/cameronqj/local-tool-proxy/blob/main/docs/experiment-log.md">Experiment log and failed task verification</a></li>
<li><a href="https://github.com/cameronqj/local-tool-proxy/blob/main/docs/model-stops-using-tools-analysis.md">Where protocol repair stops helping</a></li>
<li><a href="https://github.com/cameronqj/toolcall-repair-bench/blob/main/findings/README.md">Serving-stack scope correction</a></li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>You can&#39;t govern what you can&#39;t verify</title>
      <link>https://cameronqj.com/writing/you-cant-govern-what-you-cant-verify/</link>
      <pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/writing/you-cant-govern-what-you-cant-verify/</guid>
      <description>What building an agent harness taught me about controlling systems I don&amp;#39;t fully trust.</description>
      <content:encoded><![CDATA[<p>I set out to answer a simple question: does wrapping a model in an orchestration loop improve its answers? The idea was to put the scientific method around the model: generate an answer, test it, inspect the failure, and revise.</p>
<p>I never got a clean answer. I learned something more useful instead: I couldn&rsquo;t govern even this small system until I could independently verify its behavior.</p>
<p>Several apparent model failures were something else: a token ceiling, a serving default, an uneven comparison, or a bug in my control flow. The score told me that a model had failed. It rarely told me which part of the system had failed or why.</p>
<p>That became the more interesting result.</p>
<h2 id="the-score-was-right-but-the-explanation-was-wrong">The score was right, but the explanation was wrong</h2>
<p>Early runs showed a model returning nothing usable. My harness recorded a capability failure.</p>
<p>The raw response told a different story. The model had spent its completion budget on hidden reasoning tokens, hit the ceiling, and stopped with <code>finish_reason: length</code> before producing an answer.</p>
<p>After I raised the limit, 8 of 27 successful calls used more than the old 1,200-token ceiling, almost entirely on hidden reasoning. The model had not necessarily failed at the task. I had cut it off before it could answer.</p>
<p>The pass/fail result alone could not reveal that. I needed two separate things: verification to tell me whether a valid answer existed, and telemetry to explain why it did not.</p>
<h2 id="the-model-wasnt-the-whole-system">The model wasn&rsquo;t the whole system</h2>
<p>My most convincing &ldquo;the stronger model is better&rdquo; result compared a frontier model running inside a mature coding agent with an open model accessed through a raw API.</p>
<p>The token accounting made the problem obvious:</p>
<ul>
<li>Frontier side: 67,991 input tokens</li>
<li>Open-model side: 1,320 input tokens</li>
</ul>
<p>One side had an agentic loop, tools, retries, internal turns, and a tuned system prompt. The other received one completion request.</p>
<p>The result was real in the narrow sense that one system completed the task and the other did not. But I had not isolated model capability. I had compared two systems with very different amounts of machinery around them.</p>
<p>Most of that machinery was missing from the result table.</p>
<p>Any useful account of an agent&rsquo;s behavior has to include the scaffold: which tools it used, how many attempts it received, what information it saw, what the framework changed between turns, and how the final answer was extracted. Looking only at the model leaves much of the actual system unobserved.</p>
<h2 id="my-enforcement-code-was-wrong-too">My enforcement code was wrong too</h2>
<p>The orchestrator was supposed to inspect failing answers and repair them. When I reviewed the control flow, I found that it was rewriting answers before checking whether they were already correct.</p>
<p>The loop was quietly degrading passing results.</p>
<p>Left unfixed, the experiment would have produced a plausible conclusion: orchestration does not help and may make answers worse. The conclusion would also have been wrong. I would have been measuring an ordering bug in the code responsible for running the experiment.</p>
<p>That changed how I thought about the harness. The code enforcing the rules could not be above scrutiny. It needed its own invariants and tests.</p>
<p>Verification had to happen before revision. A passing answer had to remain untouched unless the system could produce evidence that it no longer passed. Every transition needed to be visible.</p>
<h2 id="the-checker-was-part-of-the-attack-surface">The checker was part of the attack surface</h2>
<p>My checks also admitted shortcuts. A candidate could satisfy the letter of a test by hardcoding a value, exiting early, or bypassing the behavior I intended to measure.</p>
<p>A passing check was therefore not enough. I needed adversarial probes for the obvious shortcuts and a way to mark ambiguous results as invalid rather than quietly counting them as successes.</p>
<p>I&rsquo;m careful with the word &ldquo;gaming&rdquo; here. A model does not need to understand that it is cheating. If the shortest path to a reward exploits a weakness in the evaluator, the effect is the same: the score says one thing while the execution says another.</p>
<p>The verifier is part of the system under test.</p>
<h2 id="what-made-a-result-believable">What made a result believable</h2>
<p>I eventually settled on a few structural rules.</p>
<p>Authority lives in code. The model cannot grant itself more attempts, a larger budget, or additional tools through its output. Those limits hold whether the model understands them or not.</p>
<p>Where an answer can be checked through execution, I run the check in an isolated environment. An LLM judge may be useful for qualitative work, but it should not replace a deterministic test that already exists. Model judges can share blind spots with the outputs they grade.</p>
<p>Ambiguous outcomes fail closed. Hardcoded answers, premature exits, incomplete traces, and unverifiable success claims are not passes.</p>
<p>The orchestration receives the same scrutiny as the model. I record enough about control flow, tool use, budgets, and endpoint behavior to identify which layer produced a failure without logging raw prompts by default.</p>
<p>Runs retain their lineage. Inputs, configuration, decisions, and derived artifacts have enough parentage to reconstruct a result instead of accepting it on faith.</p>
<p>None of these controls depend on the model or its prompt cooperating.</p>
<h2 id="from-an-eval-problem-to-a-control-problem">From an eval problem to a control problem</h2>
<p>These experiments do not prove a general loss-of-control thesis. They made the underlying engineering problem concrete.</p>
<p>In an eval, weak enforcement or bad telemetry produces a misleading number. When an agent can call APIs, modify a repository, spend money, or act under standing credentials, the same class of failure produces an external side effect.</p>
<p>The questions become more consequential, but they are familiar:</p>
<ul>
<li>What was the system allowed to do?</li>
<li>Which component granted that authority?</li>
<li>What did it actually do?</li>
<li>Can the claimed result be checked against external state?</li>
<li>Does the record remain trustworthy if the model, prompt, or orchestration is buggy, compromised, or simply opaque?</li>
</ul>
<p>A stronger system prompt cannot answer those questions. The boundary has to exist outside the model: scoped credentials, budgets enforced in code, action receipts, immutable audit records, and independent verification of effects.</p>
<p>Better models still matter. Better orchestration matters too. Neither removes the need for controls that keep working when the system gives you a convincing but incorrect account of itself.</p>
<p>I started out trying to build a loop that made a model perform better. I came away more interested in the layer around that loop: one that bounds its authority, records what it changes, and checks its claims against the world.</p>
<p>I learned that lesson on functions that fit on a screen. The agents won&rsquo;t stay that small.</p>
]]></content:encoded>
    </item>
    <item>
      <title>About</title>
      <link>https://cameronqj.com/about/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://cameronqj.com/about/</guid>
      <description>About Cameron Jones</description>
      <content:encoded><![CDATA[<p>I&rsquo;m Cameron Jones. I build reliable infrastructure around LLMs and coding agents.</p>
<p>My background spans 25 years across infrastructure, SRE, cloud, and enterprise architecture. That experience shapes how I approach AI systems: production behavior matters more than demonstrations, and autonomy is useful only when its authority, failure modes, and operating boundaries are explicit.</p>
<p>My current work focuses on inference routing, typed agent runtimes, evaluation, human-approved automation, and observable control planes. Across these projects, I favor deterministic offline tests, explicit budgets, structured contracts, minimal retention of sensitive content, and honest statements about what the available evidence does—and does not—establish.</p>
<p>A recurring principle is <strong>deterministic core, sparse LLM</strong>: code owns facts, state, policy, authority, and validation. Models contribute interpretation and planning where their judgment is useful.</p>
<p>Some of the projects here are active systems. Others are concluded experiments whose original premise did not survive testing. I keep the negative results public because revising a design when the evidence changes is part of the work.</p>
<p>You can find me on <a href="https://github.com/cameronqj">GitHub</a>, <a href="https://x.com/cameronqjones">X</a>, and <a href="https://www.linkedin.com/in/cameronqjones">LinkedIn</a>, or email me at <a href="mailto:hello@cameronqj.com">hello@cameronqj.com</a>.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
