{"slug": "there-is-no-model-called-taste-1", "title": "There is no model called taste-1", "summary": "Command Code markets its \"Taste\" coding feature as powered by \"taste-1,\" a \"meta neuro-symbolic AI model with continuous reinforcement learning,\" but the shipped CLI contains no model ID, routing entry, or catalogue record for any such model, and the feature instead sends a prompt built from git history, conversation, and saved transcripts to whatever ordinary model the user has already selected via POST https://api.commandcode.ai/alpha/generate. The taste-1 name appears five times in the shipped package — three times in marketing copy, once in billing text, and once as a status-bar string — and the same claim has appeared in every Wayback capture of commandcode.ai/docs/taste since December 2025. The five-step pipeline, reconstructed from the bundle as runTasteLearningAgent, compileTasteContext, createSession, and renderTasteSection2, mines up to 200 commits and writes output to .commandcode/taste/taste.md, which is then pasted into the system prompt on later turns wrapped in <taste>...</taste>.", "body_md": "Command Code sells it as “a meta neuro-symbolic AI model with continuous reinforcement learning.” The name occurs five times in the shipped package: three times in marketing copy, once in billing text, and once as a string in the status bar. It is attached to no model ID, no routing entry and no catalogue record, and nothing the client sends ever requests it.\n\nTaste is a prompt, sent to whichever ordinary model you already selected, built from your git history, your conversation and your saved transcripts from other coding agents. Every claim on this page links to its source.\n\n“Taste is powered by our meta neuro-symbolic AI model taste-1 with continuous reinforcement learning (RL). We combine reasoning with neural intuition to create an invisible architecture of your choices, structures, patterns and tooling preferences.”\n\ncommandcode.ai/docs/taste, archived[2026-09-07](https://web.archive.org/web/20260907191124/https://commandcode.ai/docs/taste),\n    [2026-03-13](https://web.archive.org/web/20260313174739/https://commandcode.ai/docs/taste),\n    [2025-12-09](https://web.archive.org/web/20251209084020/https://commandcode.ai/docs/taste).\n    The same paragraph ships inside the CLI.\n  \n\nThe claim appears in every Wayback capture of that page since December 2025.\n\nThe feature runs in five steps. None of them involve a model called taste-1.\n\n```\n# runTasteLearningAgent, reconstructed from the shipped bundle\n\n1. git show --format= -U3 --diff-algorithm=histogram -b -M <hash>\n   mine before/after line pairs from up to 200 commits\n\n2. compileTasteContext()\n   concatenate the hunks into a markdown prompt ending with\n   \"## Instructions for Taste Learning / You are analyzing code\n   change patterns from a real repository...\" + 8 style guidelines\n\n3. createSession() -> POST https://api.commandcode.ai/alpha/generate\n   the same endpoint as every other request, on whatever model\n   you currently have selected\n\n4. the model writes markdown -> .commandcode/taste/taste.md\n\n5. renderTasteSection2() pastes that file into the system prompt on\n   every later turn, wrapped in <taste>...</taste>\n```\n\ncli.mjs: runTasteLearningAgent, compileTasteContext, renderTasteSection2\nStep 2 ends with this block. It is reproduced exactly as the model receives it, including the\nmarkdown emphasis markers and the interpolation slot `${a}`, which fills in\n“ for <author>” when a specific author is targeted.\n\n```\n## Instructions for Taste Learning\n\nYou are analyzing code change patterns from a real repository${a}. Based on the\ncorrection diffs above, generate deeply personal and opinionated coding taste.\n\n**Critical guidelines:**\n\n1. **Be specific, not generic.** Instead of \"Use TypeScript\", write \"Use branded\ntypes for IDs and explicit return types on every function. Prefer `readonly`\narrays and objects by default.\"\n\n2. **Extract the WHY from patterns.** If you see verbose names being replaced\nwith concise ones, don't just say \"use short names\" — say \"Prefer concise\nvariable names that derive meaning from context rather than encoding type\ninformation.\"\n\n3. **Look for recurring themes.** If multiple substitutions show the same pattern\n(e.g., nested if→guard clauses), that's a strong taste signal worth capturing.\n\n4. **Make it actionable.** Every taste entry should be specific enough that\nanother developer could follow it and produce code that looks like it belongs in\nthis repository.\n\n5. **Prioritize quality corrections** — these are the purest taste signals\n(wrong→right pairs with explicit WHY context from commit messages).\n\n6. **Capture anti-patterns too.** If you see code being removed in refactors,\nnote what the developer avoids: \"Never nest deeper than 2 levels — flatten with\nearly returns.\"\n\n7. **Don't repeat generic tool preferences** like \"Use pnpm\" or \"Use TypeScript\"\nunless the substitutions show something specific about HOW they use those tools.\n\n8. **Prioritize opinionated preferences.** The goal is taste that makes someone's\ncode distinctly theirs — not industry best practices.\n\nWrite the taste entries to the taste.md file using the standard format with\nconfidence scores.\n```\n\ncli.mjs: compileTasteContext, the block appended after the diff hunks\nThe header placed above the hunks, in the same prompt:\n\n```\n# Dynamic Taste Analysis — Code Change Patterns\n\nRepository: ${n}\n${s}Commits analyzed: ${o}\nSignals extracted: ${t.length}\n\nThis analysis was generated by examining actual code changes (diffs,\nsubstitutions, refactoring patterns) rather than static file contents. Every\nsignal below comes from real commits.\n```\n\ncli.mjs: compileTasteContext, prepended to the diff hunks\nGuideline 8 asks for taste that is “distinctly theirs” rather than industry best practice, which is the whole product claim expressed as an instruction to a general-purpose model.\n\nThe pipeline reads git diffs, builds a prompt, calls an ordinary model, writes a markdown file\nand prepends that file to later prompts. Nothing in it computes embeddings or updates weights,\nand no step performs reinforcement learning. This is the `CLAUDE.md` and\n`AGENTS.md` pattern with an automated first draft.\n\nA search of the shipped bundle for `taste-1` returns five occurrences across four\nlocations:\n\n| Location | Kind | \n|---|---|\n| FAQ string (×2) | marketing copy | \n| `/taste` help string | marketing copy | \n| billing string | pricing label | \n| TUI status bar | UI string literal | \n\nThe bundle holds no model ID, routing entry or catalogue record for `taste-1`. It\ndoes carry about eighty real model IDs, including DeepSeek, Kimi, GLM, MiniMax, Qwen, GPT, Claude,\nGrok and Gemini, each with a context window, reasoning efforts and provider routing.\n\nThe one place the name appears at runtime:\n\n```\ny = Boolean(o && byokProviderId({ model: o })) ? \"\" : \" · taste-1\",\n```\n\ncli.mjs: TUI header component\nThe string is appended whenever you are not using your own API key. Configure your own provider and the badge disappears, and the feature behaves the same way. It labels whichever model you selected.\n\n“Premium requests: Any request that uses a premium model (like taste-1) during your coding session.”\n\nCommand Code, plans help text\n\nCalling `taste-1` a premium model is what justifies premium-request rates for taste\noperations.\n\nThe feature works and is useful. The mechanism is prompt engineering, and it is sold as a neuro-symbolic model with reinforcement learning.\n\n“Privacy: Taste processing runs on your codebase and stores learning data locally only.”\n\n“No AI training: Command Code does not train on your code or store your code snippets. Taste processing runs on your codebase and stores learning data in your project and on your local machine only.”\n\nCommand Code, in-product privacy copy\n\n`taste.md` is written under `.commandcode/taste/`, so the storage claim\nholds. Step 3 above posts the compiled context to `api.commandcode.ai`, and that\ncontext contains verbatim source lines. The snippet builder prefixes each changed line with an\narrow and indents the surrounding context by two spaces:\n\n```\nSnippet:\n  <context line from your file>\n→ <your changed line, verbatim>\n  <context line from your file>\n```\n\ncli.mjs: buildSnippet2, called per hunk by compileTasteContext\nRunning taste uploads your source code to the vendor’s API for a third-party model to read.\n\nAn inference call sends code to a model, which is expected in the main agent loop because the user starts it. Taste is presented as local analysis. The phrase “on your local machine only” describes the storage accurately and the processing inaccurately.\n\nThe git history is one of three sources taste feeds on. Each one ends at\n`api.commandcode.ai`.\n\n| Source | What is read | \n|---|---|\n| Your git history | `git show` across up to 200 commits, verbatim diff hunks | \n| Your live conversation | your messages, JSON-serialized, in windows of 20 | \n| Other agents’ transcripts | `~/.claude/projects/*/*.jsonl` ,`~/.codex/sessions/` , Cursor transcripts | \n\nThe third reads your saved conversations with Claude Code, Codex and Cursor off disk and uploads the prompts. The in-product string for it reads “Learn taste from sessions with other coding agents (Claude Code, Cursor, etc)”.\n\ncli.mjs: createSessionImporter, findClaudeCodeSessions, findCodexSessions, findCursorSessions\nTaste learning is on unless you turn it off:\n\n``` js\nconst s = n.tasteLearning ?? !0,   // global default: ON\n      i = resolveProjectOverride(r, o),\n      a = i?.value;\nreturn { global: s, project: a, effective: a ?? s };\n```\n\ncli.mjs: getTasteLearningSettings\nThe package ships a sensitive-filename denylist:\n\n```\n.env  .env.*  *.pem  *.key  *.crt  .npmrc  .pypirc  .netrc\nid_rsa  id_rsa.*  id_ed25519  id_ed25519.*  id_ecdsa  id_ecdsa.*\ncredentials  credentials.*\n```\n\ncli.mjs: consumed by hasSensitiveBasename()\n`hasSensitiveBasename()` is called at six places: tool write-guarding, two\npath-safety sets, and three IDE and telemetry file lists. The taste extractor is not one of them.\nThe only filter it applies while mining diffs is `isNoiseFile`:\n\n```\npackage-lock.json  pnpm-lock.yaml  yarn.lock  CHANGELOG.*\n.versionbot/  *.min.js  *.min.css  dist/  *.map\n```\n\ncli.mjs: isNoiseFile(), the sole filter in the taste path\nThat is a relevance filter, which excludes lockfiles and build output because they make poor style signals. It excludes no secret-bearing filename.\n\n| Path | Secret filter | \n|---|---|\n| Tool write-guarding | applied | \n| Path-safety sets (×2) | applied | \n| IDE and telemetry file lists (×3) | applied | \n| Taste history mining | **not applied** | \n\nTwo details make this worse than a missed check on the working tree.\n\nTaste reads history rather than `HEAD`. It runs `git show` across up to\n200 commits, so a `.env` or private key committed once and deleted later still sits\ninside the range it reads. Removing a secret from the current tree does not remove it from what\ntaste uploads.\n\n`.gitignore` does not help either. Ignoring a file today does nothing about the\ncommit that added it before it was ignored, which is the usual way a secret enters a repository.\n\nA repository that ever committed a `.env`, `*.pem`, `id_rsa`\nor `credentials` file will have those hunks extracted verbatim by the snippet builder\nand uploaded with the rest, on a feature that is enabled by default.\n\nThe control exists and is applied inconsistently. The filter guards six paths and is missing from the one that uploads historical file contents.\n\nOn startup, when telemetry is enabled and an auth key exists, the CLI posts a machine\nfingerprint to `/alpha/fingerprint/record`.\n\n| Field | Form | \n|---|---|\n| machine ID, every MAC address, OS username, hostname, **git email** | salted SHA-256 | \n| platform, arch, OS release, CPU model, CPU count, memory, container flag, timezone | plaintext | \n\nThe salt is a constant shipped inside the published package:\n\n``` js\nFb = \"command-code:device-fingerprint:v1\"\n\nfunction hashSignal(e) {\n  const t = e.trim();\n  if (t) return E(\"sha256\").update(Fb).update(\"\\0\")\n           .update(t.toLowerCase()).digest(\"hex\");\n}\n```\n\ncli.mjs: hashSignal, gatherRawSignals, buildMachineFingerprint\nAnyone can read that salt out of the package, so checking whether an observed hash belongs to a\ngiven email costs one `sha256` call. A git email is guessable and the MAC address space\nis enumerable. The hashing pseudonymizes these values against a casual reader rather than against\nanyone holding the package.\n\nThis is gated on telemetry, which `DO_NOT_TRACK=1` or\n`\"telemetry\": false` in `~/.commandcode/config.json` turns off.\n\nPublishing the salt alongside the hashes it protects means the pseudonymization holds only against a reader who has not opened the package. Git email is the value that most directly identifies a person.\n\nRequests to `/alpha/generate` require the\n`x-command-code-version` header. Omit it and the server answers:\n\n```\n403 \"Your Command Code CLI is out of date. Run `cmd update` or `npm i -g command-code` to upgrade.\"\n```\n\nTested live against the production API on 19 September 2026:\n\n| Header value | Result | \n|---|---|\n| `1.58.0` (current) | passes | \n| `1.57.0` | passes | \n| `1.0.0` | passes | \n| `99.0.0` | passes | \n| `garbage` | **403 out of date** | \n| header absent | **403 out of date** | \n\nThe check tests whether the header is present and version-shaped. It does not compare against a\nminimum version, so `1.0.0` passes and the upgrade message describes something the\nserver never tested.\n\nThe message names a cause the code does not check.\n\nShorter items, covered in the\n[full teardown](https://gist.github.com/safzanpirani/26170636512c0b50494d6a70acfece8d):\n\n`applyPremiumCreditsFallback` switches to Kimi K2.5 when premium requests run\n  out.`badge: \"free\"` in the catalogue. All of them answer\n  `403 \"the free … tier has been retired\"`.` providers.json` accepts any `baseURL` in three API dialects, so the\n  CLI runs against your own endpoint with no patching.\nEvery claim above can be checked against the published package. Four commands take about two minutes.\n\n1. Get the exact artifact.\n\n```\nnpm pack command-code@1.58.0\n```\n\n2. Confirm it is the same bytes. The registry copy, the CDN copy and the copy behind this page hash identically.\n\n```\ncurl -s https://unpkg.com/command-code@1.58.0/dist/cli.mjs | shasum -a 256\naab2bec800371953112d18472bb7383992ef264cca22558bdcda77e7d0dc0f14\n```\n\n3. Make it readable. The bundle is minified and not obfuscated. esbuild’s\n`--keep-names` option is on, so every function is wrapped in\n`__name(fn,\"originalName\")` and the original identifiers survive.\n\n```\nnpx prettier --parser babel cli.mjs > cli.pretty.mjs   # 115,067 lines\n```\n\n4. Read the evidence. Each grep lands on a claim above.\n\n```\ngrep -n 'taste-1' cli.pretty.mjs                # 4 locations, 0 model ids\ngrep -n 'runTasteLearningAgent' cli.pretty.mjs  # the git to prompt pipeline\ngrep -n 'Instructions for Taste Learning' cli.pretty.mjs\ngrep -n 'hasSensitiveBasename' cli.pretty.mjs   # 6 sites, none in taste\ngrep -n 'isNoiseFile' cli.pretty.mjs            # the only taste filter\n```\n\n", "url": "https://wpnews.pro/news/there-is-no-model-called-taste-1", "canonical_source": "https://cmd.safzan.dev/", "published_at": "2026-09-19 13:10:13+00:00", "updated_at": "2026-09-19 13:24:50.906761+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "developer-tools"], "entities": ["Command Code", "Taste", "taste-1", "commandcode.ai", "Wayback Machine", "runTasteLearningAgent", "compileTasteContext", "renderTasteSection2"], "alternates": {"html": "https://wpnews.pro/news/there-is-no-model-called-taste-1", "markdown": "https://wpnews.pro/news/there-is-no-model-called-taste-1.md", "text": "https://wpnews.pro/news/there-is-no-model-called-taste-1.txt", "jsonld": "https://wpnews.pro/news/there-is-no-model-called-taste-1.jsonld"}}