NL · EN
  documentation / the Patent Generator

the Patent Generator

open the generator → maze.swarp.nl/generator

Six steps from a patent class to innovation addresses: the contradiction and the shared cut counted over the corpus, the redistribution along four axes, the claim as derivation, and a test with numbers — novelty, inventive step, tension. Every patent and every candidate becomes an inhabitant of the MAZE.

documentation in four layers · maze.swarp.nl/generator · Leiden, 18 Sept 2026

This is not a flat manual but documentation in four layers, for four readers: who uses it, who wants to understand the idea, who builds it, and who wants to go further. Each layer carries a label saying how long it keeps.

lastingSurvives a rebuild — the idea, the model, the choices.
moves with the codeDescribes how it is built now — routes, sources, thresholds. This can go stale.

Layer 1 — for the user1What you do with it moves with the code

/generatorThe classtop · panel klasse

  • Choose a patent class (CPC, for instance H01M10/052 — lithium batteries). Next to it: how many patents the corpus holds, from which to which priority year, and up to which search page the harvester has come. Four tiles summarise the steps: corpus, contradiction, cut, candidates.
  • The corpus grows by itself at night (the harvester pages on, one portion per night) and every new patent immediately becomes an inhabitant of the MAZE — you find it through the search bar on the main page.

/generatorSteps 1 and 2 — countedpanel stappen

  • The contradiction: the pairs of technical parameters (Altshuller's 39) most often demanded together in the goal sentences of the class — "high capacity and long cycle life". The number is the count of patents; the top pair is the contradiction of the class. Below it the evidence sentences, each linked to the patent it comes from.
  • The shared cut: the word groups nearly every independent claim imports without deriving them ("current collector", "active material"), with their document frequency. Red = above the test threshold: a candidate may not use those terms. Below that the preamble cores (what the claims start with) and the tension: which public gauge the class is linked to (grid congestion, drought, health …). "No automatic reading" means the gauge is public but the level is read by hand.

/generatorSteps 3–6 — candidatespanel kandidaten

  • Four candidates per round, one per axis — time/phase, place, scale, condition. Each card shows the end function (what must physically happen, naming no component), the idea, the main claim in patent English and the derivation: feature ← the feature it follows from.
  • Below each card the test. Novelty: the highest cosine against every claim in the corpus, with the closest patent as a link (above 0.80 red: suspiciously close). Inventive: ✓ if the claim contains no cut term at all, ✗ with the terms found. Tension: the linked gauge. And the inhabitant link to the address in the MAZE.
  • Applicant and date stamp: every candidate carries the name (and address) of whoever ran the round, and a sha256 fingerprint over class, end function, claim, derivation, time and applicant — verifiable evidence of the date of conception. Without an own name via the API the default applicant is recorded.
  • Via SWARP (18 Sept): whoever is registered on swarp.nl (name, address, birth date/time/place in AYYA360) can harvest a class and run a round on swarp.nl/generator; SWARP calls the MAZE server-side with the key and X-Maze-Namens: swarp, after which the limit applies: 3 rounds per applicant per day, 30 per day in total, one harvest per class per hour. The candidates carry the name and address from the SWARP profile.
  • Rejected candidates (✗) remain: they are the input of the next round (the language model receives them as "previously rejected because the cut was used").

/generatorStep 0 — the corpusbottom · panel corpus

  • The patents of the class as receipts: publication number (link to the source), priority year, independent / all claims. Nothing is summarised or rewritten; the text is the office's.
  • Top right NL·EN; the theme button bottom right. The method itself is at /generator/methode (Dutch).

Layer 2 — for the thinker2The idea & the rules lasting

A patent is a closure: a claim that locks one mesh. Twenty strategic lists (the essay Where the Criteria of Innovation Go Wrong, §VIII) describe the occupied territory — the knots — because a consultation can only hear who is already an institution. The generator looks for the other thing: the loaded, open, deep mesh. For that it combines two sources each resting on tens of thousands of patents: Altshuller (a significant invention resolves a contradiction — two requirements pulling against each other at one point) and Gentzen (every derivation can be freed of its borrowed lemmas — the cut — and rebuilt self-contained).

From that follow the six steps, and the rule that keeps them honest: what can be counted is counted; what a language model does is tested by something other than that language model. The contradiction is a count over goal sentences. The cut is a document frequency. Novelty is a cosine against the whole corpus. The inventive step is a string test: if the claim uses a term the class imports as a premise, it is not self-contained — the model may not quietly rewrite that, the candidate is booked as rejected. Tension comes from outside: a public gauge, not an opinion.

The four axes of redistribution — time/phase, place, scale, condition — are Altshuller's separation principles reduced to the four coordinates of the net. The direction of the whole procedure is his law of increasing ideality: function without system. That is also the design rule of the net: set the condition so that the goal is the fixed point.

What the generator deliberately is not: a patent application, a legal opinion on novelty or inventive step (that is for an examiner and an office), proof that the candidate works. What it is: a checkable document — every step explicit, every count with its source — that yields addresses, with a date stamp.

Layer 3 — for the builder3How it works — sources, counts & API moves with the code

Context under the-maze like the bank, the Doorgang and Conflict Weather: maze/generator/corpus.mjs (step 0: Google Patents search endpoint per CPC class, paging with the page remembered in gn_klasse; per patent the page is read: title, abstract, claims with number and independent yes/no from both the EP and the US markup, CPC, priority; storage gn_octrooi; plaatsInMaze = generation-1 field signature, the tree as fallback, never an empty path, a generation-2 address at once), generator.mjs (step 1: PARAMETERS — the 39 parameters as keyword stems; per goal sentence all parameters, unordered pairs counted per patent, direction where readable; step 2: 2–4-word n-grams without stop words over the independent claims, DF, preamble cores; steps 3–5: gpt-4o with JSON answer, bound by the cut list and the previously rejected candidates; step 6: cosine via text-embedding-3-small against all claims, string test on the cut, METERS per CPC prefix; storage gn_kandidaat with applicant and fingerprint), route.mjs, methode.md. Night loop: generatorNacht() pages every class in NACHT_KLASSEN thirty patents further.

Cut threshold. Shared = DF ≥ 50%. If no n-gram reaches that (in H01M10/052 the top is around 40%), the highest threshold from 40/30/20% with at least three terms; the threshold used is stated with every test. Field coder v2.4 (18 Sept): the energy layer now also knows electrod/batter/electrochem/lithium/voltage/charg — the battery patents coded to zero (the same lesson as "photon" on 30 Aug). Existing addresses were not rewritten.

Applicant. MAZE_GENERATOR_AANVRAGER = "name, address" (environment variable) or the row aanvrager in gn_instelling (database, set via the API — nothing in code or repo); a POST with aanvrager: {naam, adres} takes precedence. Fingerprint = sha256 over {klasse, eindfunctie, as, hoofdconclusie, boom, gemaakt, aanvrager}.

GET /generatorthe page
GET /generator/methodethe six steps, operational (markdown, Dutch)
GET /api/generatorthe classes with counts, the gauges, the parameter list, the default applicant, the latest candidates
GET /api/generator/analyse?klasse=steps 1 and 2 for one class: contradictions with evidence, cut (top, shared, preambles), tension (cache 10 min)
GET /api/generator/corpus?klasse=the patents of the class: pub, title, priority, URL, claim counts, CPC
GET /api/generator/kandidaten?klasse=&n=the candidates with all steps and tests, applicant and fingerprint (newest first)
POST /api/generator/oogst{ klasse, n?, omschrijving? } — extend the corpus of a class and put the patents into the MAZE (X-Maze-Sleutel)
POST /api/generator/genereer{ klasse, aanvrager? } — one round: four candidates, tested, stored, placed as inhabitants (X-Maze-Sleutel; language-model key required)
POST /api/generator/instelling{ sleutel: "aanvrager", waarde: {naam, adres?} } — set the default applicant in the database (X-Maze-Sleutel); used whenever the environment variable is absent
GET /api/generator/limiet?naam=the daily limit for rounds on behalf of a user (3 per applicant, 30 in total per day; harvest 1 per class per hour) and what is left

Known limits. Google Patents' search endpoint ranks by relevance, not by date — the corpus is the top of that ranking, not a sample. The parameter lexicon is English and stem-based (a stem like "form" caught the verb "formed" and was dropped). The language model's candidates are generic where the corpus is thin; the value lies in the testable parts. Claim quality is no measure of patentability.

Layer 4 — for the connector4Links, sources & further moves with the code