Changelog
[v8.0.0] - 2026-10-18
MTHDS standard 8.0.0 · MTHDS Protocol 2.0.0
Highlights
Every error is a problem document a program can act on. A runner answers every error, and a CLI writes every failure, as an RFC 9457 problem document carrying a registry code, the domain of who must act, a retry verdict and a next_step, so a client branches on code rather than on a status or a message, and the protocol moves to 2.0.0. The core error registry is part of the standard. It declares every core code with its meaning, parameters and steps, is published as a JSON snapshot with each release, and gives each code a page at https://mthds.ai/errors/<code>. A lost answer can be recovered. A runner that keeps a run store serves reads of a run's status and results and honours an Idempotency-Key, so a client repeats a request instead of starting a second run.
Added
- Suggested fixes (
spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml): an error item may carrysuggested_fix, a semantic patch over a bundle rather than a text diff: afix_code, adescription, asafetyofsafeorunsafe, an optionalfile, and a list ofopsdiscriminated onkind(set_key,ensure_table,delete_key,delete_table,rename_table_key,move_key,remap_value), each addressing a table by its TOML key path. A deletion, a rename, a move or a remap whose target is absent is skipped, whileensure_tablecreates its absent table andset_keyits absent key, each skipped when the table that would hold its target is absent, so a fix that needs a missing table puts anensure_tablebefore it. An operation that would overwrite a key or a table other than its own target, such as a rename or a move onto a key its destination table already holds, is a conflict that changes nothing, as is aset_keywhose key holds a table or anensure_tablewhose path names a value other than a table, whileset_keyreplaces a scalar or array value andremap_valuerewrites its value by design. An applier that meets an operation kind it does not know applies none of the fix, which still validates against the reader-side catch-allUnknownFixOp. - The core error registry (
spec/error-registry.md,spec/openapi/mthds-error-registry.yaml,spec/openapi/mthds-error-registry.schema.json,spec/openapi/mthds-error-registry.json,spec/versioning.md,about/contributing.md): the MTHDS core registry lists every core code, theclient.family of failures a client detects itself and the catch-allruntime.unexpectedamong them, and declares for each its title, domain, retry verdict, HTTP status, the templates of its detail and of its two steps, its typed parameters, and what it means and what to do, while a JSON Schema refuses an entry with a member missing. Its JSON snapshot is published with every release of the standard, in the repository at the release's tag and as an asset of the release, and a consumer vendors that file. It lists the registered extension prefixes,pipelexamong them, the contributing guide says how to register another, and a change to the registry moves the standard version. - A page for every error code (
errors/): each core code has a page at the URL its problem'stypenames,https://mthds.ai/errors/<code>, which resolves to the page of the current standard and says what the code means, who acts, what to do, and its steps, parameters and templates, and an index lists every code by family. - Run reads and idempotency keys (
spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml,spec/versioning.md): a runner that keeps a run store declaresrun_store: trueinGET /version, servesGET /runs/{pipeline_run_id}/status, which answers a run'sstatus(pending,running,completed,failed) and its problem aserroronce it has failed, andGET /runs/{pipeline_run_id}/results, which answers a completed run with the body/executeanswers with and any other run withrun.not_finished,run.failed, carrying the run's own problem as the new core memberrun_error, orrun.results_not_stored, and honours anIdempotency-Keyheader on/executeand/start. The runner holds each key for at least 24 hours after the first request under it: the same request repeated under a key it holds runs at most once and is answered from the first execution, a different request under it is refused withrequest.idempotency_conflict, and one arriving while the first is still being handled withrequest.idempotency_key_in_use. A repeat on/executewhose run has ended, when the runner kept neither the first answer nor the run's output, is answered withrun.answer_not_kept, and the client reads the run's status instead. So a client whose answer was lost sends the request again under its key within those 24 hours, against a runner declaringrun_store: true, instead of starting a second run, and past them, where the protocol promises nothing about a repeat, it reads the run when it knows itspipeline_run_idor treats the outcome as unknown. The protocol still requires no run store.
Changed
- Run inputs files are out of the method tree (Breaking) (
spec/method-tree.md,spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml,spec/cli-io-contract.md): the membership rule keeps a file namedinputs.jsonorinputs.tomlout of every tree at any depth, so a run's inputs written into a method's folder never travel with the method, and a receiver refuses a map of file entries holding such a key. A method ships example inputs under any other name, and a tree that held such a file has a new digest. - Errors are RFC 9457 problem documents carrying the MTHDS core members (Breaking) (
spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml,spec/versioning.md): every error a runner answers is an RFC 9457application/problem+jsondocument, where the protocol named RFC 7807, and carries besidetype,title,statusanddetaila registrycode, thedomainof who must act (input,method,account,operator,runtime), aretryverdict (no,yes,outcome_unknown) with an optionalretry_after, anext_stepwhosekindis one of a closed list of steps and whosedetailis a sentence, the code's typedparams, alocation, one item per fault inerrors, and thepipeline_run_idwhen a run exists, while the protocol no longer declaresinstance. Core codes are bare, every other code starts with a prefix its owner registers with the standard,typeis derived from the code (https://mthds.ai/errors/<code>for the core), and a reader that meets a code, a domain or a step kind it does not know falls back on the code's family, then onruntimeandreport. A runner now emits these members on every error and a client branches oncode, and the protocol moves to2.0.0. /validatereports its faults as problem items (Breaking) (spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml): the invalid verdict'svalidation_errors, whose items carried acategoryand amessage, is nowerrors, a non-empty list of problem items each carrying its owncode,detail,paramsandlocationand optionallysuggestionsandsuggested_fix, and either arm may carrywarningsin the same item schema. The verdict is still a200discriminated onis_valid, and an unset member is left out rather than written asnullon every arm, warnings included. A client readserrorsand each item'scodewhere it readvalidation_errorsandcategory.missing_blobsmoves intoparams(Breaking) (spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml): a422refusing hash entries the runner does not hold is codedrequest.blobs_missingand lists the hashes inparams.missing_blobsrather than in a top-levelmissing_blobsmember. A sender readsparams.missing_blobs, which the OpenAPI document'sProblemParamstypes as a list of lowercase SHA-256 hashes, uploads each blob listed to a runner that keeps a blob store or sends those files inline to one that keeps none, and sends the request again.- The validation names are registry codes (Breaking) (
spec/mthds-format.md,language/optionality.md,implementers/validation-rules.md,spec/namespace-resolution.md):binding_step_invalidis nowmethod.binding_step_invalid,binding_path_unresolvedismethod.field_path_unresolved,invalid_input_nameismethod.identifier_invalidandoptional_marker_invalidismethod.optional_marker_invalid. The optionality diagnosticsoptional_not_handled,optional_output_required,optional_input_unguardedandoptional_branch_required_fieldare one code,method.optional_unhandled, whosesiteparameter says where the absent value escapes, and a step carrying neitherpipenorfromismethod.schema_violation. - A CLI's error is the protocol's problem document (Breaking) (
spec/cli-io-contract.md,spec/versioning.md): a method that fails on the command line writes on stderr the problem document of the protocol version that its release of the standard names, without itsstatusmember, in place of the envelope oferror: true,error_type,message,hint,error_domainandretryable, so a program readscode,domain,retry,next_stepandlocationwhere it readerror_type,error_domain,retryableandhint, and never branches on the exit code. A CLI read by a person or an agent may write a rendering of the problem, such as Markdown, while every CLI that runs a method writes the JSON form under--error-format json. A downstream method whose declared inputs the upstream's working memory cannot satisfy fails with aninput.missingproblem naming the input, where it raised an error listing what the upstream held and what the downstream expected, and when it cannot satisfy several inputs, the problem names the first in authored input order and itserrorslists every one in that order. - A failed output validation is a
pipe.output_invalidproblem (Breaking) (implementers/runtime.md): a runtime whose validation of a pipe's output against its declared concept fails reports apipe.output_invalidproblem whoselocation.pipeis the failing pipe's code and whoselocation.pathlists the pipe codes from the run's main pipe down to it, where it reported the pipe code and the step index in a form of its own. - Documentation versions served on mthds.ai: this release stops serving
7.0.0, so links into that version no longer resolve and should point at/latest/. The site serves8.0.0, which/latest/also serves, and7.0.1, and keeps both numbered directories out of search indexes, so that only/latest/is indexed.
[v7.0.1] - 2026-10-16
MTHDS standard 7.0.1 · MTHDS Protocol 1.0.0
Changed
- The bundled MTHDS schema does not check every
function_namesegment yet (mthds_schema.json): the published schema, generated by pipelex v0.87.0, rejects nothing this standard allows, but it still accepts afunction_namesegment that is not a Python identifier or is a Python keyword, and one that NFKC normalization would change, such as one holding the ligaturefi, all of which this standard rejects. A later release of this site publishes the schema of the pipelex release that checks them. - Documentation versions served on mthds.ai: this release stops serving
6.0.0, so links into that version no longer resolve and should point at/latest/. The site serves7.0.1, which/latest/also serves, and7.0.0, and keeps both numbered directories out of search indexes, so that only/latest/is indexed.
Fixed
- The bundled MTHDS schema describes
function_nameas an import path (Breaking) (mthds_schema.json): the published schema is now the one generated by pipelex v0.87.0, which describes aPipeFunc'sfunction_nameas the function's import path from the root of the method tree and refuses one with no dot, such ascapitalize, or with an empty segment, so a tool validating against it now flags a name it used to accept. This closes the first part of the gap the v7.0.0 entry names. The schema also describes a PipeDocGen'stemplate_fileas a path relative to the bundle's file that names a file inside the method tree, written with forward slashes.
[v7.0.0] - 2026-10-15
MTHDS standard 7.0.0 · MTHDS Protocol 1.0.0
Highlights
A method is the tree of files under its root, and it travels whole. A new specification page defines which files belong to a method beside its bundles, among them its Python modules, templates, images and requirements.txt, and how they are named, referenced and digested. A PipeFunc now names a function of that tree by its import path, the run and validate routes carry the whole tree as files, sending a file the runner already holds by its hash, and the lock records each package's tree digest. Because a function_name with no dot, a request carrying mthds_contents and a lock carrying hash are no longer valid, the standard moves to 7.0.0, and the protocol moves to 1.0.0.
Added
- The method tree (
spec/method-tree.md): a new specification page defines a method as the tree of files under its root, so its Python modules, templates, images,requirements.txtandREADME.mdtravel with its bundles. A file belongs unless a path segment starts with a dot, it lies in a__pycache__,node_modules, Python virtual environment, nested repository (a directory below the root holding any entry named.git) or nested package (a directory below the root holding its ownMETHODS.toml, which travels as a tree of its own), or the tree's own.gitignorefiles or the manifest'sexcludeignore it, and a symbolic link, like a.gitignorefile whose bytes are not UTF-8, is an error; the page also defines tree paths, file references resolved inside the tree with..allowed, the tree digest with itsLC_ALL=Candsha256sumreference pipeline, and the file entry that carries a file as text, as{ "base64" }or as{ "sha256", "size" }. Two tree paths whose Unicode full case foldings are equal, such asstraße.txtandSTRASSE.txt, never share a tree; patterns and file references are normalized to NFC before they are used, a reference resolving to the root, with or without a trailing/, is refused as not in the tree, and a URL in a template with a scheme, an authority or no path is not a file reference; and a map of file entries refuses a key not already in NFC, a key given twice inside an entry object, Base64 whose pad bits are not zero and asizewritten13.0. [package] exclude(spec/manifest-format.md): a manifest may list patterns in.gitignoresyntax naming files to keep out of the method tree without keeping them out of git.requirements.txt(spec/method-tree.md): a method declares the third-party Python packages its functions import in arequirements.txtat its root, one PEP 508 requirement per line, with no URL, option or include, and a runtime that cannot satisfy it should refuse the method when it loads, naming the packages.- The blob routes (
spec/protocol.md): a runner that keeps a blob store declaresblob_store: trueinGET /versionand servesPOST /blobs/missing, which answers which of a sender's blobs it lacks and where to upload each, and a runner that stores the bytes itself servesPUT /blobs/{sha256}as that upload target, so an unchanged method is sent by hash and uploads nothing.
Changed
- Run and validate requests carry the method's files (Breaking) (
spec/protocol.md,spec/openapi/mthds-protocol.openapi.yaml):POST /execute,POST /startandPOST /validatetakefiles, a map from tree path to file entry holding the method's whole tree, in place ofmthds_contents, and a request withoutpipe_codestarts at the manifest'smain_pipeor the onemain_pipeits bundles declare rather than at the first bundle's. A hash entry the runner does not hold is a422whosemissing_blobslists the hashes; a client sends{ "main.mthds": "<contents>" }where it sent["<contents>"], and the protocol moves to1.0.0. function_nameis an import path (Breaking) (spec/mthds-format.md): aPipeFuncnames its function by its Python import path from the root of the method tree, normalized to NFC and split at its last dot into a module of the tree and the function's name, so a name with no dot, which named a function registered with the runtime, is rejected, and so is a segment that NFKC normalization would change, such as one holding the ligaturefi, since Python would import another file than the tree holds. An author moves the function into a module of the method's folder and writes, for example,function_name = "funcs.text_utils.capitalize".- The root of a
.mthdsfile named alone (Breaking) (spec/method-tree.md,spec/manifest-format.md): a bundle or a directory handed over is rooted at the nearest directory holdingMETHODS.toml, found by Manifest Discovery, which now stops at an entry named.gitof any kind, a submodule's or a worktree's file and a symbolic link included; with none, a directory is its own root and a bundle named alone is a tree of that one file, so a file reference from it to a file beside it is refused. An author runs the method's directory instead, or adds aMETHODS.toml. - The lock records tree digests (Breaking) (
spec/lock-format.md): a locked entry'shashis nowdigest, the tree digest of the fetched package, replacing a byte hash that concatenated paths and contents with no separator and so could give two different directories one hash. A lock carryinghashis refused when parsed, with a message thatlockregenerates it, and no old hash is ever verified. - A fetched package is read from its commit (Breaking) (
packages/distribution.md,spec/namespace-resolution.md): a fetched package's tree is read from the resolved commit's git objects as stored, with no checkout filter, line-ending conversion orexport-ignoreapplied, and filtered by the membership rule with that commit's own.gitignorefiles, so its digest is the same on every machine and a file committed despite a pattern that matches it is out of the package. The global cache holds each package's tree and nothing else, and a reader takes a cached copy's files as the tree, as written, without applying the membership rule again. - The bundled MTHDS schema does not describe
function_nameas an import path yet (mthds_schema.json): the published schema is still the one generated by pipelex v0.82.0, which predates this release's PipeFunc change and accepts any string asfunction_name, described as the name of the function to call. It rejects nothing this standard now allows, but it still accepts afunction_namewith no dot, such ascapitalize, a segment that is not a Python identifier or is a Python keyword, and a segment that NFKC normalization would change, such as one holding the ligaturefi, all of which this standard rejects. A later release of this site publishes the schema of the pipelex release that implements the change. - Documentation versions served on mthds.ai: this release retires no version, so every link into
6.0.0keeps resolving. The site serves7.0.0, which/latest/also serves, and6.0.0, and keeps the numbered7.0.0directory out of search indexes as it does6.0.0, so that only/latest/is indexed.
[v6.0.0] - 2026-10-11
MTHDS standard 6.0.0 · MTHDS Protocol 0.7.0
Changed
- Stored names are plain input names (Breaking) (
spec/mthds-format.md): every name under which a step stores a value in working memory, namely a pipe step's or a PipeParallel branch'sresult, thebatch_asof a step or a branch, and a PipeBatch'sinput_item_name, must now take the form of a plain input name matching[a-z][a-z0-9_]*, as a binding step'sresultalready did, and a name in any other form, such asPagesora.b, is rejected asinvalid_input_name. An author renames such a name to a plain one, such aspages, along with every input, binding path,batch_overand PipeParallel output field that reads it. - The bundled MTHDS schema checks stored names (Breaking) (
mthds_schema.json): the published schema now refuses a stored name that is not a plain input name matching[a-z][a-z0-9_]*, namely a PipeSequence step's or a PipeParallel branch'sresultandbatch_as, and a PipeBatch'sinput_item_name, where it refused only the reserved_bound_prefix before, so a tool validating against it now flags a name such asresult = "Pages"orbatch_as = "a.b"that it used to accept. The schema has carried this rule since pipelex v0.80.0. - The bundled MTHDS schema describes the new PipeJudge (Breaking) (
mthds_schema.json): the published schema, now the one generated by pipelex v0.82.0, carries the PipeJudge of standard 5.0.0, which closes the gap the v5.0.0 entry names. It requiresprompt, the evidence template, beside exactly one ofquestionandquestions, and requires bothyesandnoin acriteriatable, so a PipeJudge with noprompt, one that wrote its question inpromptalone, and acriteriatable declaring one side no longer validate. It accepts a rating level written as a table oflabelanddescription(JudgeRatingLevel), every level of one scale carrying a label or none of them, and the multi form'squestions, a table of at least one question keyed by name whose values are closedJudgeQuestionBlueprinttables of a requiredquestionand optionaloptions,levels,criteriaandthreshold, those four fields being refused on the pipe itself besidequestions. It does not enforce the value rules the standard sets on those fields yet, on the pipe or on each of itsquestions: it still acceptsoptionsbesidelevels,criteriaorthresholdbeside either, fewer than two options or levels, empty option keys, levels and criteria, a level table carrying neitherlabelnordescription, and athresholdoutside the open interval from 0 to 1, all of which the standard rejects. A later release of this site publishes the schema of the pipelex release that enforces them. - Documentation versions served on mthds.ai: the site no longer serves any version older than
6.0.0, the first built with the cookie consent banner, through a new[tool.mthds.docs] floorinpyproject.tomlthat retires every published version below it, the release before the current one included. This release stops serving5.0.0,4.0.0and the formerly pinned0.10.0, so links into those versions no longer resolve and should point at/latest/. The site serves6.0.0alone.
Fixed
- Analytics on mthds.ai wait for consent: the site asks for consent before loading PostHog and before fetching the repository's star and fork counts from GitHub, with no purpose ticked in advance, and clears what PostHog stored in the browser when consent is refused or withdrawn. Its footer links the privacy policy and a "Cookie settings" link that reopens the choice.
[v5.0.0] - 2026-10-09
MTHDS standard 5.0.0 · MTHDS Protocol 0.7.0
Highlights
A PipeJudge judges the evidence its prompt presents, and can ask several questions about it at once. prompt is now the evidence template, written like a PipeLLM's prompt, and the closed question is always written in question, or as several questions whose verdicts fill one structured output. Rating levels may carry labels, which the Rating native reports, so the native set is re-pinned at 5.0.0. Because a PipeJudge written for 4.0.0 is no longer valid, the standard moves to 5.0.0, and the protocol stays at 0.7.0.
Added
- Several questions in one PipeJudge (
spec/mthds-format.md): a PipeJudge may setquestions, a table keyed by question name, instead ofquestion, and each question carries its ownoptions,levels,criteriaandthreshold. Every question is answered independently over the same evidence, and the output is a structured concept whose fields are exactly the question names, each declared as the verdict native of its question's kind or a concept that refines it. - Refusals (
spec/mthds-format.md): a judging model may refuse a question, and a refusal never becomes a verdict. Withquestion, a refused question fails the run; withquestions, it leaves its field absent when the field is optional and fails the run when the field is required. - Labelled rating levels and
Rating.label(Breaking) (spec/native-concepts.md,spec/mthds-format.md): a rating level may be a table carrying alabel, adescriptionor both, the labels of a scale being all present or all absent and distinct, and theRatingnative gains an optionallabelholding the label of the selected level, copied from the declaration. The native set is re-pinned at 5.0.0, so a crate normalized at 5.0.0 materializes the newRatingand gets a new fingerprint.
Changed
- PipeJudge judges an evidence prompt (Breaking) (
spec/mthds-format.md):promptis now a required template presenting the evidence, and the question is always written inquestion, whichpromptno longer stands for. The judging model sees only what the templates read, so every declared input must be read bypromptor by a question and an unread input is rejected, as on the other inference operators; an image or a document the prompt reads is presented with it, and a question may read neither. A PipeJudge written for 4.0.0 adds apromptthat presents its inputs, such asprompt = "@message", and one that spelled its questionpromptrenames that fieldquestion. - Yes/no criteria declare both answers (Breaking) (
spec/mthds-format.md): acriteriatable now carries bothyesandno, each non-empty, and a table declaring one side is rejected. An author who knows only when the answer is no writes the yes side as its complement. - The bundled MTHDS schema does not describe the new PipeJudge yet (
mthds_schema.json): the published schema is still the one generated by pipelex v0.75.0, which predates this release's PipeJudge changes. It rejects apromptset besidequestion, aquestionstable and a rating level written as a table, all of which this standard allows, and it still accepts a PipeJudge with noprompt, apromptstanding in for the question, andcriteriadeclaring only one side, all of which this standard rejects. A later release of this site publishes the schema of the pipelex release that implements these changes. - Documentation versions served on mthds.ai: this release stops serving
3.0.0, so links into that version no longer resolve and should point at/latest/. The site serves5.0.0,4.0.0and the pinned0.10.0.
Fixed
- What the hosted schema describes (
tooling/json-schema.md): the JSON Schema page no longer says that the hostedmthds_schema.jsonalways matches the latest standard. It now says that the schema is generated by the reference implementation, so it can lag a release of the standard that changes the language, and that the changelog entry of such a release names the changes the hosted schema does not describe yet.
[v4.0.0] - 2026-10-06
MTHDS standard 4.0.0 · MTHDS Protocol 0.7.0
Highlights
A pipe's inputs name whole concepts, and a sequence binds the fields its steps read. An input name is a plain name on every pipe, so a dotted input such as "page.page_view" = "Image" is refused, and a PipeSequence gains the binding step, which copies the value at a path into working memory under a new name, its concept derived from the declared structure the path walks. A dotted batch_over becomes a binding followed by a batch. Because a bundle that declared a dotted input is no longer valid, the standard moves to 4.0.0; the native set stays pinned at 3.0.0, and the protocol stays at 0.7.0.
Added
- The binding step (
spec/mthds-format.md): a PipeSequence step is now either a pipe step or a binding step,{ from = "invoice.total", result = "total_amount" }, which stores a deep copy of the value at a path in working memory under a new name, its concept derived before any run from the declared structure the path walks. A path crossing a list maps over every item and flattens into one list, a path reaching nothing records an absence under the optionality model rather than failing, and a bare name such asfrom = "departure_board"binds a renamed copy. A PipeParallel branch stays a pipe step, and a compliant implementation reports a malformed binding step, or one placed in a branch, asbinding_step_invalid, and a path the declared structures cannot walk asbinding_path_unresolved.
Changed
- Dotted
batch_over(Breaking) (spec/mthds-format.md): a dottedbatch_oversuch ascatalog.pagesis now defined as a binding of that path followed by a batch over the bound list, so it derives its concept, crosses lists and records absences exactly as a binding step does. A dottedbatch_overthat breaks the binding step's path grammar, or that sits on a PipeParallel branch, since a branch cannot bind, is now rejected asbinding_step_invalid, and one whose path derives a single value is rejected before any run. An author writes the path as field names separated by single dots, points the batch at a path that crosses a list, and binds the field a branch needs in the calling sequence, in a step before the PipeParallel step, so that the branch's plainbatch_overnames the bound list. Names starting with_bound_are reserved for the private names an implementation binds a dottedbatch_overunder, so a pipe step's or branch'sresult,batch_asor plainbatch_over, or a PipeBatch'sinput_item_name, taking that prefix is now rejected asinvalid_input_name, and an author renames it. - The bundled MTHDS schema (Breaking) (
mthds_schema.json): a PipeSequence step is now either a pipe step or a binding step, the binding step being a closed table offrom, which follows the path grammar, andresult, a plain input name; a PipeParallel branch is a pipe step whosebatch_overcarries no dot; a sequence step's dottedbatch_overfollows the path grammar; and everyinputstable, like a PipeBatch'sinput_list_name, accepts only plain input names matching[a-z][a-z0-9_]*. The schema also refuses the reserved_bound_prefix on the fields the specification reserves it on, and it now carries the PipeJudge blueprint, which the previous copy predated, and the PipeDocGen blueprint, which this specification does not define yet. This copy is the schema generated by pipelex v0.75.0, the release that carries these changes. - Documentation versions served on mthds.ai: this release stops serving
2.1.1, the last version left on the 2.x line, so links into that version no longer resolve and should point at/latest/. The site serves4.0.0,3.0.0and the pinned0.10.0.
Removed
- Dotted input names (Breaking) (
spec/mthds-format.md): an input name is a plainsnake_casename on every pipe, so a dotted key such as"page.page_view" = "Image"is rejected asinvalid_input_name, and so is a dottedinput_list_nameon a PipeBatch; every operator now matches a template variable to a declared input by its root alone. Every operator that handles a value according to its concept now handles a template variable according to the concept its path reaches through the root's declared concept, so PipeLLM attaches@page.page_viewonpage = "Page"as an image and PipeImgGen injects it as a reference image. A bundle that declared a dotted input declares the root with its whole concept instead and reads the field through it in the template (page = "Page", read as@page.page_view), or has the calling sequence hand the field over under a plain name with a binding step.
[v3.0.0] - 2026-10-04
MTHDS standard 3.0.0 · MTHDS Protocol 0.7.0
Highlights
A method can ask a model for a verdict, and get its uncertainty back with it. PipeJudge puts one closed question to a judging model and returns a YesNo, Choice or Rating, the native set being re-pinned at 3.0.0 to carry those verdicts. The protocol moves to 0.7.0 to list the models that serve it under a new judgment category, and a client reading a model list now keeps going when it meets a category it does not recognize.
Added
- PipeJudge (
spec/mthds-format.md): a new operator asks a judging model one closed question about its inputs — yes or no, one key out of itsoptions, or one index into itslevels— and returns the verdict as aYesNo,ChoiceorRatingcarrying whatever uncertainty the model reports, with an optionalthresholddeciding a yes. Its template field isquestion, withpromptread as a synonym, and its inputs reach the model by name as the material to judge, so unlike the other inference operators it does not reject an input its question never references. - The verdict natives
ChoiceandRating, andYesNo'sprobability(Breaking) (spec/native-concepts.md): the native set is re-pinned at 3.0.0, addingChoice(a requiredchoice, optionalconfidenceandprobabilities) andRating(a requiredlevel, optionalconfidence,probabilitiesandposition), and an optionalprobabilityonYesNo. A bundle declaring its ownChoiceorRatingconcept must rename it, since native codes are reserved, and a crate normalized at 3.0.0 materializes the newYesNoand so gets a new fingerprint. The input-form descriptor keepsYesNoaboolean, the output-form descriptor now states aYesNoas anobjectcarryingyes_noandprobability, and both stateChoiceandRatingasobjects. - The
judgmentmodel category (Breaking) (spec/protocol.md):GET /modelslists a model that servesPipeJudgeunder the categoryjudgment, and its?type=filter accepts the value; a client that checks a deck entry'stypeagainst the previous closed set fails on such an entry until it follows the reader rule below. The protocol page now defines a model category as a settings family of the language, with a table giving each category's settings family and the pipes that name its models, and the protocol adds a category in its next minor version whenever the standard adds a settings family.
Changed
- A client accepts a model category it does not recognize (Breaking) (
spec/protocol.md): a client reading a model list must not fail it because an entry carries a category it does not recognize; it keeps that entry with its raw value or leaves it out. A runner still emits only the protocol's categories, reports a vendor's own model family under an extension property, and answers an undefined?type=value with a422.spec/versioning.mdnow counts a new value of an enumerated response field as a minor protocol change, so this release'sjudgmentcategory moves the protocol to0.7.0rather than to1.0.0. - PipeImgGen, PipeSearch and PipeCompose reject a declared input they never read (Breaking) (
spec/mthds-format.md): as for PipeLLM, every declared input must be referenced by the fields that read the pipe's inputs —promptornegative_promptfor PipeImgGen,promptfor PipeSearch, the template for PipeCompose, and in construct mode everyfrompath and field template, nested constructs included — and an optional input is not exempt. A new section, Inputs Read Through Templates, states when a template variable reads an input, including a dotted input name. A bundle declaring an input one of these pipes never reads must reference it or remove it frominputs. - Documentation versions served on mthds.ai: this release stops serving
2.1.0, so links into that version no longer resolve and should point at/latest/. The site serves3.0.0,2.1.1and the pinned0.10.0.
[v2.1.1] - 2026-09-19
MTHDS standard 2.1.1 · MTHDS Protocol 0.6.0
Changed
- Documentation versions served on mthds.ai: the site now serves the current standard, the release before it and each version pinned under
[tool.mthds.docs] retaininpyproject.toml— today0.10.0, the last 0.x standard — and every deploy retires the rest, whilemake docs-retentionprints what the next deploy would keep and retire. This release stops serving2.0.0,0.9.0,0.8.0,0.7.0,0.6.0,0.5.0,0.4.1,0.4.0and the unlisted0.1.2directory, so links into those versions no longer resolve and should point at/latest/.
[v2.1.0] - 2026-09-19
MTHDS standard 2.1.0 · MTHDS Protocol 0.6.0
Highlights
A stuff has one shape wherever it travels, and the standard now says so. Every surface that carries a value — the CLI's --inputs and stdin, the --with-memory envelope, a runner's pipe_output, a file written from a working memory — spells it {"concept": "<key>", "content": …}, where the key is the string the library crate files the concept under. The concept's definition stays in the library and never travels beside the value it describes.
Changed
- A stuff's
concepton the wire is its crate key (Breaking) (spec/cli-io-contract.md): the CLI I/O Contract now states the shape a stuff takes wherever it travels —--inputs, stdin, the--with-memoryenvelope, a runner'spipe_outputand any file written from a working memory — as{"concept": "<key>", "content": …},conceptbeing the string the library crate keys the concept under:<domain>.<Code>for the method's own and native concepts,<package_address>::<domain>.<Code>for a dependency's. The concept's definition belongs to the library and never travels beside a stuff. A runtime must emit that string and must not emit an object in its place; on input it may also accept a package-qualified reference, a bare code or a bare value as a convenience. The--with-memoryexample, which showedconceptas an object, now agrees with the rule, and the protocol page says the same ofpipe_output. - Versioning (
spec/versioning.md): the CLI I/O contract joins what the standard version governs, with the reading that a wire rule leaving every authored document valid is a MINOR change marked breaking for implementations; and the shape of a stuff inside the protocol's inputs andpipe_outputis the standard's, so a change to it moves no protocol number.
Fixed
- The
RunRequestexample on the protocol page (spec/protocol.md): itsDocumentinput named the concept by its bare code and gave the content afile_pathfield the native concept does not have. It now readsnative.Documentwith aurl, the concept's one required field.
[v2.0.0] - 2026-09-14
MTHDS standard 2.0.0 · MTHDS Protocol 0.6.0
Highlights
The standard version and the specification's release version are now one number, cut at 2.0.0. The breaking changes shipped in v0.8.0, v0.9.0 and v0.10.0 were made while the standard still read 1.0.0; this release accounts for them with a major cut, writes down the rule every later release follows, and adds a check that keeps every stated copy of the two numbers in agreement. A pipe's output gets a presentation descriptor of its own, the counterpart of the input-form descriptor, so a result can be shown or typed without schema heuristics.
Added
- Versioning (
spec/versioning.md): New specification page defining how MTHDS is versioned — the standard version, which covers the language, the native set and the manifest, lock, crate and namespace formats, and the protocol version, which covers the HTTP runner contract alone and moves independently. It states what bumps each and where each is written, that a recommended extension field on the validate response does not move the protocol version, and that every changelog heading fromv2.0.0onward names the standard and protocol versions of its release. - A version-consistency check (
make version-check): every written copy of the standard and protocol versions — the versioning page, the manifest specification and guides with themthds_versionconstraints in their example manifests, the roadmap, the agent guide, the OpenAPI document, the protocol page and the changelog's topmost heading — must agree, or the check names each disagreeing site and fails. It runs inmake docs-checkon every documentation pull request and in thechangelog-checkandversion-checkrelease gates; the versions at which the native set and the intent vocabulary are pinned are excluded, since each lags the current version by design. - Output-Form Descriptor (
spec/output-form-descriptor.md): New specification for the presentation view of what a pipe resolves to — one field descriptor per pipe, stating its output's kind, nesting and constraints, so that showing a result or generating a type for it needs no schema heuristics. It reuses the input-form descriptor's field descriptor and states only what an output position changes: nopresenceand nogating, the fixed node nameoutput,requiredalwaystruewith possible absence left to the contract'soptional, and the plural wrap that makes aConcept[]output alistnode whoseitemis the element. Pipe I/O Contracts, the Input-Form Descriptor, the Library Crate Format and the.mthdsFile Format now point at it. output_formon the validate response: a recommended extension field, on the same terms aspipe_io_contractsandinput_form— a runner reporting it uses this shape under this name, and a runner omitting it is still conformant. No base field and no route changes, so the protocol version does not move.
Changed
- The standard version is the specification's release version, cut at
2.0.0(Breaking): the specification's release, its changelog heading andMTHDS_STANDARD_VERSIONin every implementation are one number, so an implementation of this release reports2.0.0. The version moves forwards rather than down to the0.xline, so a manifest constraint of>=1.0.0stays satisfiable; a crate stamped1.0.0predates native-set pinning, and re-normalizing it restamps it at the set pinned in2.0.0. - Pinned sets are identified by the version in which they last changed: an implementation of standard version
Vmaterializes the native set, and resolves the intent vocabulary, of the greatest pinned version less than or equal toV, so implementations on different patch or minor versions still byte-agree on materialized natives and on crate fingerprints. The intent vocabulary, which named itself only as "this version", is now pinned at2.0.0. - The protocol version is reconciled at
0.6.0: the conformance statement inspec/protocol.mdsaid v0.1 beside a0.6.0example, and now agrees with the OpenAPI document and the shipped client libraries. The protocol page states the protocol's own bump rule. mthds_versionexamples require>=2.0.0in the manifest specification, the manifest guide and the package-creation guide, so a package created by following the documentation declares the standard it was written against.
Fixed
- The reference runner's license on the runtime page:
implementers/runtime.mdcalledpipelex-apiMIT. It now says the runner is source-available under the Elastic License 2.0, and that the license is the implementation's alone: the standard and its OpenAPI document stay MIT, and any runtime may implement the protocol under its own terms. - The version-check workflow passes pull requests into
mainthat are not releases:exit 0in its branch-detection step ended that step rather than the job, so a non-release pull request went on to comparepyproject.tomlagainst an empty release version and failed. - Archived 2.x documentation versions are kept out of search indexes: the root
robots.txtand thenoindexheaders matched/0.only, so/2.0.0/would have been indexed as a duplicate of/latest/. Both lists now cover each major release line.
[v0.10.0] - 2026-09-02
Added
- Future Directions (
packages/future-directions.md): New page preserving the package ecosystem's ambitions — typed signature search, the Know-How Graph, signed manifests, and registry proxy/mirror chains — explicitly as non-normative directions, kept distinct from the specified system. - Schema updates for pipelex v0.55.0:
docs/mthds_schema.jsongains thehintsmembers on concepts and structure fields, theInputSlotBlueprint(the expanded input slot form), andPipeLLMBlueprint.templating_style. The pipe-leveltemplating_styleis now documented in the.mthdsfile format specification, in both its accepted forms.
Changed
- The package system specification is rewritten to the decided design. The packaging corpus — manifest, lock, resolution, crate, distribution, and registry pages — now describes one coherent, committed system rather than a mix of live rules and speculative plans.
- The package management CLI group is renamed from
mthds pkgtomthds package(breaking). - Manifest (
METHODS.toml) rules (breaking):nameis strictly required and serves as the package identity (the directory-name-match rule is deleted), andmain_pipeis auto-exported rather than requiring an explicit[exports]entry. - Version resolution commits to Minimum Version Selection (breaking): Constraints are read strictly as floors.
updateraises floors to the latest available versions and re-locks;addrecords the added dependency's latest version as the new floor. - Lock file semantics:
methods.lockis specified as a regenerable verification record with semantic identity. Entries pin a semanticfingerprint, the resolvedcommitSHA, and asourceclone URL that consistently carries its.gitsuffix. - Library crate keyspace: The multi-package keyspace uses host-relative
::address keys. Dependency-contributed entries are keyed by package address (github.com/acme/legal-tools::legal.ContractClause), so no two packages can collide. - Cross-package visibility: A reference to a dependency's non-exported pipe is diagnosed as a validation error naming the export surface, instead of being silently omitted at load time.
- Distribution and caching: The versioned reference grammar (
<address>[@<tag>]) is formalized, along with the two-cache system — the global VCS cache and the project-local method cache. - The registry specification is re-scoped to its implemented surface: index, package pages, text search, validation badges, and freshness signals.
Fixed
- The VCS fetching algorithm derives the clone URL from the repository segments. The implementer guide told implementations to prepend
https://and append.gitto the whole package address, which produces a nonexistent URL for a package in a library repository; it now follows the Clone URL Derivation rule and uses the hostname plus the first two path segments. LLMSetting.prompting_targetis gone from the language and format documentation. The field was removed from a schema whoseLLMSettingis closed, so the pages that still advertised it described input the schema rejects.- The export surface in the language guide includes manifest main pipes. A pipe made public solely by
[package].main_pipewas public per the specification and private per the guide. - The determinism and regeneration guarantees state their real precondition. Resolution and lock regeneration were described as holding under an "unchanged published tag set" and "regardless of when you run the resolver"; both are conditioned on which version tags exist and which commits they point at, since tags may be added, deleted or re-pointed. The lock file is regenerable and still the record of what was fetched — not "regenerable rather than load-bearing".
- The documentation build is gated on the pull requests that carry the work.
docs-checknow triggers on pull requests targetingdevas well asmain, andCHANGELOG.md,CODE_OF_CONDUCT.mdandLICENSEjoin the path filters, so an edit to any snippet-included repo-root file triggers the strict build.
Removed
- Deprecated schema fields:
LLMSetting.prompting_targetand itsPromptingTargetdefinition are gone from the MTHDS schema, having already been dropped from the language. - Speculative registry pages:
packages/registry-search.mdandpackages/registry-distribution.mdare removed; their implemented content merged into the registry overview and their speculative content moved to Future Directions. - Speculative registry CLI commands:
search,graph,inspectandindexare removed from the CLI reference, which now documents only the live manifest and dependency lifecycle.
[v0.9.0] - 2026-08-26
Added
- Pipe I/O Contracts (
spec/pipe-io-contracts.md): New specification for the per-pipe map of declared input and output slots, stating each slot's concept reference, presence, multiplicity, and JSON schema. A plural slot's schema is an array wrapper carryingminItems/maxItemsexactly on the fixed arm, so a stock validator enforces a declared count; concept identity is read fromconcept_ref, never sniffed out of the schema. - Input-Form Descriptor (
spec/input-form-descriptor.md): New specification for the ordered presentation view of a method's inputs — the artifact a renderer turns into a fill-in form with no schema heuristics, no hardcoded native table, and no description matching. Field kinds are assigned by ordered tables rather than inference, with a mandatoryunknownescape hatch, andgatingis kept deliberately distinct fromrequired. - Intent Hints (
spec/intent-hints.md): New specification for an optional, non-normative presentation intent layer. Ahintstable attaches to a concept, a structure field, or a pipe input slot, with one defined keyintentover a closed vocabulary (prose,label,rating,quantity). Execution and validation never read hints, and consumers that ignore them stay correct. - Library Crate Format (
spec/library-crate.md): New specification for the flat, fully-qualified, self-contained, fingerprinted snapshot a library resolves into — closure assembly, the normalization pass, the semantic-hash fingerprint, both encodings, and the sufficiency guarantee. - Native Concept Definitions (
spec/native-concepts.md): New specification pinning the normative blueprint form of every native concept per standard version. Implementations MUST materialize natives by lookup into the pinned set, never by reflection over their own runtime types — which is what makes crate fingerprints byte-agree across implementations. - Optionality (
language/optionality.md): Documented first-class presence markers for pipe inputs and outputs (?optional,!forced), recorded absences, liftable pipes, guarded template requirements, and the matching diagnostics. - Native concepts
YesNo,Date,TimeandComposite: All four now appear in the documented native set.Time(a time of day, optionally with a UTC offset) is new to the standard and joins the reserved native codes — breaking for a bundle that declared its ownTime. The other three already existed and gained the documentation they were missing. - Field types
datetimeandtime: The concept structure language gainsdatetime(a point in time, already accepted by the reference implementation but absent from the field-type table) andtime(a time of day), completing the temporal triple alongsidedate. - Expanded input slot form: An input slot may now be written as a table,
name = { concept = "Ref", hints = { ... } }, to carry intent hints and future per-slot authoring fields. The string form is unchanged and exactly equivalent to aconcept-only table. - Contract-only pipe signatures: A
[pipe.*]section may declare inputs and outputs with no implementation by omittingtype.
Changed
native.Image,native.Date,native.Html(breaking):Imageflattens its nested size object into paired optionalwidth/heightintegers;Datedeclares real structure (daterequired,timeoptional) instead of being structureless;Htmlmakescss_classoptional, leavinginner_htmlas its only required field — the requirement was a modeling accident that forced every generating pipe to invent a class name for content needing no wrapper.- PipeParallel output model: Branch results are now always combined into the pipe's declared
output, which must beCompositeor a structured concept whose fields match the branchresultnames.combined_outputis removed;add_each_outputonly exposes branch outputs individually. Concept[1]is a single value: The multiplicity suffix table read[N]as a fixed-length list for N ≥ 1, makingConcept[1]a one-item list on paper while every artifact reporting multiplicity treats it as a plain single value.[N]is now a list for N ≥ 2,[1]is a way of writingConcept, and[0]is invalid — so a fixed count on any wire is always greater than one.- Structure-field validation: A field blueprint's keys are a closed set, so a hopeful key (
minimum,examples,unit, …) is rejected rather than validating green and being silently dropped. A field MUST NOT declare bothrequired = trueanddefault_value— two contradictory instructions on one field. The long-accepted bare-string field form (summary = "A one-line summary") is now documented. - Library crate normalization: Native materialization is transitively closed — a crate carries exactly the least native set covering every native the library references and the references inside the pinned definitions themselves, since both a missing and a padded entry are wrong for a hashed member. Corrected the merged-keyspace and schema-scope claims: two packages may declare the same domain, so a bare
domain_path.Codekey is not a global identity, and a crate document is not an instance ofmthds_schema.json. - HTTP runner protocol: The validate response's
is_valid: truearm SHOULD carrypipe_io_contractsandinput_form. Base fields are unchanged and a conformant runner may omit both; what is fixed is that a runner reporting them reports those shapes under those names. - Bundled MTHDS schema: Updated the committed
mthds_schema.jsonto pipelexv0.41.0—PipeSignatureBlueprint, image-size additions, removal ofPipeParallelBlueprint.combined_output, and thedatetimeandtimefield types. That last pair is the user-visible half: a.mthdsdeclaring either was valid at runtime but rejected by this copy. - Bare pipe references (clarification): Namespace Resolution now explains why no-fall-through is load-bearing — bare references are exempt from the export visibility check precisely because they cannot leave their own domain, so a resolver falling through to other domains would make
[exports]unenforceable. The rule itself is unchanged.
Removed
type = "PipeSignature": No longer author-facing syntax. A contract-only signature omitstypeinstead.
[v0.8.0] - 2026-06-22
Removed
- Native concept
ImgGenPrompt(breaking): DroppedImgGenPromptfrom the built-in native concepts. It was structurally identical toText— a built-in concept with no distinct content payload — andPipeImgGennever depended on it. Migration: replaceImgGenPrompt(orrefines = "ImgGenPrompt") withTextin any.mthdsbundle.
Changed
- PipeImgGen documentation: Clarified the input model across the language reference and the normative spec.
PipeImgGencarries a requiredpromptstring template (plus an optionalnegative_prompt) and injects its declaredinputsinto that template —Textinputs via$variable/Jinja2 interpolation, andImageinputs (single or list) as reference images rendered to[Image N]tokens for image-to-image and editing workflows — rather than consuming a dedicated prompt concept. Added reference-image examples. Thenegative_promptis a full template likeprompt: its variables are subject to the same validation (every referenced variable must be a declared input) and the same$/@shorthand preprocessing.
Fixed
- Native-concept lists: Completed and aligned the inline native-concept lists in the validation rules, namespace resolution, and registry indexing references — they were missing
SearchResult. All native-concept lists across the docs now share one canonical order (Dynamic,Text,Image,Document,Html,TextAndImages,Number,YesNo,Date,Page,JSON,SearchResult,Anything,Composite).
[v0.7.0] - 2026-06-17
Added
- Docs analytics: Add Vercel Web Analytics to the documentation site — a deferred
/_vercel/insights/script.jssnippet that is suppressed on the 404 page (like the existing PostHog snippet) and 404s harmlessly under localmkdocs serve. - OpenAPI schemas: Add
ValidationResult,InvalidValidationReport, andValidationErrorschemas to the normative OpenAPI document to model the new/validatediagnostic response.
Changed
- Protocol version: Bump the MTHDS Protocol OpenAPI document version from
0.1.0to0.6.0. /validateendpoint: Redesign as a pure diagnostic endpoint that always returns200 OKfor a successfully evaluated bundle, whether valid or invalid. The response is a discriminated union (ValidationResult) keyed on a mandatoryis_validboolean:is_valid: true— requires runnability facts (is_runnableandpending_signatures); implementations may append custom artifacts (e.g.pipe_io_contractsin the Pipelex reference implementation).is_valid: false— carriesis_runnable: falseand a non-emptyvalidation_errorsarray of structured diagnostics (each with at least acategoryand amessage).
- 422 semantics: On
/validate, a422 Unprocessable Entitynow strictly indicates a request-shape problem (e.g. malformed JSON) or transport failure — never an invalid bundle./executeand/startstill return 422 for a bad bundle. - Documentation: Update
protocol.mdandruntime.mdto explain the new/validatebehavior and distinguish validation failures from runnability facts; updateCLAUDE.mdto reflect the analytics setup.
[v0.6.0] - 2026-06-11
- Add the MTHDS Protocol — the minimal HTTP contract every MTHDS runner implements:
POST /execute,POST /start,POST /validate,GET /models,GET /version. Normative OpenAPI document atdocs/spec/openapi/mthds-protocol.openapi.yaml(v0.1.0), prose specification page atdocs/spec/protocol.md. Paths are version-agnostic (the version segment belongs to the server base URL); errors are RFC 7807 problems;/starttakes the sameRunRequestbody as/execute;/execute200 answers withRunResultExecute(pipeline_run_id+pipe_output, both required — a completed run has output);/start202 (and the optional/execute202 degrade) answers withRunResultStart(pipeline_run_idonly). No run store in the protocol; completion delivery is implementation-defined. The protocol defines base request/response fields only — anything an implementation adds or returns on top (a client-supplied run identifier, run states, timestamps) is an extension. - The protocol page embeds a rendered route reference — every protocol route with its parameters, request bodies, and response schemas, generated at build time from the normative OpenAPI document via the
neoteroi.mkdocsoadplugin. - Add "Exposing a Runner over HTTP" section to the implementers runtime guide.
- Add
make spec-check(OpenAPI validation, wired intodocs-check).
[v0.5.0] - 2026-05-12
- Add
PipeStructureoperator: turnsText(or a concept refiningText) into a structured concept — typically via an LLM call. Accepts a single input and an optionalmodelreference; supports multiplicity on the output. - Clarify
structuring_method = "preliminary_text"onPipeLLMas a runtime directive — the standard does not prescribe HOW a runtime implements it. The reference runtime expands the pipe at load time into aPipeSequenceofPipeLLM(producingText) andPipeStructure(producing the declared output). - Document
PipeStructureacross the language reference, normative spec, validation rules, runtime guide, model references, and JSON schema pages. - Document
render_jsandinclude_raw_htmlonPipeExtract(boolean optional flags for web-page extraction: JS rendering and raw-HTML inclusion). - Document
xhighvalue onLLMSetting.reasoning_effort(sits betweenhighandmax, maps to provider-specific xhigh values where supported).
[v0.4.1] - 2026-03-30
- Fix README links to point to versioned
/latest/docs URLs - Update agent skills reference to agent plugins with correct repo URL
- Change
plxtinstall instruction frompiptouv tool install
[v0.4.0] - 2026-03-29
- Expand Document concept and PipeExtract operator to support web page URLs alongside file paths
- Add PipeExtract web page extraction example
- Define SearchResult sources: a list of source citations, each a Document with
title,url, andsnippet - Add
titleandsnippetfields to Document native concept docs - Migrate docs deployment from GitHub Pages to Vercel with versioned routing and redirects
- Add
/know-how-graph/redirect to/latest/ - Inject
<base>tags for versioned directory roots to fix asset loading - Add docs version pruning script for cleaning up old deployed versions
- Add Lighthouse performance baseline and comparison scripts
[v0.3.8] - 2026-03-19
- Enrich root index.html with real content for AI agents and scrapers (browsers still redirect instantly)
- Copy llms.txt and llms-full.txt to domain root for AI agent discovery
- Add llms.txt paths to robots.txt allowlist
[v0.3.7] - 2026-03-17
- Refine robots.txt to block specific paths (/0., /pre-release/, /404.html) instead of broad disallow
- Add multi-size favicon support (32, 128, 180, 192px) with Apple Touch Icon and Android/PWA sizes
- Support multi-version deletion in docs-delete make target
[v0.3.6] - 2026-03-17
- Add visible H1 heading and emphasize key terms on index page
- Add Pipelex reference runtime line to site footer
[v0.3.5] - 2026-03-16
- Fix sitemap.xml double-path bug (
/latest/latest/page/) by settingsite_urlto bare domain - Add root-level
sitemap.xmlgeneration for Google crawling (rewritten from versioned copy) - Fix
robots.txtto allow/sitemap.xmland pointSitemap:to root copy - Override
site_metablock inmain.htmlto hardcode/latest/canonical URLs - Suppress OG tags, JSON-LD, and analytics on 404 page
[v0.3.4] - 2026-03-15
- Fix sitemap URLs to include
/latest/prefix (was generating broken URLs without version path) - Add conditional
og:type(website on homepage, article on all other pages),og:site_name, andog:localemeta tags - Restructure JSON-LD: WebSite schema on homepage only, TechArticle on article pages only
- Replace indexable
404.mdpage with proper MkDocs 404 override (noindex, canonical, visible content) - Style root 404 fallback with grayscale palette and dark mode support
- Improve on-site search tokenization for hyphenated and dotted identifiers
[v0.3.3] - 2026-03-13
- Improve root redirect page styling for better appearance during redirect
- Add runtime requirement note to first-method getting-started guide
[v0.3.2] - 2026-03-13
- Document PipeCompose template mode: shorthand syntax (
$,@,@?), template categories, available filters, and template context - Add
@?conditional insertion pattern to PipeLLM prompt syntax reference - Add normative shorthand expansion rules to the specification
- Add preprocessor guidance and filter-per-category table to implementers runtime docs
[v0.3.1] - 2026-03-09
- Expand language docs: file naming conventions, bundle-level system prompt, refinement vs. new concept guidance, and structuring_method details
- Fix docs quality issues: nb_output example, cross-references, concept headers, and item_type
[v0.3.0] - 2026-03-04
- Add OpenGraph and Twitter Card meta tags to mike redirect template for social link previews
- Add mike plugin configuration with custom redirect template
[v0.2.1] - 2026-03-03
- Add PipeSearch operator to JSON Schema
[v0.2.0] - 2026-03-03
- Add documentation for PipeSearch operator
[v0.1.4] - 2026-03-02
Changed
- Method names: strict snake_case — the
namefield specification updated from kebab-case to snake_case (pattern[a-z][a-z0-9_]*). Directory name must match thenamefield exactly — no conversion needed. - Updated CLI I/O contract examples to use snake_case method names.
[v0.1.3] - 2026-02-26
- Add PostHog analytics to docs site
- Add Hub link to navigation
[v0.1.2] - 2026-02-26
- Update homepage with overview content
[v0.1.1] - 2026-02-25
- Change favicon and logo
[v0.1.0] - 2026-02-22
- Add hosted JSON Schema and document inline model settings and enum values
- Add update-schema make target to download latest JSON Schema from S3
[v0.0.4] - 2026-02-20
- Added github release workflow
- Fix deploy doc workflow
[v0.0.3] - 2026-02-20
- Renamed Home section first page to Overview
- Quieted check-uv and env targets for operational commands
- Refined project description
- Added /release skill and gitignore .skill artifacts
[v0.0.2] - 2026-02-19
- Polished documentation
[v0.0.1] - 2026-02-10
- Initial release