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.
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.
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}.
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.
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
(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.
$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 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.
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).
@@ 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.
You are a support agent. - SHOULD usually respond within 5 minutes. - Try to avoid stating a specific price.
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.You are a support agent. - MUST respond within 5 minutes. - NEVER state a specific price.
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.
You are a refund assistant. - MUST escalate every chargeback to a human. - SHOULD escalate every chargeback to a human.
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.
You are a support agent for Acme Analytics. - ALWAYS confirm the refund window before approving.
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-conflictis 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-strengthblocks 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 --jsonputs 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.
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.tgbeside it. The conversion is deterministic: form repaired without a word changed,{curly placeholders}lifted to typed$REQUIREvariables 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--outto pick the output path and--jsonfor 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:structureandannotation.typeglish scoreprints both, soruntime 79 / hygiene 20tells 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), andlogic/axis-strength(a second value on one adjective axis). AMUSTpaired with aSHOULDon the same action is the most likely new failure. Runnpx typeglish checkafter 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 isinfo: it never blocks a build. Introduce the thing on another line, or name it outright.