<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hesham Karam</title>
    <description>The latest articles on DEV Community by Hesham Karam (@hishamkaram).</description>
    <link>https://dev.to/hishamkaram</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4112221%2Fd74c4b18-07d1-424c-bd78-323bd5738f6d.jpg</url>
      <title>DEV Community: Hesham Karam</title>
      <link>https://dev.to/hishamkaram</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hishamkaram"/>
    <language>en</language>
    <item>
      <title>Claude Codex Duo: Evidence-Based Review, Debate, and Planning</title>
      <dc:creator>Hesham Karam</dc:creator>
      <pubDate>Sun, 06 Sep 2026 11:37:55 +0000</pubDate>
      <link>https://dev.to/hishamkaram/claude-codex-duo-evidence-based-review-debate-and-planning-53hl</link>
      <guid>https://dev.to/hishamkaram/claude-codex-duo-evidence-based-review-debate-and-planning-53hl</guid>
      <description>&lt;p&gt;&lt;em&gt;Three Claude Code plugins that bring Codex into a structured workflow with independent first passes and written evidence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m actively working on &lt;strong&gt;claude-codex-duo&lt;/strong&gt;, an open-source collection of Claude Code plugins for code review, technical debate, and implementation planning with OpenAI Codex.&lt;/p&gt;

&lt;p&gt;The project’s defining rule is that agreement between models does not establish whether a claim is correct. Its review workflow requires findings to be checked against evidence, and its debate workflow records the evidence behind each claim.&lt;/p&gt;

&lt;p&gt;The repository currently contains three independently installable plugins: &lt;code&gt;codex-pr-review&lt;/code&gt;, &lt;code&gt;codex-debate&lt;/code&gt;, and &lt;code&gt;codex-deep-plan&lt;/code&gt;. Each has a separate command and a defined output. &lt;a href="https://github.com/hishamkaram/claude-codex-duo" rel="noopener noreferrer"&gt;Project overview&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code review starts with a shared scope
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;codex-pr-review&lt;/code&gt; accepts a pull request, branch, commit comparison, or local uncommitted changes. It pins the review scope and builds a neutral brief before findings exist.&lt;/p&gt;

&lt;p&gt;A lead-reviewer agent and Codex receive that brief in separate contexts. Their initial reviews run concurrently. The lead’s findings are sealed, and a join gate checks the required artifacts and hashes before the workflow reads both results together.&lt;/p&gt;

&lt;p&gt;The next phase creates a reconciliation ledger. It records findings raised by both reviewers, findings unique to either reviewer, and disagreements. Duplicate findings are combined only when they share the same root cause and location.&lt;/p&gt;

&lt;p&gt;Selected findings then enter a bounded consultation. Every P0–P3 finding still requires verification, regardless of its source or whether both models agreed. The verification process calls for evidence such as a reproduction, a traced code path, or relevant test results. A withdrawn claim is checked rather than accepted as settled simply because a reviewer retracted it.&lt;/p&gt;

&lt;p&gt;The final report records one merge recommendation under an ordered policy: &lt;code&gt;BLOCK&lt;/code&gt;, &lt;code&gt;REQUEST CHANGES&lt;/code&gt;, &lt;code&gt;NEEDS CLARIFICATION&lt;/code&gt;, &lt;code&gt;APPROVE WITH COMMENTS&lt;/code&gt;, or &lt;code&gt;APPROVE&lt;/code&gt;. Refuted findings go into a false-positive appendix; unresolved findings remain visible. &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/plugins/codex-pr-review/skills/two-model-pr-review/references/adjudication.md" rel="noopener noreferrer"&gt;Review adjudication rules&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For a local review, the documented command shape is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/codex-pr-review:review-pr local HEAD "Describe the intended change"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the quoted text with the actual intent. Local mode snapshots staged, unstaged, deleted, and non-ignored untracked files through a scratch index outside the repository. It leaves the repository’s own index, refs, stash, reflog, and working files unchanged, while adding unreachable Git objects to represent the snapshot. &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/README.md#reviewing-uncommitted-changes" rel="noopener noreferrer"&gt;Local review details&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical debate keeps a claim ledger
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;codex-debate&lt;/code&gt; handles a falsifiable motion or a choice between named options. It provides three modes: &lt;code&gt;challenge&lt;/code&gt;, &lt;code&gt;compare&lt;/code&gt;, and &lt;code&gt;hypothesis&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;An illustrative comparison command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/codex-debate:debate "Option A: Redis streams vs Option B: Postgres outbox for the job queue" compare 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an invocation example, not a recommendation for either architecture.&lt;/p&gt;

&lt;p&gt;Each claim receives an ID, owner, evidence grade, and status. The grades distinguish executed evidence, traced source, cited documents, reasoning, and unsupported assertions. Unsupported assertions cannot decide the ruling.&lt;/p&gt;

&lt;p&gt;Replies must maintain a claim with evidence, retract it because of a specific fact, refine it, or commit to a concrete verification step. The protocol also defines stopping conditions and permits an unresolved result. Its final ruling includes the surviving counterargument and recorded concessions. &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/plugins/codex-debate/skills/codex-debate/references/protocol.md" rel="noopener noreferrer"&gt;Debate protocol&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Planning separates facts from inferences
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;codex-deep-plan&lt;/code&gt; accepts issue references, PR review comments, individual comment URLs, plain requests, and request files. Its evidence rules distinguish four categories: facts read at a pinned revision, results observed through execution, inferences, and unknowns.&lt;/p&gt;

&lt;p&gt;The workflow includes citation checks that resolve source references at the pinned commit and compare quoted text. Decisions require fact or execution evidence; an inference alone is insufficient support.&lt;/p&gt;

&lt;p&gt;Codex receives an independent diagnosis brief, followed by a bounded exchange over differences. The requested depth determines the process: a question produces an evidence-backed answer, while a change request produces a plan. Multiple inputs do not automatically become one PR; the workflow checks whether they share a cause or change surface.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/codex-deep-plan:plan "add rate limiting to the export endpoint" --rounds 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example requests a plan. It does not implement rate limiting. The documented handoff places the resulting change plan into Claude Code plan mode when that interface is available. &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/plugins/codex-deep-plan/commands/plan.md" rel="noopener noreferrer"&gt;Planning command&lt;/a&gt; and &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/plugins/codex-deep-plan/skills/deep-plan-duo/references/evidence-rules.md" rel="noopener noreferrer"&gt;evidence rules&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundaries matter
&lt;/h2&gt;

&lt;p&gt;The project describes its blind-review separation as &lt;strong&gt;procedural, not structural&lt;/strong&gt;. Codex’s sandbox can read temporary files and Claude Code transcripts. Independence relies on the neutral brief, separate initial contexts, sealed artifacts, and phase ordering; it is not a filesystem isolation guarantee.&lt;/p&gt;

&lt;p&gt;The plugins are designed for read-only work on the reviewed checkout. They write evidence artifacts outside the repository, and deep planning can write the plan-mode handoff file. Local review also creates the unreachable Git objects described above.&lt;/p&gt;

&lt;p&gt;Using Codex sends repository content to OpenAI. The documented workflow asks whether that is permitted before the first Codex call. If Codex is unavailable, the workflow reports the reduced mode instead of simulating a second model. &lt;a href="https://github.com/hishamkaram/claude-codex-duo/blob/0013184868efe006cafca91a2e0825fc1b2997c5/README.md" rel="noopener noreferrer"&gt;Boundaries and prerequisites&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation and a first run
&lt;/h2&gt;

&lt;p&gt;Prerequisites include Claude Code with plugins enabled, the configured OpenAI Codex plugin, Git, Python 3, and Node. GitHub-based inputs also use &lt;code&gt;gh&lt;/code&gt;. The repository documents macOS and Linux support; Windows local review is untested.&lt;/p&gt;

&lt;p&gt;Set up the Codex dependency using the repository’s prerequisite instructions, then add the marketplace and install the workflows you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude plugin marketplace add hishamkaram/claude-codex-duo
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;codex-pr-review@claude-codex-duo &lt;span class="nt"&gt;--scope&lt;/span&gt; user
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;codex-debate@claude-codex-duo &lt;span class="nt"&gt;--scope&lt;/span&gt; user
claude plugin &lt;span class="nb"&gt;install &lt;/span&gt;codex-deep-plan@claude-codex-duo &lt;span class="nt"&gt;--scope&lt;/span&gt; user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://github.com/hishamkaram/claude-codex-duo" rel="noopener noreferrer"&gt;repository&lt;/a&gt; provides the full setup, commands, artifact layouts, troubleshooting guide, and MIT license. Start with a scoped review or a concrete technical question, then inspect the resulting evidence alongside the recommendation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@hishamkaram/claude-codex-duo-evidence-based-review-debate-and-planning-8736a7f1dcf8" rel="noopener noreferrer"&gt;Originally published on Medium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: This article was drafted with AI using the linked repository documentation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Claude Code Router: Multiple Model Providers in One Claude Code Session</title>
      <dc:creator>Hesham Karam</dc:creator>
      <pubDate>Sun, 06 Sep 2026 11:35:16 +0000</pubDate>
      <link>https://dev.to/hishamkaram/claude-code-router-multiple-model-providers-in-one-claude-code-session-49ca</link>
      <guid>https://dev.to/hishamkaram/claude-code-router-multiple-model-providers-in-one-claude-code-session-49ca</guid>
      <description>&lt;p&gt;&lt;em&gt;A local Go gateway for explicit model selection, capability checks, and visible routing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m actively working on &lt;strong&gt;Claude Code Router&lt;/strong&gt;, an open-source project that connects Claude Code to first-party Anthropic models and configured external providers through a local gateway.&lt;/p&gt;

&lt;p&gt;The command-line tool is called &lt;code&gt;ccr&lt;/code&gt;. Claude Code connects to its loopback address, and CCR routes requests to the selected model. Supported provider profiles include OpenRouter, Z.AI, LiteLLM, and trusted local OpenAI-compatible endpoints. The gateway exits when the Claude Code process it launched exits.&lt;/p&gt;

&lt;p&gt;This article walks through the project’s documented workflow: configure a provider, register model aliases, switch routes within a session, and inspect what happened. &lt;a href="https://github.com/hishamkaram/claude-code-router" rel="noopener noreferrer"&gt;Project overview&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  One session, explicit model selection
&lt;/h2&gt;

&lt;p&gt;CCR separates a &lt;strong&gt;provider connection&lt;/strong&gt; from a &lt;strong&gt;model alias&lt;/strong&gt;. The connection defines the endpoint and credential source. The alias names a model route that you can select from Claude Code.&lt;/p&gt;

&lt;p&gt;That separation lets a workflow keep using an alias while its configured provider model changes. In a session with preserved Claude authentication, eligible aliases appear alongside permitted Anthropic models in the &lt;code&gt;/model&lt;/code&gt; picker. CCR also prints their exact picker IDs at launch.&lt;/p&gt;

&lt;p&gt;Switching changes the route used for subsequent work where Claude Code permits it. New subagents and workflows can inherit the active model; existing workers can remain on their original model. Picker entries are generated at launch, so changes to aliases or capability metadata require a relaunch to refresh the visible choices. &lt;a href="https://github.com/hishamkaram/claude-code-router/blob/8dd17b7d16c1a8099a643e365248d41bd04e58f1/docs/routing.md" rel="noopener noreferrer"&gt;Routing documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh40hv2rcoworkqhgmzaa.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh40hv2rcoworkqhgmzaa.gif" alt="Animated terminal recording: browsing Claude Code’s /model picker, selecting a registered CCR alias, then sending hi and receiving a reply in the same session." width="600" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Selecting a registered CCR alias in /model and continuing the conversation. Cropped excerpt; 1.5× playback.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Compatibility is part of the route
&lt;/h2&gt;

&lt;p&gt;CCR tracks provider and model capabilities before forwarding requests. Effective model facts follow a defined order: local overrides, provider discovery, then recognized model hints. Missing metadata remains unknown.&lt;/p&gt;

&lt;p&gt;An imported model starts with &lt;code&gt;degraded&lt;/code&gt; compatibility status. Importing it does not automatically certify every feature. Other statuses include &lt;code&gt;full&lt;/code&gt;, &lt;code&gt;chat-only&lt;/code&gt;, and &lt;code&gt;blocked&lt;/code&gt;; a chat-only launch disables Claude Code tools, while blocked aliases are refused.&lt;/p&gt;

&lt;p&gt;For example, the documented image-input path requires both a translatable image request and an effective capability allowing image input. If those conditions are not met, CCR rejects the request. It does not remove the image or silently send the request to another model.&lt;/p&gt;

&lt;p&gt;OpenAI Responses support is also explicit. An OpenAI-compatible endpoint is not automatically treated as a Responses endpoint. The provider and alias must be configured for that route. Managed computer use adds another requirement: an explicitly selected supported executor.&lt;/p&gt;

&lt;p&gt;These rules describe compatibility boundaries, not a promise that every provider implements every Claude Code feature. &lt;a href="https://github.com/hishamkaram/claude-code-router/blob/8dd17b7d16c1a8099a643e365248d41bd04e58f1/docs/providers.md" rel="noopener noreferrer"&gt;Provider and capability reference&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;Claude Code must already be installed and available as &lt;code&gt;claude&lt;/code&gt;. On macOS, the documented Homebrew installation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;hishamkaram/tap/claude-code-router
ccr version
ccr doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ccr doctor&lt;/code&gt; checks the local setup; it is offline by default. Then configure a provider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccr init
ccr provider add &lt;span class="nt"&gt;--interactive&lt;/span&gt;
ccr model list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wizard guides you through the provider profile, connection details, credential source, and model aliases. Providers with discovery expose a searchable model selection flow; other profiles use manual model entry. Nothing is saved until the final review completes.&lt;/p&gt;

&lt;p&gt;With working Claude subscription or Anthropic API authentication, launch with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccr launch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start on a configured provider alias, use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccr launch &lt;span class="nt"&gt;--model&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;alias&amp;gt;&lt;/code&gt; with a name from your model list. The default authentication mode preserves available Claude authentication. Without Claude authentication, an explicit provider alias allows a provider-only launch; omitting both causes launch to fail visibly. &lt;a href="https://github.com/hishamkaram/claude-code-router/blob/8dd17b7d16c1a8099a643e365248d41bd04e58f1/docs/getting-started.md" rel="noopener noreferrer"&gt;Getting-started guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspect the route, not the model’s self-description
&lt;/h2&gt;

&lt;p&gt;CCR exposes commands for inspecting configuration, compatibility, and runtime activity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ccr model show &amp;lt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
ccr model &lt;span class="nb"&gt;test&lt;/span&gt; &amp;lt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
ccr conformance run &amp;lt;&lt;span class="nb"&gt;alias&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
ccr status
ccr trace &lt;span class="nt"&gt;--follow&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The live checks contact the configured provider. Runtime records expose the observed alias, provider model, protocol, result, latency, and provider-reported token usage when available. CCR does not estimate monetary cost.&lt;/p&gt;

&lt;p&gt;The routing documentation explicitly distinguishes those observations from a model’s generated answer about its own identity. A sentence in a conversation is not the route record. &lt;a href="https://github.com/hishamkaram/claude-code-router/blob/8dd17b7d16c1a8099a643e365248d41bd04e58f1/docs/routing.md#runtime-and-lifecycle-visibility" rel="noopener noreferrer"&gt;Runtime visibility&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local state and credentials
&lt;/h2&gt;

&lt;p&gt;CCR uses SQLite for configuration and redacted operational metadata. Its documented credential choices are environment-variable references, permission-restricted key files, and the OS keychain. Raw API keys are not stored in SQLite.&lt;/p&gt;

&lt;p&gt;The documented route-history policy excludes prompts, responses, tool arguments, and authorization headers. Configuration exports also exclude credential values, keychain identifiers, and key-file paths; credentials are bound separately on the importing machine. &lt;a href="https://github.com/hishamkaram/claude-code-router/blob/8dd17b7d16c1a8099a643e365248d41bd04e58f1/docs/providers.md" rel="noopener noreferrer"&gt;Credential handling and team profiles&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore the project
&lt;/h2&gt;

&lt;p&gt;Claude Code Router brings provider configuration, model selection, compatibility checks, and route inspection into one local tool. It is written in Go and released under the MIT license.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/hishamkaram/claude-code-router" rel="noopener noreferrer"&gt;repository&lt;/a&gt; includes installation instructions, release notes, and contribution guidelines. If you try a provider route, reproducible compatibility reports are welcome: include the CCR version, model alias, and redacted diagnostic output, without credentials or private prompts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@hishamkaram/claude-code-router-multiple-model-providers-in-one-claude-code-session-57e2807581a7" rel="noopener noreferrer"&gt;Originally published on Medium&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: This article was drafted with AI using the linked repository documentation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claudecode</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
