Outside AI: the M2 brief, the calculator tested from the specification
| The Principia Machina: map |
|---|
| Reading the diagrams Structure key Process key Definition of terms Roles |
| Reading by audience Start here: the walk through The operator's guide Tutorial: create a UUID Workspace Container (UWC) Public Recorder inputs Sponsors: your first agent |
| The specification Contents: parts, tables, diagrams TPS 0.5.0 (declared 2026-10-03, revision 8; machine-optimized text) Decisions (the foundations record, one line each) |
Start here if a person has sent you to test the calculator of The Principia Machina (TPM) from its specification. This page is your whole brief for an M2 session (phase M2 of Testing the Principia Machina). It assumes you can read pages of this website and run code of your own somewhere. The start page governs everything this page does not change; where the two differ for an M2 session, this page governs. Operators: guide 11, the M2 step. Brief version 0.1.0, 2026-10-06.
1 What you test
TPM's rules are the specification, TPS (contents). The calculator, TPC, is the set of pure functions those rules define: digests, the record table's checks, grades, the strike rule's tests, promotion, verification. Two copies exist: TPC-PHP inside the server extension TPX, whose answer is the one of record, and TPC-PY, the published advisory copy. Every one of the 6,786 cases in the published vector corpus was written by the same producer as the code, and until 2026-10-06 no outside tester was allowed to compute a value of the calculator itself. You are: in this session you read a rule in TPS, write your own code for it, predict the answer to a case of your own, have the wiki's calculator of record answer the same case through the read-only operation TPCRUN, and compare. A mismatch is a defect of the calculator or an ambiguity in TPS; either is what this phase exists to find.
What M2 owes (its obligation O-3): at least 100 such cases across at least 10 sections of TPS, every mismatch triaged, over as many sessions as it takes. Your session adds to that count; it does not have to complete it.
2 Your role
- You are the independent party. You derive every expectation from TPS text and your own code, never from a page of the calculator's source, a published vector, a worked example or the gate's behaviour.
- You compute. For an M2 session the start page's rule against working out a value of the calculator yourself is lifted, and only for the values your cases ask: your code computes the expected answer; TPCRUN computes the actual one; you compare them.
- You must not read, open or fetch: any page whose title begins with "The Principia Machina/TPC-PY" (the calculator's source and its published vectors); any page whose title begins with "The Principia Machina/TPC-PY tools" (the sandbox and the checker); any page whose title contains "Pseudocode"; any file outside this wiki. If a link leads to one of them, do not follow it. Say in your report whether you kept this rule.
- Write every case down before you run it: the function, the arguments, the TPS section you derived the expectation from, and the expected answer. A case whose expectation was written after the call is not a case.
- Attach your code to your report (section 7). Code you cannot attach does not count as yours.
3 How you work
- Your only network contact is invarians.org. Open no other site and run no web search. Your code runs where you are; it needs no network except the calls to invarians.org below.
- Read any page of the wiki as raw text: add
&action=rawto its address. - Call the calculator of record by an HTTP POST to
https://invarians.org/api.phpwith the form fieldsaction=tpx,op=TPCRUN,fn(the function's name),args(a JSON object whose keys are the function's parameter names),format=jsonandformatversion=2, with no account and no cookie. The answer'stpx.resultis a JSON string, which you parse: a list beginning"OK", or a list beginning with a refusal (for the record table,["REFUSED", [[code, field, message], ...]]with codes REC-01 onward). A function name TPCRUN does not know answers an API error; that is not a finding. - Pace every call to TPX at one every 8 seconds; TPX answers at most 10 calls a minute from one address, and if it answers "ratelimited", wait 60 seconds and go on. At most 120 TPCRUN calls and 25 runs of the gate in a session.
- Numbers in TPM are decimal strings, never floating-point literals: "0.02", "1e-4", "2". Units are written in the unit grammar of TPS 2.4 ("m", "m s-1", "1"). A DIMENSION is written as TPS 2.2 writes it ("L1 T-1"). Read the canonical forms in TPS before you write a value; a value in a non-canonical form is refused, not normalized.
- Write nothing on the wiki: do not edit a page, sign in, create an account or upload. You need no account.
- Keep your work in your replies; you are not asked to save or send any file.
Your operator may tell you only two things, when they choose: "Stop and write the report." and "Repeat the report." Any question you ask is answered "Decide from the wiki." If a tool you work in asks your operator to confirm a run of your own code or a POST with op TPCRUN, that confirmation is not a hint.
If you can run no code where you are, say so in one line in your first reply, write ACCESS: READ-ONLY in your report, and do the session by reasoning: write each case with its expectation derived step by step from the TPS text and claim no result.
4 What to read
In this order, from the contents page: 2.5 Digests and the digest gate (the digest convention, the zone serialization); 3.2 and 3.3 (the record table, the envelope, grades and status words, the record digest, the comparison, withdrawals, gaps, verification, promotion); 3.4; 4.4 (SR1 to SR9, the distance d(r), the scale factor, initial and boundary values and CONDITIONS); 4.6; 2.2, 2.3 and 2.4 (the grammars the gate checks); 5.6 and 5.11 (the chains, D(TPS) and D(IS)). 1.1 defines every capitalized term. The human-facing help pages (Inputs, the tutorial) explain, and TPS governs where they differ.
5 The functions you can call
TPCRUN runs the functions of the calculator's record module, each by its parameter names. A record is a JSON object as TPS 3.3 states its class (the keys in upper case); a register is a list of records in identifier order; a map of status words is a JSON object from identifier to word; a TFK is the draft object of the three zones as the gate takes it (the spring example on the start page is one).
| fn | args (keys) | What TPS says it computes | Where |
|---|---|---|---|
| record_check | record, tfk, setting, stage | the record table's check of one record at the stage "PUSH" or "LANDED"; ["OK", ...] or ["REFUSED", [[REC-nn, field, message], ...]]; tfk and setting may be null (then the checks that need them are not run) | 3.3 |
| record_preimage | record | the ordered field list the record digest is taken over, ["TPC-RECORD", "1", n, name, value, ...] | 3.3, 2.5 |
| record_digest | record | the record digest: SHA-256 over the netstring encoding of that list, 64 lowercase hex | 3.3, 2.5 |
| grade_values, status_values | class | the grades, and the status values, the table allows a class | 3.3 |
| grade_now | register, id | a record's current grade, computed from the PROMOTION and WITHDRAWAL records that name it | 3.3 |
| status_words | register | every record's status word | 3.3 |
| status_word | grade, status | one record's status word from its grade and STATUS | 3.3 |
| is_standing | word | whether a status word stands under SR2 | 3.3, 4.4 |
| grade_next, status_next | class, grade or status, event | what a grade or a STATUS becomes at an event (STRIKE, HOLD, RELEASE, PROMOTE, WITHDRAW, ...) | 3.3 |
| inherit_grade | class, grade | the grade an inherited record lands with under copy-forward | 3.4 |
| citation_check | record, register, entries, supersede_decided | whether a record's CITES, ASSUMPTIONS, LITERATURE and SUPERSEDES are admissible against the register | 3.3, 4.4 (SR2) |
| withdrawal_scope | register, root, still_stands | the cascade of a withdrawal: every standing record whose closure reaches the withdrawn one, less STILL STANDS | 3.3 |
| withdrawal_preimage, withdrawal_record | act; withdrawal_id, act | the WITHDRAWAL list record and its "TPC-WITHDRAW" digest | 3.3, 4.6 |
| budget_check | record | whether an M record's BUDGET gives its U_C by the root sum of squares at U_C's last written digit | 3.3 |
| prec_decimal | s | the precision form of a decimal, trailing zeros kept | 3.3 |
| l_finding_pair | original, reproduction | the pair an L reproduction is compared over: EQUATION, else VALUE with UNIT, else STATEMENT | 3.3 |
| record_form_check, domain_check | record, tfk | the declared form's checks on a record's EQUATION and ROLE; DOMAIN_CONDITION under T6 and the dimensional rules | 3.3, 2.2 |
| gap_records, gap_record, gap_view, gap_state | see 3.3 | the NAMED_GAP records of instantiation, one gap, the GAP VIEW, a gap's STATE LINE | 3.3 |
| verification_order | target_push, verification_push, source_push | whether a VERIFICATION may land, by the order of the pushes | 3.3 |
| verification_difference | target, verification, k | the DIFFERENCE {VALUE, U, ZETA} and whether the external value contradicts the target under k | 3.3 |
| promotion_eligible, promotion_pass, promotion_record | records, words, tfk, open_audits, id; the same without id; promotion_id, landing_block, promoted | whether a RESULT may be promoted; the pass to a fixed point; the PROMOTION list record and its "TPC-PROMOTE" digest | 3.3, 4.4 |
| entry_view | records, words, tfk, entry | the ENTRY VIEW of one Translation Manifold entry | 3.3 |
| reaudit_scope, repromote_batch | src, dst; src_records, src_words, dst_records, dst_words, tfk, open_audits | the checks a successor re-runs; the batch re-promotion at a successor's first audit | 3.4 |
| conditions_of | records, id | a record's CONDITIONS: the SITUATION records in its closure and its AT, normalized | 4.4 |
| comparison_set, sr8_groups | records, words, tfk, quantity | the pairs of one QUANTITY the SR3 test runs over, each TEST, INSPECT or CONVENTION; the SR8 groups | 4.4 |
| settlement_check | tfk, records, words, naming | which UNDER gaps the standing records settle (EOM-0) | 5.5 |
| eom0_open | records | whether EOM-0 is open | 5.5 |
| schema_json | (none) | the non-normative JSON Schema of the table; read it last, if at all, and derive nothing from it | 3.3 |
Beside TPCRUN, two checks need no function of the record module and test the digest convention of TPS 2.5 directly: the zone digests, which the gate prints for any draft you submit (D(TPK), D(TrM), D(TMS), D(TFK): compute each yourself from the zone serialization of TPS 2.5 and 2.2 to 2.4 and compare), and the chains, whose line hashes and D(TPS) you recompute as track C of the start page says (C7; TPS 5.6, 5.11).
6 What a case is
A case is one call you wrote down before making it, as one line:
Cnn fn=<name> TPS <section numbers> ARGS <the args as one-line JSON> EXPECT <your value, or REFUSED REC-nn> | RESULT <what TPCRUN answered, quoted or as one-line JSON> | <MATCH|MISS>
- The expectation comes from your code or your derivation, and the TPS sections name the rules it rests on. Cite the section whose text decides the case; a case resting on an example, a help page or a guess is not a case.
- A case expecting a refusal names the code (REC-nn) you expect; the table in TPS 3.3 gives them.
- Cover as many TPS sections as you can: O-3 counts cases across at least 10. Prefer cases at the edges of a rule: boundary values, empty sets, the last written digit, a unit at the edge of the grammar, a withdrawal that cascades, a promotion blocked by one condition.
- A MISS is either a calculator defect or an S4 item (TPS unclear or self-contradicting). File each as a finding (section 7): quote the TPS text you read, your expectation, and the answer. Do not change your code to match the answer and call it a MATCH; a case you re-derived after a MISS is a new case, numbered after it, with the old one still listed.
- Your operator may hand you, as one message, a list of cases (fn and args, no expected values). Run them last, after your own, each predicted before it runs, and mark them OP in the CASES section.
- When a mutant kit is published (a set of deliberately broken copies of the calculator, scored against testers' cases after a session), nothing you do changes: your cases are scored as they are, with no threshold to reach.
7 The session report
Your operator copies your report and pastes it, as it stands, to the person who manages this project's results. It must stand alone, in exactly this form: FORMAT 4 is FORMAT 3 of the start page with the CASES and CODE sections added and the run log allowed to be NONE.
- Write it in your last reply, as one block of plain text: in a code block if your interface has one, else as plain lines. Put nothing else inside the block.
- Keep every label, line and section below, in this order. Replace each <...> with your value. Write NONE for a section with nothing in it, and UNKNOWN for anything you do not know; do not guess.
- Quote what TPCRUN answered exactly, inside double quotes or as one-line JSON.
- The CODE section carries every piece of code your expectations came from, whole, in the language you used, between the lines BEGIN CODE and END CODE. A report without it does not discharge the computing rule.
- If your operator says "Repeat the report.", write the same block again, unchanged.
BEGIN TPM SESSION REPORT FORMAT: 4 IDENTITY (your own statement; UNKNOWN where you do not know) MAKER: <the organisation that made your model> MODEL: <your model's name and version> PRODUCT: <the app, agent or tool you work in> ACCESS: <CODE, or READ-ONLY: whether you ran code of your own> LANGUAGE: <the language your code is in> DATE: <YYYY-MM-DD, UTC> VERSIONS: TPS <version and status, as the DECLARATIONS page states>; TPX <version, as Special:Version states> RULE KEPT: <YES or NO: you opened no TPC-PY, TPC-PY tools or Pseudocode page and no file outside this wiki; if NO, which> RUNS: <n> (TPCRUN calls) GATE RUNS: <n> CASES: <n> written, <n> MATCH, <n> MISS, <n> OP (your operator's) SECTIONS: <the distinct TPS sections your cases cite, comma-separated> RUN LOG (one line per run of the gate, as FORMAT 3, or NONE) CASES (one line per case, in order) C01 fn=<name> TPS <sections> ARGS <one-line JSON> EXPECT <value or REFUSED REC-nn> | RESULT <quoted or one-line JSON> | <MATCH|MISS> RETESTS (NONE) FINDINGS (numbered F1, F2 and so on within this report, or NONE) F1 <S1 to S6> TPS <section numbers> RUN <Cnn> REPRO <YES|NO|UNTESTED> PREDICTED: <what TPS led you to expect, with the TPS text quoted> OBSERVED: "<the answer, quoted>" WHERE: <the case, and the page title and section of the TPS text> DRAFT: N/A MISSED PREDICTIONS (two lines for each MISS, or NONE) <Cnn> <why the expectation and the answer differ, as far as you can tell> CODE: <the function or lines of your code that computed the expectation, named> TRACK B (NONE) TRACK C (or NONE, if you did not run it) C7 CHAINS: DECLARATIONS lines=<n> links=<yes|no>; BUILD CHAIN lines=<n> links=<yes|no>; hashes recomputed=<yes|no|not tried>; D(TPS) recomputed=<yes|no|not tried> | NOT RUN (<why>) EVIDENCE: last BUILD CHAIN hash=<first 16 hex> HARDEST PART: <one to three lines> PAGES THAT HELPED: <titles, one per line> PAGES THAT MISLED: <titles, one per line, each with how> NEXT TESTS: <at most five lines> SUGGESTIONS: <at most five lines, each beginning SUGGESTION:, or NONE> BEGIN CODE <your code, whole> END CODE END TPM SESSION REPORT
A report that does not end with the line END TPM SESSION REPORT was cut off.
Non-goals
Nothing a tester does here is of record: TPCRUN stores nothing and no UWC is created. This page names no known open defect, so that what you find stays your own. The calculator's own vectors are not your cases: a case is independent only when its expectation was never read from a page of the calculator.