← Tidelines/Releases

TypeGlish 0.6.0: paste the prompt you already have

The migration release. typeglish import turns the prompt you already run into checked .tg without changing one of your words, and the score card now tells you which half of your grade the model actually reads.

by TypeGlish team8 min read#releasestypeglish 0.6.0
The door in.

TL;DR 0.6.0 is the migration release: typeglish import <prompt> converts an existing prompt to checked .tg deterministically - form repaired, never a word changed, {holes} lifted to typed $REQUIRE variables, and the rest printed as a worklist grouped by plane. The score card now reports planes (runtime versus hygiene) and a hardness facet, and logic/force-subsumption makes a hedge beside a hard rule a blocking error. Upgrade with npm i -D typeglish@latest.

For five releases TypeGlish has asked you to write a new file. That is a fine ask for a new agent and a bad one for the agent you already shipped: if you have 300 lines of prompt in production, rewriting all of it by hand just to find out whether the compiler has anything useful to say is a terrible trade. 0.6.0 removes that trade. typeglish import takes the prompt you already have, in whatever shape it is in, and hands you back a .tg file that compiles, plus an ordered list of what to fix next. Ten features landed in this release and the rest of them are about reading your English more precisely, but this is the one that changes who can use the thing. Upgrade with npm i -D typeglish@latest, or run it with no install at all: npx typeglish@latest import support.md.

§1The migration engine

The new subcommand is typeglish import <file> [--out <file>] [--json], and its contract is narrow on purpose. It is deterministic: same input, same output, no model in the loop. It repairs form and never words. It lifts {curly placeholders} into declared $REQUIRE variables and rewrites the references as @{name} pointers. It reports everything else instead of touching it. And it never overwrites your input, so running it is free.

Here is a prompt of the kind that actually exists in production: a couple of polite generalities, a hard rule, a soft rule, a conditional, and two template holes that some runtime fills in.

support.md - the prompt you already have
You are a support agent for Acme Analytics.

Always be polite and professional. You should keep replies short — about 3 sentences.
Never state a specific price. Direct pricing questions to the sales team.
If the customer is angry, escalate to a human.
Look up the order number for {customer_name} in {region}.
Nothing here is malformed English. It is a perfectly readable prompt, which is exactly why nobody has ever audited it.

Point the importer at it and you get a report, not a lecture. The interesting part is the last block: the remaining work, grouped by plane.

typeglish import support.md
  1 repair (structure/em-dash x1) · lifted: customer_name, region
  0 errors · 2 warns · 2 info (was 0 · 3 · 2)

the worklist:
  syntax
    L8 warn typeglish/if-then: IF needs a THEN — write IF <condition> THEN <action>.
  optimization
    L6 warn prompt/unmeasurable: Unmeasurable rule — no observable action or bound, so nothing can check compliance. Name a
    L7 info prompt/unintroduced-definite: "the sales team" retrieves something this document never introduces - a model must guess w
    L9 info prompt/unintroduced-definite: "the order number" retrieves something this document never introduces - a model must guess
Verbatim output, with the absolute path of the written file trimmed off the first line. Read the counts: 0 errors. The (was 0 · 3 · 2) is the before-repair tally, so one warning was fixed by the repair itself. This is what the release calls the import posture: a pasted prompt is not rejected at the door. It is admitted, and then given a worklist. The two prompt/unintroduced-definite lines are the new Self-Containedness Law from §4, and the em-dash it swept is the same mark we tore a generated prompt apart for in the AI-written prompt teardown.

And here is the file it wrote. Compare it to the input line by line: the em-dash on the brevity rule became a comma, the two holes became declarations at the top with pointers at the point of use, and every single word is where you left it. No rule was reworded, reordered, added, or deleted.

support.tg - what import wrote✓ compiles
$REQUIRE variable customer_name
$REQUIRE variable region

You are a support agent for Acme Analytics.

Always be polite and professional. You should keep replies short, about 3 sentences.
Never state a specific price. Direct pricing questions to the sales team.
If the customer is angry, escalate to a human.
Look up the order number for @{customer_name} in @{region}.
The guard on this post runs the real checker against this exact block on every build and asserts it has no blocking error, which is the claim that matters: an imported prompt compiles. That restraint is deliberate. A converter that silently reworded a production prompt would be impossible to trust, and trust is the whole product. It tells you what it would change; you decide.

The practical shape of adoption, then, is: import, commit the .tg, put typeglish check in CI, and work the worklist down at whatever pace you like. You get the compiler on day one instead of after a rewrite.

§2Two planes: which half of the grade the model reads

The second theme of 0.6.0 is that every diagnostic code now declares a plane, and that turns out to matter most in the score. You saw planes already in the import worklist, which grouped findings under syntax and optimization rather than dumping them in one list. The score card does the same thing, and it answers a question that has quietly annoyed everyone using it.

typeglish score support.tg
support.tg — D (64/100)  proven errors: none  tiers: base+z3
  planes  runtime 79 (what the model reads) · hygiene 20 (source only)
  facets  enforceability 85 x.21 · hardness 80 x.12 · directness 67 x.08 · consistency 100 x.17 · structure 40 x.12 (hygiene) · annotation 0 x.12 (hygiene) · style 10 x.08 · security 100 x.08
  lever   annotation 0/100 (up to +12 overall) — Put a "@@ why" note directly above each statement ("@@ name: why" also names it).
The freshly imported file, scored. The grade is a D, and before 0.6.0 that number was all you had. Now read the line under it: runtime 79, hygiene 20. The prompt the model receives is not in bad shape at all. What is dragging the grade down is source-only discipline, mostly that the file has no @@ notes on any statement, and @@ notes are stripped at compile time. The model never sees them.

That distinction is real, not cosmetic, and you can read it straight out of typeglish --explain. The runtime plane holds enforceability, hardness, directness, consistency, style, and security: as the explainer for style puts it, "These SHIP: the flagged prose is what the model reads." The hygiene plane holds structure and annotation, and the explainer for annotation is equally blunt: "Source-only: @@ notes are stripped at compile."

Both planes are worth points, and hygiene is worth points for good reasons. An unannotated rule is a rule nobody can review, and a rule nothing references is a rule you can delete in silence. But they fail differently and you fix them at different times. A runtime problem is a live behavioral defect in the thing your customers talk to. A hygiene problem is a maintenance debt in your repo. Getting one number that averaged the two together meant you could never tell whether a mediocre grade was an emergency or a chore. Now the card says which.

§3The Hardness Doctrine: the poles bind, the middle wavers

The largest language change in 0.6.0 gives force words a geometry. Under the Hardness Doctrine, every force word sits on a spectrum with anchored opposites (must not to must, never to always, no to all), and hardness is a word's distance from the wavering center. Both ends bind: NEVER refund is exactly as hard a rule as ALWAYS refund. It is the middle that fails to commit. And a statement scores the minimum over its force words, which encodes something every prompt engineer has felt and had no name for: one hedge softens the entire rule around it.

soft.tgprompt/hedging
You are a support agent.

- SHOULD usually respond within 5 minutes.
- Try to avoid stating a specific price.
Two rules whose intent is obvious to any human reader. The card scores hardness 30 on this file, with meanHardness 0.3 and hardShare 0: not one statement commits. The checker also flags the second line prompt/hedging, which the guard on this post re-proves. "Try to avoid" is not a rule, it is a preference, and a model reading it is being told it may skip.
pole.tg✓ compiles
You are a support agent.

- MUST respond within 5 minutes.
- NEVER state a specific price.
The same two intentions, committed. hardness 100, meanHardness 1, hardShare 1, zero findings of any severity, and the whole file goes from C (67/100) to B (87/100). Nothing was added: four hedge words were deleted and two modals were moved to the pole. In the editor a statement at hardness 1.0 renders in pure bold, so the shape of your commitments is something you can now see at a glance rather than infer.

The doctrine has an enforcement half too, and this one blocks. The Opposition Law and its subalternation judge notice when a weaker rule is already fully guaranteed by a stronger one on the same force axis. MUST entails SHOULD; ALWAYS entails sometimes. Writing both does not double the emphasis, it introduces doubt about which one you meant.

refunds.tglogic/force-subsumption
You are a refund assistant.

- MUST escalate every chargeback to a human.
- SHOULD escalate every chargeback to a human.
A blocking error, with the reasoning stated: "Subsumed on the obligation axis: line 3 already guarantees this rule (must entails should for the same action), so it adds nothing but waver. Delete it, or give it a genuinely distinct scope." The two-rules-at-two-strengths defect is one we wrote up in Say it once, or say it's optional back when the quantifier version of it was all the checker could prove; 0.6.0 extends it across the deontic modals, where it is far more common. The same release also ships logic/epistemic-conflict, the certainty square's version of the same idea, for statements that make one claim at opposite confidence.

§4The Self-Containedness Law

The last theme is the one that will show up in your existing files the most, and it comes from a simple observation: a system prompt has no conversational history behind it. It is the first thing in the context. So a phrase that reaches for something the document never introduced has nothing to reach into.

refund-window.tgprompt/unintroduced-definite
You are a support agent for Acme Analytics.

- ALWAYS confirm the refund window before approving.
The checker's reading: "the refund window" retrieves something this document never introduces, so a model must guess which window is meant. Note what it did with the two nouns. Under the new classifier fuse, two adjacent nouns name one object, so "refund window" is a single thing whose head is "window", not a loose pair the checker has to puzzle over. That is why the message asks which window. This is info severity: it never blocks a build. It is the compiler telling you the prompt is pointing at something it never put on the table.

Its sibling is prompt/implied-doer, which fires once per document when a file is a pile of imperatives that never establishes who is being addressed. One declaration (You are the dispatcher.) anchors every instruction in the file. Both feed the directness facet, which 0.6.0 defines as an explicit ranking of encoded doers: imperative and you beat a named party, which beats a definite party, which beats a generic, which beats a passive, which beats a nominalization. The imported file in §1 scored directness 67 for exactly this reason, and the fix is the one we argued for in Half your rules are about somebody else: address the agent, once, in the second person.

§5Also in 0.6.0

  • The certainty square. logic/epistemic-conflict is a blocking error when two statements make the same claim at opposite certainty (definitely X against cannot X), proved the same way the quantifier square proves all against none.
  • One truth per axis. logic/axis-strength blocks when a second value on the same adjective axis is contained by the first, so "fast" written after "very fast" is dead weight rather than emphasis. It is the adjective sibling of the force and quantifier strength rules, and it follows the axis model we walked through in the brand-voice rewrite.
  • Import in a pipeline. typeglish import --json puts the whole worklist on stdout as structured data, so a migration agent can convert a directory of prompts and triage the results without scraping text.
  • The five-plane law. The plane system that surfaces in the worklist and the score card runs deeper than those two views: every diagnostic code in the compiler now declares which plane it belongs to, which is the addressing substrate the configuration system is built on.
Field note

This is the biggest release since 0.1.0: ten features, one of them a new subcommand. Two honest caveats. First, upgrading can surface new blocking errors in files that used to pass, because logic/force-subsumption, logic/epistemic-conflict, and logic/axis-strength are errors, not warnings; a MUST and a SHOULD on one action is the likeliest thing to bite. Run npx typeglish check right after you upgrade. Second, import is a converter, not a consultant: it gets your prompt through the door and names the work, and the judgment calls on that worklist are still yours. 0.6.0 also lands a set of deeper engine changes we have not demonstrated here, because they show up as more precise readings rather than as new commands: the three-plane law over lexicon, grammar, and optimization, the pronoun plane, the wide catalog's auto-named axes and manner morphology, and the transparency law with the identity fold. Those are all in the changelog on GitHub. As always, nothing here is a benchmark or an adoption number, and the checker still only fires on what it can prove. For the release that put this engine in your editor, read the 0.5.0 notes.

FAQQuestions about 0.6.0

How do I convert an existing prompt to TypeGlish?
Run typeglish import <your-prompt> and it writes a .tg beside it. The conversion is deterministic: form repaired without a word changed, {curly placeholders} lifted to typed $REQUIRE variables with @{name} pointers at the point of use, and the remaining work printed as a worklist grouped by plane. Your input is never overwritten. Use --out to pick the output path and --json for structured output.
Will import rewrite my prompt for me?
No, deliberately. It repairs form, never wording: an em-dash becomes a comma, a placeholder becomes a declaration, but no instruction is reworded, reordered, added, or deleted. Everything it thinks could be better is reported rather than applied. A tool that silently reworded a production prompt would not be trustworthy, and the worklist is more useful than a guess anyway.
What are planes in the score?
A plane says where a finding lives. The runtime plane is what the model reads: enforceability, hardness, directness, consistency, style, security. The hygiene plane is source-only discipline that compiles away: structure and annotation. typeglish score prints both, so runtime 79 / hygiene 20 tells you the prompt is fine and your @@ notes are missing, instead of leaving you to guess where a D came from.
What is the Hardness Doctrine?
A measure of how binding your language is. Force words sit on spectra with anchored opposites, hardness is the distance from the wavering middle (so both poles bind equally), and a statement takes the minimum over its force words, meaning one hedge softens the whole rule. It is a weighted score facet, so it moves your grade rather than blocking a build.
Does upgrading change how my existing files check?
It can. Three new blocking errors ship in 0.6.0: logic/force-subsumption (a hedge already guaranteed by a hard rule on the same axis), logic/epistemic-conflict (one claim at opposite certainty), and logic/axis-strength (a second value on one adjective axis). A MUST paired with a SHOULD on the same action is the most likely new failure. Run npx typeglish check after upgrading.
Why is "the order number" flagged in my prompt?
That is prompt/unintroduced-definite, from the Self-Containedness Law. A definite phrase retrieves something specific, and a system prompt has no history behind it, so if the document never introduced that thing the model must guess. It is info: it never blocks a build. Introduce the thing on another line, or name it outright.
∿ washed up Jul 27, 2026 ∿