rc.2 mismatchrun_code selects the Code row by literal name, and every Code row sends typescript to the highlighter—even when the loaded runtime reports Python.

Four layers. One hardcoded answer.

Python runtimePython schema + SDK
≠
Web cardTypeScript banner

Add one narrow hint.

GenericCallView {
  card: 'generic'
  kind: 'execute'
  rawInput: 'print("hello")'
  language: 'python'
}
It isPresentation

A banner and syntax grammar hint owned by the tool that produced the call view.

It is notAuthority

It cannot choose the runtime, executable, sandbox, permission, tool, or policy.

Require the semantic tuple.

card: generic+kind: execute+rawInput: string+language: non-empty→Code row

A language string alone cannot switch card families. Unknown grammar identifiers retain the banner and fall back to plain text; they never trigger an arbitrary dynamic import.

Keep old and new peers working.

new producer · new clientView first

Use the producer-owned body and language.

old producer · new clientName fallback

Keep legacy run_code behavior.

new producer · old clientIgnore safely

The optional field does not break decode.

unknown grammarPlain body

No crash, fetch, execution, or guessed runtime.

Share one language source.

Validated CodeRuntime.language→
schemaSDKcall viewcard

Persist the producer-owned hint with the call view. A later profile switch must not relabel an already durable execution.

Six release gates.

Third-party wire names workPython no longer says TypeScriptLive and replay matchUnknown grammar stays plainPolicy never reads the hintLegacy peers remain valid

Primary evidence.

Keep the full compatibility design.

The canonical guide adds the type proposal, view-first fallback matrix, wire and replay constraints, third-party example, failure router, and twenty regression gates.

Read and star on GitHub