PODSHL PublishRegister ProjectsLog SecurityNotice

What an open-source project publishes

Two files, on a host you already control. A forge, a bare nginx and a static host all serve them identically, because they are fetched as plain HTTPS and no forge API is involved.

your-project/
  .podshl/
    agent.yaml
    solutions/
      wheel-missing-for-python.md

Rather not write YAML? The builder writes both files from a form, and checks them with the same code that ingests them before you publish anything.

What it costs you

A serverNo — we mirror your files and serve from our copy
A model, or an inference billNo — your file is matched, never generated
A signing keyNo — control of the URL is the proof
A domainNo — whatever already serves your repository is enough
Answering support at 2amNo — the user's client does the reading and the acting

agent.yaml

This is the worked example the specification ships, served here as the same bytes rather than retyped — so this page cannot drift from the format it describes. Download it.

loading…

If you fix software you did not write

Most projects that would use this are in that position. A desktop environment gets the bug report when NVIDIA's driver and Wayland disagree and every window goes black — not because it is at fault, but because it is the thing the user can see. The question that stops people is not how do I write the file, it is am I allowed to name them.

Yes, and the format is built so that you cannot do anything else.

The second worked example, served as its own bytes like the first. A desktop project answering for a driver and a display protocol, owning neither. Download it.

loading…

Note the shape as well as the licence question: the decisive fact is a single environment variable — whether this is a Wayland session at all — and everything else refines it. Under X11 the same driver and the same application are fine, so a solution that matched without reading it would be advice given to the wrong half of the users. Cross-vendor problems usually turn on one reading nobody thinks to ask for.

A reading with a question attached

A probe may carry both a read and a question. The reading is tried first; the question is asked only if it comes back empty. One fact, written once, able to arrive either way — and the report tells you which happened, so an outcome that turned on an answer is not counted against a rule it never tested.

Attach choices whenever you attach a question. A bounded answer may travel to you; free text never does. Without them that fact simply never reaches you.

What you may ask to be read

Only what the read vocabulary already contains. An op or a tool outside it is refused when your file is fetched, not when a user is waiting — and the refusal names what would have been permitted.

The read vocabulary · The action vocabulary — both the same bytes the specification publishes.

Extending them is a client release, not a field you can set. That is the whole safety property: a publisher chooses an operation, it cannot ship one.

Why bother at all

You are losing bug reports you never knew you had. Someone who got stuck used to file an issue. Now they ask an assistant, get unstuck in ninety seconds and close the tab. The problem was real and it happened to hundreds of people, and you hear about none of them — so the bug stays, and the next person hits it too.

This keeps the ninety seconds and gives you the signal back. Nothing reaches you below five distinct reporters, so what arrives is a pattern rather than an anecdote, and nobody had to write a paragraph or wait for triage.

It is a sharper signal than an issue ever was. Every report says which size of model was involved. A small one running on somebody's own laptop, solving your problem out of public knowledge, means the answer was already out there and your documentation or your interface failed to convey it — a defect you can locate, rather than a knowledge gap.

What you get back

observedRead from the machine. A solution that matched on one of these and failed is a defect in your rule, and worth your time
statedThe person told us. A failure here may be nothing of the sort — they may simply have answered wrong
decided_onThe facts the answer actually turned on. Read this against stated first: that intersection is the whole question
droppedWithheld. Anything identifying never travels, whoever supplied it
descriptionFree text the user read and agreed to send — usually the error message, which is the one thing no policy can generalise for you

Getting it wrong is cheap

You cannot break a user's machine from here. The client owns both vocabularies, every action is dry-run and reversible, and the user consents per item with the refusing button holding focus. The worst outcome of a bad agent.yaml is that it is refused when fetched and you are told why.