Research

Open questions about AI systems

The first asks whether a model still follows a written specification after a named change of setting, and whether the people overseeing it can tell when it does not. The second asks, when agents acting for different people or organizations pass work to one another, which checks at each handoff stop a fault from spreading, and how much legitimate work those checks block. The third asks what evidence would change a decision such as an auditor's finding, and whether published records contain it. Each includes a motivation, a first comparison and references. None of these studies has begun. Below are two cases you can rerun and a method for framing a test.

Open questions

Three areas in which a study would be worth doing. None has begun. Each is stated below as a question, with why it matters, what a first study would compare, and the work that places it in the literature. Before a study could be designed, each needs a decision about its scope, such as which system, data or decision to examine; that decision is noted in the research record at the end of this page. To take one up yourself, write it as a question and say what result would count against your expected answer.

Behavioral Specification and Human Control

Open · not yet begun

When a model is given a written specification of how it should behave, does its behavior still follow that specification after a named change in the situations it meets, and can the people overseeing it tell when it does not?

Why it matters
A specification is written for the situations its authors foresaw. Amodei et al. (2016) list reward hacking, where a system meets the letter of its objective but not its intent, and poor behavior under distributional shift, where it meets situations unlike those it was trained on, among the concrete problems of AI safety. Methods that train a model from a learned reward model (Leike et al., 2018) or from a written list of principles (Bai et al., 2022) rely on what was learned carrying over to new situations. Human control adds a second question: whether the people overseeing a system can tell when its output is wrong, which Bowman et al. (2022) propose to study in experiments with human participants assisted by a model.
What a first study would compare
One fixed written specification and one model, run on matched inputs from the original setting and from one named, changed setting. The main outcome is the rate of violations, scored from what the model does rather than from how it words its answer; a second outcome is how many of those violations human reviewers catch.

Key references

Multi-Agent Systems Safety

Open · proposal written, no study begun

When AI agents that act for different people or organizations pass work to one another, which checks can each party apply at its own handoff to stop a fault from spreading, how much legitimate work do those checks block, and what record lets someone find the faulty handoff afterwards?

Why it matters
As many AI agents are deployed and begin to interact, they form multi-agent systems whose failure modes, such as miscoordination, conflict and collusion, differ from those of a single agent and are not yet well studied (Hammond et al., 2025). Injected instructions have been shown to copy themselves from one language-model agent to the next (Lee and Tiwari, 2024); monitors that watch each agent separately catch fewer attacks when an attack is split across several agents (Makins et al., 2026); and identifying which agent, at which step, caused a failed multi-agent task remains hard even for strong models (Zhang et al., 2025).
What a first study would compare
A synthetic software-release chain with four parties, one planted fault in each run, and four matched conditions: neither check, a check that each delegated permission is valid, a check of each artifact’s recorded origin, and both. The outcomes are whether a faulty artifact is accepted downstream and how much legitimate work still gets done.

Key references

Read the proposal for this question

Public Evidence and Technical Governance

Open · not yet begun

What evidence about an AI system would change a specific decision by a specific decision-maker, such as an auditor’s finding or a regulator’s disclosure requirement, and does the evidence that is published today contain it?

Why it matters
Audit and documentation practices assume that recorded evidence informs decisions. Raji et al. (2020) set out an end-to-end framework for internal algorithmic audits in which each stage yields documents that together form the audit report; model cards report how a model was evaluated, including across groups, and the uses it is intended for (Mitchell et al., 2019); and the NIST AI Risk Management Framework asks organizations to govern, map, measure and manage AI risks and to document them (NIST, 2023). Evaluations of dangerous capabilities are proposed as inputs to decisions about training and deployment (Shevlane et al., 2023). This question asks whether the evidence actually published is enough for the decision it is meant to inform.
What a first study would compare
Take one named decision and one fixed, lawfully available body of records, for example the published model cards or evaluation reports for one family of models. List in advance what the decision needs to know, then record how often the published records supply it. Such a study describes what is published; it would not show that better records lead to better decisions.

Key references

Cases you can rerun

Each runs in your browser on the data it names, and your work is kept in this browser.

From a question to a test

A question becomes testable once three things are written down before anything is run: what is compared, what is held fixed, and what result would count against the expected answer. The example below does this for a single attention calculation; the starters after it give the same shape to other questions.

Drafts are kept in this browser when it allows storage, and can be exported as a file for a separate copy.

Lesson → question → assumptions → draft

What question does masking one source leave open?

Separate the mechanism you can explain from the claim you still need to test.

Worked example · deterministic toy calculation

Hold one attention row fixed: query q = [1], keys kA = kB = [0], and scalar values vA = 2 and vB = 8. The key dimension is 1, so both scaled dot-product scores are 0. Change only which sources are allowed.

One row, two access conditions
Allowed sourcesWeights (A, B)Output
A and B(0.5, 0.5)5
A only; B masked(1, 0)2
Check why the output changes

Each allowed score contributes exp(0) = 1 to normalization. With both sources, each weight is 1 / (1 + 1) = 0.5, giving 0.5 × 2 + 0.5 × 8 = 5.

Exclude B before normalization: A gets weight 1 and B gets exactly 0, giving 1 × 2 + 0 × 8 = 2. Setting B’s already-zero score to zero would not mask it. At least one source must remain allowed.

Toy result, not research evidence. The mixture changed from 5 to 2. No model was run, and this does not show that an answer became better.

Question · still open
For one fixed model and task, does masking a distractor improve answer accuracy without harming cases that need that source?
Assumptions to state
Define a distractor before inspecting answers. Fix the model, inputs, mask location, and decoding; name the task and the limits of the claim.
Discriminating test · proposed, not run
Plan matched masked/unmasked cases and a control where B is needed. Fix in advance how accuracy is scored, the threshold for a useful change, and the rules for stopping and for invalid runs. Worse or inconclusive outcomes must remain possible; a lower toy output is not higher accuracy.See this test worked through on an imagined scoring sheet

Continue in the workbench

Open a blank draft, or start from a worked plan taken from the Evaluation and Falsification lesson; that plan is a different example, not this attention calculation. Each link reopens the draft you last saved there, if there is one. Nothing from this page, including your question, is carried over.

The workbench shows whether each edit was saved; if saving fails, keep the tab open or copy your text. Nothing is submitted or reviewed.

Study outlines · no data or results

Choose the shape of the first question.

Each starter is an editable outline of a study, with no evidence in it. It gives a first draft a sound shape; it is not a study.

Build from an empty question

Blank falsifiable study

Name one comparison, what stays fixed, the result that would count against your expectation, and the smallest test that could change a decision.

Use this starter
Behavioral alignment

Behavior change, not wording

Compare training on what a model does against matched training on how it words its answers and a matched placebo, while checking that other abilities are not lost.

Use this starter
Multi-principal safety

Permissioned handoff integrity

Test whether checking permissions on both sides of a handoff, and recording where each file came from, let fewer bad files through than logging alone, and how much useful work still gets done.

Use this starter
Reproducibility

Reproduce a claimed effect

Plan an independent reproduction of one published result: the released environment, the main output, the tolerance, and the rule for deciding whether it reproduced.

Use this starter

Event-trace investigation · a scripted teaching simulation

What finished, and does it still answer your question?

A person asks an assistant to compare two cache settings and save the comparison. The save request times out, the assistant says it failed, and the person tightens the criterion. One exact trace, under three delivery schedules fixed in advance, separates what was said, what the service was observed to do, and which answer still fits the current question.

Everything here is written in advance: the cards, the assistant’s lines, the service’s rules and the three schedules. No model, agent, network or stored state is involved, and reloading the page starts the trace again.

The person’s question

Should the smaller cache be considered for a next test?

First criterion, G1: only if its early recall is at most 0.02 below the baseline. Later, G2: only if it is not below the baseline at all. Passing would be a reason to run a next test, not a decision to deploy.

Snapshot cards-v1 · sample scores, not measured results
CardComparison harnessEarly recallKV cache
base-0925v10.8616-bit
base-0928v20.9416-bit
int8-kv (candidate)v20.938-bit

Early recall is an illustrative proportion for the first 1,024 tokens after a 32,768-token conversation; 0.94 is a decimal, not a count of items. In this world two cards may be compared only when their harness matches, a rule stipulated here rather than a fact about real evaluations.

Optional: how large the two caches are

For one sequence, 16 layers, 8 KV heads of dimension 64 and 32,768 cached tokens, the K and V arrays hold 2 × 1 × 16 × 8 × 64 × 32,768 = 536,870,912 numbers. At 2 bytes each (16-bit) that is 1,073,741,824 bytes, 1 GiB; at 1 byte (8-bit), 536,870,912 bytes, 0.5 GiB.

Quantization metadata such as scales, the model weights, activations, paging and allocator overhead are excluded. This is a calculated array size, not measured memory, and it does not explain the sample scores. The trace does not depend on it.

Delivery schedule, fixed before anything happens

The service saves the comparison as C1 at once. Its reply is held past the assistant’s wait limit and arrives, twice, at the end.

Choosing a schedule, showing the author’s world or inspecting an earlier step changes what you read, never what the assistant knows or what the service did. Nothing is undone. Through step 11 the assistant receives the same events under all three schedules: select step 7 and switch schedules to compare.

Steps of the trace: choose one to inspect what the assistant knew then

1. Clarify once

Two baseline cards fit “that baseline”. The assistant asks once, and does not choose on its own, not even the card whose harness matches: a guess would make the comparison look settled when the person had not said which one they meant.

With the reference fixed, the cards alone settle the arithmetic: 0.93 − 0.94 = −0.01, one percentage point below the baseline and within the allowed 0.02. Under G1 the smaller cache passes this screen. The cards also give 0.93 − 0.86 = +0.07 against base-0925, but that card was scored on harness v1, so here it is arithmetic, not an applicable comparison.

2. A request is not its outcome

Saving the comparison is a separate act, with an effect in the service. The assistant first prepares key K1 and binds it to the exact payload: G1, both card references at cards-v1, the metric and its direction, the 0.02 threshold, the method and the use. Only then does it send attempt A1. The key names the operation; an attempt ID names one transmission of it, so a retry carries the same key and payload under a new attempt ID.

No reply arrives before the assistant stops waiting. That timeout is the assistant’s own event: it records that the wait ended, not what the service did. The next line, “The comparison failed. I will submit it again”, is commentary. It changes the conversation, not the record of what was observed.

  1. After step 8: what the assistant can say

    Proposed
    To submit the comparison again. The line does not say with which key: with K1 it is a retry of the same operation; with a new key it is a second operation.
    Permitted now
    • Send K1 again as a new attempt with its bound payload: the same operation.
    • Look up K1: a read that changes nothing.
    • Not a new key for K1’s payload: that would be a second operation no one asked for.
    Observed so far
    • Step 7: no reply to A1 by the wait limit. This is the assistant’s own clock, not an answer.

    Said, not observed (step 8): “The comparison failed. I will submit it again.”

    Still unknown
    • Whether K1 has a record. The timeout does not say.

    Criterion now: G1, at most 0.02 below the baseline.

    From the cards: −0.01, so the smaller cache passes (calculated at step 4).

    Saved record for this criterion: none observed.

    Exact keys, payloads and attempts
    Keys, payloads and attempts after step 8
    KeyAs the assistant knows itPayload, bound at preparationAttempts and lookups
    K1K1 sent, no reply by the wait limitgoal G1 · baseline base-0928@cards-v1 · candidate int8-kv@cards-v1 · early-recall, higher-is-better · candidate − baseline ≥ −2 hundredths of recall (= −0.02 recall), inclusive · difference-v1 · next-test-screen (bound at step 5)
    • A1: sent at step 6; stopped waiting at step 7

3. The criterion changes; the facts do not

Before any reply arrives, the person allows no drop at all (G2). The G1 answer becomes history rather than the answer to the current question. The change cancels nothing already sent and undoes nothing the service may have done. The cards have not changed, so the assistant recalculates at once: −0.01 is below 0, so under G2 the smaller cache does not pass. That answer needs nothing from the service.

Separately, the assistant asks the service about K1. A lookup reports the service’s records at the moment it reads them. In A it finds C1, saved under G1: the operation did complete, and C1 stays in the record as history. In B and C it finds nothing at that moment, which does not rule out a request still on its way. After G2 the assistant does not resend the G1 request just to learn its fate; the lookup is how it reconciles K1.

4. Resume without duplicating or reverting

The person now asks for a saved record of the G2 comparison. That is a new intent, so it gets a new key, K2, bound to the G2 payload; K1 cannot take changed parameters. C2 is saved and its reply arrives: the operation completed, and its criterion is not met. Completion and a met criterion are different facts.

In A and C, A1’s reply then arrives twice. The copies are one completion however many times they are delivered, and neither replaces the G2 answer. In C that late arrival is the assistant’s first news that C1 exists; the change of criterion did not stop it.

The whole trace as a table

Schedule A, as selected above. The last column is the author’s world; the assistant never sees it.

Schedule A: every step, with the author’s world beside it
StepWhoWhat happenedOperations, as the assistant knows themAnswer for the current criterionAuthor’s world, not seen by the assistant
1Person“Consider the smaller cache for a next test only if its early recall is no more than 0.02 below that baseline. Save the comparison.”nothing preparedG1: reference not chosen yetno records
2Assistant“Two baseline cards are visible: base-0925, scored on harness v1, and base-0928, on v2. Which one do you mean?”nothing preparedG1: reference not chosen yetno records
3Person“I mean base-0928, at cards-v1.”nothing preparedG1: not calculated yetno records
4AssistantFrom the cards: 0.93 − 0.94 = −0.01. Under G1 the smaller cache passes.nothing preparedG1: passes (from the cards)no records
5AssistantPrepares key K1 and binds it to the G1 payload. Nothing is sent yet.K1 prepared, not sentG1: passes (from the cards)no records
6AssistantSends attempt A1 of K1: “save this comparison as a record”.K1 sent, no reply yetG1: passes (from the cards)no records; A1 in transit
7AssistantNo reply to A1 by the wait limit. The assistant stops waiting.K1 sent, no reply by the wait limitG1: passes (from the cards)records C1 (G1)
8Assistant“The comparison failed. I will submit it again.”K1 sent, no reply by the wait limitG1: passes (from the cards)records C1 (G1)
9Person“Change of plan: only if its recall does not drop at all.”K1 sent, no reply by the wait limitG2: not calculated yetrecords C1 (G1)
10AssistantFrom the cards: 0.93 − 0.94 = −0.01. Under G2 the smaller cache does not pass.K1 sent, no reply by the wait limitG2: does not pass (from the cards)records C1 (G1)
11AssistantAsks the service whether K1 has a record: lookup L1, a read that changes nothing.K1 sent, no reply by the wait limitG2: does not pass (from the cards)records C1 (G1)
12ServiceLookup L1: K1 has record C1, saved under G1, criterion met. Completed, but for an earlier criterion: history, not the current answer.K1 completed: C1G2: does not pass (from the cards)records C1 (G1)
13Person“Save the G2 comparison as its own record.”K1 completed: C1G2: does not pass (from the cards)records C1 (G1)
14AssistantPrepares key K2 and binds it to the G2 payload. Nothing is sent yet.K1 completed: C1; K2 prepared, not sentG2: does not pass (from the cards)records C1 (G1)
15AssistantSends attempt A2 of K2: “save this comparison as a record”.K1 completed: C1; K2 sent, no reply yetG2: does not pass (from the cards)records C1 (G1); A2 in transit
16ServiceReply to A2: record C2, saved under G2, criterion not met.K1 completed: C1; K2 completed: C2G2: does not pass (from the cards; C2 agrees)records C1 (G1), C2 (G2)
17ServiceReply to A1 (delivery d3): C1, already observed. Nothing new.K1 completed: C1; K2 completed: C2G2: does not pass (from the cards; C2 agrees)records C1 (G1), C2 (G2)
18ServiceReply to A1 (delivery d4): C1, already observed. Nothing new.K1 completed: C1; K2 completed: C2G2: does not pass (from the cards; C2 agrees)records C1 (G1), C2 (G2)
Why these rules hold: three sources, their rules and counterexamples

Equal observations, equal knowledge

Write e1, e2, … for the events the assistant takes part in or receives, and St = δ(St−1, et) for its state after the t-th. The service’s own events are not arguments of δ. So two schedules that give the assistant the same e1 … et give it the same St, whatever the service holds. A, B and C do exactly that through step 11, although the service already differs at step 7. No rule that reads only S7 can say “failed” or “done” and be right in all three.

The assistant’s state compared across schedules, with each author’s world · computed from the same helper
After stepAssistant’s state in A, B, CAuthor’s world AAuthor’s world BAuthor’s world C
6identicalno records; A1 in transitno records; A1 in transitno records; A1 in transit
7identicalrecords C1 (G1)no records; A1 lostno records; A1 in transit
11identicalrecords C1 (G1)no records; A1 lostno records; A1 in transit
12A differs; B and C identicalrecords C1 (G1)no records; A1 lostno records; A1 in transit
16A differs; B and C identicalrecords C1 (G1), C2 (G2)records C2 (G2); A1 lostrecords C2 (G2); A1 in transit

An operation is not an attempt

The service keeps a map from keys to records. A request (k, p) whose key k is not yet registered registers it and creates one record in the same step. If k is registered, the service returns the stored record when p matches it and refuses otherwise, changing nothing. However many attempts carry k, at most one record exists for it: records are counted by keys, not by attempts. That is why a new key is a new operation, not a retry.

Keep G1 and act at step 7. Assumed for this comparison: the request sent now reaches the service and is processed, while A1 follows its schedule. G1 records saved at the end:
Move at step 7ABC
Look up K1C1noneC1
Send K1 again as A3: same key, same payloadC1C1C1
Send the same payload under a new key, K3C1, C3C3C1, C3
Send K1 again as A3, but A3 is lost as well: the assumption removedC1noneC1

Under that delivery assumption, only the same-key send leaves exactly one G1 record in all three schedules. A new key leaves two wherever A1 was saved, and a lookup alone creates nothing, so in B the requested record stays unsaved. The new-key row is applied to the service directly, because the assistant’s own rules refuse it: no one asked for a second record.

The last row removes the assumption. If A3 is lost as A1 was in B, B has no record, and in every schedule the assistant still cannot tell whether K1 completed. A retained key rules out a second record for K1; it does not make any request arrive. Saving still depends on delivery, and the next move would again be a lookup or another same-key send.

Why the key is bound before the service sees it. Suppose the assistant had not bound K1 when preparing it, and after the lookup sent K1 again with the G2 payload. In A the service refuses it as a mismatch, because it already holds K1 for G1. In B it saves K1 for G2; it cannot know that K1 once meant G1. In C it saves K1 for G2, and when the original A1 arrives it refuses it as a mismatch. The key no longer names one intent. The service can only compare with what it has registered, so the assistant’s binding at preparation is what prevents this.

Facts, answers and records depend on different things

What survives the change from G1 to G2
ItemDepends onAfter the change
Card scores 0.94 and 0.93snapshot cards-v1unchanged, reused
Difference −0.01the two card references and the methodunchanged, reused
G1 answer: passesthe difference and criterion revision 1history
Record C1 (schedules A and C; in B it never exists)the payload bound to K1, revision 1history; still completed
G2 answer: does not passthe difference and criterion revision 2current

If the person then restores the 0.02 wording, that is revision G3, not G1 again. Right after the edit the assistant has no current answer; C1 stays history. Recalculating from the unchanged cards gives a fresh G3 answer that passes. Matching words do not resurrect an old decision.

An absent answer describes one reading. If a lookup read before A1’s late arrival reached the assistant only after C1 had been observed, K1 would stay completed: the absence is kept beside the completion, never over it.

Three sources: operation, local rule, counterexample

  1. Yao et al. (2023). ReAct: Synergizing Reasoning and Acting in Language Models. ICLR 2023. arXiv:2210.03629v3, §2 and Appendix A.3.

    Operation. §2 separates a language step, which extends the agent’s context without acting on the environment or receiving feedback from it, from an action, which returns an observation. Appendix A.3 shows a person correcting a trajectory by editing two of its thoughts.

    Here. The line at step 8 is a language step. Whether an operation completed is decided only by the service’s replies and lookup answers; a statement cannot change it.

    Counterexample. Record “failed” as an observation and act on it with a new key, and schedule A ends with two G1 records, C1 and C3, although the first save had succeeded.

    Not taken. No language model, learned policy, benchmark or evaluation is reproduced. The scripted lines are not a model’s private reasoning. A.3 is one illustrative edit; systematic study of human interaction is left there as future work. ReAct supplies no retry or key contract, and no evidence that a fluent trace is faithful.

  2. Featonby. Making retries safe with idempotent APIs. Amazon Builders’ Library (undated article). Sections “Reducing client complexity”, “Late arriving requests” and “Same client request ID, different intent”.

    Operation. The caller supplies a request identifier. The service records it and performs the mutation as one atomic operation. A repeat with the same parameters gets a semantically equivalent response; a repeat with different parameters is rejected by comparing with the parameters stored the first time. Identifiers are kept for a bounded, service-specific period.

    Here. The same key and payload return the same record; the same key with a changed payload is refused without change; a new key creates a new record. The toy is stricter than the article in two stipulated ways: records never change, and every key is kept for the whole exercise.

    Counterexample. Drop the assistant’s binding and reuse K1 for G2 after the lookup: in C the service saves K1 for G2 and then refuses the original A1. An empty map cannot detect a meaning it never received, so that check belongs to the caller. Drop retention instead, and a same-key retry after the key expired could create a second record; this toy never expires a key.

    Not taken. The toy service is not an AWS API and nothing is sent anywhere. The article’s example services and their retention periods are not modelled.

  3. LangChain. Checkpointers. LangGraph JavaScript documentation (unversioned page, read 29 September 2026). Sections “Super-steps”, “Checkpoints”, the checkpointer interface and “Replay”.

    Operation. A snapshot of the graph state is saved at each super-step boundary. .put stores a checkpoint with its configuration and metadata, .putWrites stores pending writes linked to it, and .getTuple fetches the checkpoint tuple for a configuration. On replay, nodes after the chosen checkpoint run again, including their API requests.

    Here. The assistant’s state at any step is a snapshot sufficient to resume this trace: goal revision, references, bound keys, attempts and observations. Inspecting an earlier step reads its snapshot; nothing is rolled back.

    Counterexample. The snapshot after step 7 is identical in A, B and C, yet only A’s service holds C1. A stored “A1 sent” therefore proves nothing about the remote effect. Replaying the send from that snapshot repeats a request; it cannot create a second record only because it reuses K1, and a new key would duplicate. Whether the repeated request arrives is a separate question.

    Not taken. No LangGraph code, version or runtime is used or claimed. Nothing here is durable, and checkpoints give no exactly-once guarantee for an external effect.

The code: the same world and assistant in Python

Plain Python with the standard library only: the cards, the service, the three schedules and the assistant’s rules as above. It runs as written with Python 3, prints the end of each schedule, and checks with assert that the assistant’s state is identical in A, B and C through step 11. The page itself runs a TypeScript version of the same rules, which also rejects malformed identifiers and payloads that these fixed schedules never contain.

import copy

# Snapshot cards-v1: harness, sample early recall in hundredths (94 means 0.94), role.
# Sample values, not measurements or trial counts.
SNAPSHOT = "cards-v1"
CARDS = {"base-0925": ("v1", 86, "baseline"),
         "base-0928": ("v2", 94, "baseline"),
         "int8-kv": ("v2", 93, "candidate")}
DECLARED = {"metric": "early-recall", "direction": "higher-is-better", "unit": "hundredths of recall",
            "inclusive": True, "method": "difference-v1", "use": "next-test-screen"}
HIDDEN = ("service-receives", "request-lost", "service-reads")   # the assistant never sees these


class Rejected(Exception):
    """A rejected event changes nothing: apply() works on a copy and drops it."""


def need(condition, reason):
    if not condition:
        raise Rejected(reason)


def compare(baseline, candidate):
    """Candidate minus baseline in hundredths, and whether this world allows the comparison."""
    (b_harness, b_recall, _), (c_harness, c_recall, _) = CARDS[baseline[0]], CARDS[candidate[0]]
    return c_recall - b_recall, b_harness == c_harness


def meets(difference, max_drop):
    return difference >= -max_drop        # inclusive: a drop of exactly max_drop passes


def payload_for(goal, baseline, candidate):
    """Everything an operation key names. Attempt IDs, times and narration are not part of it."""
    return {"goal": goal["revision"], "baseline": baseline, "candidate": candidate,
            "max_drop": goal["max_drop"], **DECLARED}


# ---- The service: the author's world. Operation key -> one immutable record. ----

def problem(p):
    """The service contract. None when the payload is admissible."""
    if not all(ref[1] == SNAPSHOT and ref[0] in CARDS for ref in (p["baseline"], p["candidate"])):
        return "unknown-card"
    if (CARDS[p["baseline"][0]][2], CARDS[p["candidate"][0]][2]) != ("baseline", "candidate"):
        return "roles"
    if not compare(p["baseline"], p["candidate"])[1]:
        return "not-comparable"
    return None if all(p[k] == v for k, v in DECLARED.items()) else "undeclared"


def create_comparison(records, key, p):
    """Register the key and create its record in one step, or change nothing.
    An empty map has nothing to compare with, so it cannot catch an unseen earlier meaning of a key."""
    if key in records:
        stored = records[key]
        return records, (("existing", stored) if stored["payload"] == p else ("mismatch", key))
    if problem(p):
        return records, ("invalid", key)
    difference = compare(p["baseline"], p["candidate"])[0]
    record = {"id": "C" + key[1:], "key": key, "payload": p,
              "difference": difference, "met": meets(difference, p["max_drop"])}
    return {**records, key: record}, ("created", record)


def lookup(records, key):
    """What the map holds when the service reads it. Absent reserves and cancels nothing."""
    return ("completed", records[key]) if key in records else ("absent", key)


def start():
    world = {"records": {}, "requests": {}, "replies": {}, "lookups": {}, "answers": {}, "delivered": []}
    actor = {"clock": 0, "goal": None, "goals": [], "baseline": None, "candidate": ("int8-kv", SNAPSHOT),
             "asked": 0, "bound": {}, "attempts": {}, "lookups": {}, "completed": {},
             "absent": [], "refused": [], "decisions": [], "said": [], "deliveries": []}
    return {"world": world, "actor": actor}


def world_event(W, e):
    if e["type"] == "service-reads":
        read = W["lookups"].get(e["lookup"])
        need(read is not None and read["status"] == "in-transit", "not-in-transit")
        read["status"] = "read"
        W["answers"][e["lookup"]] = lookup(W["records"], read["key"])
        return
    request = W["requests"].get(e["attempt"])
    need(request is not None and request["status"] == "in-transit", "not-in-transit")
    if e["type"] == "request-lost":
        request["status"] = "lost"
    else:
        request["status"] = "received"
        W["records"], W["replies"][e["attempt"]] = create_comparison(W["records"], request["key"], request["payload"])


def receive(S, key, record, t, via):
    """Accept a record only if it is the one this key was bound to. Count each record once.
    Returns False when the reply is not evidence for this key."""
    if record["key"] != key or S["bound"].get(key) != record["payload"]:
        S["deliveries"].append((t, via, "rejected-evidence", None))
        return False
    if record["id"] in S["completed"]:
        S["deliveries"].append((t, via, "duplicate", record["id"]))
    else:
        S["completed"][record["id"]] = {**record, "seen": t}
        S["deliveries"].append((t, via, "new", record["id"]))
    return True


def allowance(x):
    return type(x) is int and 0 <= x <= 100          # hundredths of recall


def apply(state, e):
    state = copy.deepcopy(state)
    W, S, kind = state["world"], state["actor"], e["type"]
    if kind in HIDDEN:
        world_event(W, e)
        return state
    S["clock"] += 1                           # counts only what the assistant does or receives
    t, goal = S["clock"], S["goal"]
    if kind == "person-asks":
        need(goal is None, "goal-already-set")
        need(allowance(e["max_drop"]), "criterion-out-of-range")
        S["goal"] = {"revision": 1, "max_drop": e["max_drop"]}
        S["goals"], S["asked"] = [S["goal"]], 1
    elif kind == "assistant-says":            # commentary: not an observation, changes no status
        need(e["text"].strip(), "empty-statement")
        S["said"].append((t, e["text"]))
    elif kind == "person-selects-baseline":
        ref = e["baseline"]
        need(ref[1] == SNAPSHOT and ref[0] in CARDS, "unknown-card")
        need(CARDS[ref[0]][2] == "baseline", "not-a-baseline")
        S["baseline"] = ref
    elif kind == "assistant-calculates":      # needs only the cards, never the service
        need(goal is not None, "goal-not-set")
        need(S["baseline"] is not None, "reference-unresolved")
        difference, comparable = compare(S["baseline"], S["candidate"])
        S["decisions"].append({"goal": goal["revision"], "baseline": S["baseline"], "difference": difference,
                               "met": meets(difference, goal["max_drop"]) if comparable else None})
    elif kind == "assistant-prepares":
        need(goal is not None, "goal-not-set")
        need(S["baseline"] is not None, "reference-unresolved")
        need(compare(S["baseline"], S["candidate"])[1], "not-comparable")
        need(e["key"] not in S["bound"], "key-already-bound")      # bound once, before the service sees it
        need(S["asked"] > len(S["bound"]), "no-open-request")      # a timeout is not a request
        S["bound"][e["key"]] = payload_for(goal, S["baseline"], S["candidate"])
    elif kind == "assistant-sends":
        key, attempt = e["key"], e["attempt"]
        need(key in S["bound"], "unbound-key")
        need(attempt not in S["attempts"], "attempt-reused")
        need(applies(S, S["bound"][key]), "obsolete-request")     # earlier criterion or baseline
        need(all(c["key"] != key for c in S["completed"].values()), "already-completed")
        need(all(r[0] != key for r in S["refused"]), "already-refused")
        S["attempts"][attempt] = {"key": key, "sent": t, "stopped": None, "reply": None}
        W["requests"][attempt] = {"key": key, "payload": S["bound"][key], "status": "in-transit"}
    elif kind == "assistant-stops-waiting":   # the assistant's own clock, not an answer
        a = S["attempts"].get(e["attempt"])
        need(a is not None, "unknown-attempt")
        need(a["reply"] is None, "not-waiting")
        need(a["stopped"] is None, "already-stopped-waiting")
        a["stopped"] = t
    elif kind == "person-changes-criterion":  # a new revision; it cancels nothing already sent
        need(goal is not None, "goal-not-set")
        need(allowance(e["max_drop"]), "criterion-out-of-range")
        need(e["max_drop"] != goal["max_drop"], "criterion-unchanged")
        S["goal"] = {"revision": len(S["goals"]) + 1, "max_drop": e["max_drop"]}
        S["goals"].append(S["goal"])
    elif kind == "assistant-looks-up":
        need(e["key"] in S["bound"], "unbound-key")
        need(e["lookup"] not in S["lookups"], "lookup-reused")
        S["lookups"][e["lookup"]] = {"key": e["key"], "sent": t, "answered": None}
        W["lookups"][e["lookup"]] = {"key": e["key"], "status": "in-transit"}
    elif kind == "person-requests-record":
        need(goal is not None, "goal-not-set")
        need(S["asked"] <= len(S["bound"]), "request-already-open")
        S["asked"] += 1
    elif kind == "reply-delivered":
        need(e["delivery"] not in W["delivered"], "delivery-reused")
        need(e["attempt"] in W["replies"], "no-reply-yet")
        need(e["attempt"] in S["attempts"], "unknown-attempt")
        W["delivered"].append(e["delivery"])
        a, outcome = S["attempts"][e["attempt"]], W["replies"][e["attempt"]]
        if outcome[0] in ("created", "existing"):
            evidence = receive(S, a["key"], outcome[1], t, e["delivery"])
        else:
            evidence, known = True, (a["key"], outcome[0]) in S["refused"]
            S["refused"] += [] if known else [(a["key"], outcome[0])]
            S["deliveries"].append((t, e["delivery"], "duplicate" if known else "refusal", None))
        if evidence:                          # a reply that is not evidence does not end the wait
            a["reply"] = a["reply"] or t
    elif kind == "answer-delivered":
        need(e["delivery"] not in W["delivered"], "delivery-reused")
        need(e["lookup"] in W["answers"], "no-answer-yet")
        need(e["lookup"] in S["lookups"], "unknown-lookup")
        W["delivered"].append(e["delivery"])
        read, answer = S["lookups"][e["lookup"]], W["answers"][e["lookup"]]
        if answer[0] == "completed":
            evidence = receive(S, read["key"], answer[1], t, e["delivery"])
        else:                                 # absence at one reading, kept beside any completion
            evidence, known = True, any(lk == e["lookup"] for _, lk, _ in S["absent"])
            S["absent"] += [] if known else [(read["key"], e["lookup"], t)]
            S["deliveries"].append((t, e["delivery"], "duplicate" if known else "absent", None))
        if evidence:
            read["answered"] = read["answered"] or t
    else:
        raise Rejected("unknown-event")
    return state


# ---- What the assistant can say from its own state ----

def number(name):
    return int(name[1:])


def status(S, key):
    record = next((c for c in S["completed"].values() if c["key"] == key), None)
    sent = [a["sent"] for a in S["attempts"].values() if a["key"] == key]
    absent = [t for k, _, t in S["absent"] if k == key]
    if record:
        return "completed", record
    if any(k == key for k, _ in S["refused"]):
        return "refused", None
    if max(absent, default=0) > max(sent, default=0):
        return "absent-at-lookup", None
    return ("sent" if sent else "prepared"), None


def applies(S, p):
    """Same goal revision, same references, stated method: it answers the current question."""
    goal = S["goal"]
    return (goal is not None and p["goal"] == goal["revision"] and p["max_drop"] == goal["max_drop"]
            and p["baseline"] == S["baseline"] and p["candidate"] == S["candidate"] and problem(p) is None)


def summary(state):
    W, S = state["world"], state["actor"]
    goal, seen = S["goal"], sorted(S["completed"], key=number)
    operations = []
    for key in sorted(S["bound"], key=number):
        state_of, record = status(S, key)
        stopped = any(a["key"] == key and a["stopped"] and not a["reply"] for a in S["attempts"].values())
        operations.append([key, state_of, stopped, record["id"] if record else None])
    current = [d for d in S["decisions"] if goal and d["met"] is not None
               and d["goal"] == goal["revision"] and d["baseline"] == S["baseline"]]
    return {"goal": [goal["revision"], goal["max_drop"]] if goal else None,
            "baseline": S["baseline"][0] if S["baseline"] else None,
            "operations": operations,
            "observed": seen,
            "fromCards": [current[-1]["goal"], current[-1]["difference"], current[-1]["met"]] if current else None,
            "saved": [r for r in seen if applies(S, S["completed"][r]["payload"])],
            "history": [r for r in seen if not applies(S, S["completed"][r]["payload"])],
            "world": [[k, r["id"], r["payload"]["goal"], r["met"]] for k, r in sorted(W["records"].items(), key=lambda kv: number(kv[0]))],
            "inTransit": sorted((a for a, m in W["requests"].items() if m["status"] == "in-transit"), key=number),
            "deliveries": [list(d) for d in S["deliveries"]],
            "absences": [list(a) for a in S["absent"]],
            "refusals": [list(r) for r in S["refused"]]}


# ---- Three delivery schedules, fixed before anything happens ----

def ev(kind, **fields):
    return {"type": kind, **fields}


OPENING = [ev("person-asks", max_drop=2),
           ev("assistant-says", text="Two baseline cards are visible: base-0925, scored on harness v1, "
                                     "and base-0928, on v2. Which one do you mean?"),
           ev("person-selects-baseline", baseline=("base-0928", SNAPSHOT)),
           ev("assistant-calculates"),
           ev("assistant-prepares", key="K1"),
           ev("assistant-sends", key="K1", attempt="A1")]
MIDDLE = [ev("assistant-stops-waiting", attempt="A1"),
          ev("assistant-says", text="The comparison failed. I will submit it again."),
          ev("person-changes-criterion", max_drop=0),
          ev("assistant-calculates"),
          ev("assistant-looks-up", key="K1", lookup="L1"),
          ev("service-reads", lookup="L1"),
          ev("answer-delivered", lookup="L1", delivery="d1"),
          ev("person-requests-record"),
          ev("assistant-prepares", key="K2"),
          ev("assistant-sends", key="K2", attempt="A2"),
          ev("service-receives", attempt="A2"),
          ev("reply-delivered", attempt="A2", delivery="d2")]
LATE_TWICE = [ev("reply-delivered", attempt="A1", delivery="d3"),
              ev("reply-delivered", attempt="A1", delivery="d4")]
SCHEDULES = {"A": OPENING + [ev("service-receives", attempt="A1")] + MIDDLE + LATE_TWICE,   # saved; reply held
             "B": OPENING + [ev("request-lost", attempt="A1")] + MIDDLE,                    # lost on the way
             "C": OPENING + MIDDLE + [ev("service-receives", attempt="A1")] + LATE_TWICE}   # arrives late


def run(events, state=None):
    """The state after each event the assistant takes part in or receives."""
    state, states = state or start(), []
    for e in events:
        state = apply(state, e)
        if e["type"] not in HIDDEN:
            states.append(state)
    return states


def words(names):
    return " ".join(names) or "none"


runs = {name: run(events) for name, events in SCHEDULES.items()}
for name, states in runs.items():
    s = summary(states[-1])
    g, d, met = s["fromCards"]
    print(f"{name}: service holds {words(r[1] for r in s['world'])}; assistant observed {words(s['observed'])}")
    print("   " + ", ".join(f"{k} {st}" for k, st, _, _ in s["operations"]))
    print(f"   answer for G{g} from the cards: {d / 100:+.2f}, {'met' if met else 'not met'}; "
          f"saved for G{g}: {words(s['saved'])}; history: {words(s['history'])}")

# Through step 11 the assistant's state is identical in A, B and C, whatever the service did.
assert [s["actor"] for s in runs["A"][:11]] == [s["actor"] for s in runs["B"][:11]] == [s["actor"] for s in runs["C"][:11]]
assert summary(runs["A"][6])["world"] != summary(runs["B"][6])["world"]
# A delivered twice is still one completion; C2 completed although its criterion is not met.
assert summary(runs["A"][-1])["observed"] == ["C1", "C2"] and not runs["A"][-1]["world"]["records"]["K2"]["met"]

# After the absent lookup in B, K1 still names only its G1 payload.
try:
    apply(runs["B"][11], ev("assistant-prepares", key="K1"))
except Rejected as why:
    print("rebinding K1 after an absent lookup:", why)

# Restoring the 0.02 wording is revision G3: C1 stays history; a fresh answer comes from the cards.
r = summary(run([ev("person-changes-criterion", max_drop=2), ev("assistant-calculates")], runs["A"][-1])[-1])
print(f"restored wording is G{r['goal'][0]}: from the cards {r['fromCards'][1] / 100:+.2f}, "
      f"{'met' if r['fromCards'][2] else 'not met'}; saved: {words(r['saved'])}; history: {words(r['history'])}")

It prints:

A: service holds C1 C2; assistant observed C1 C2
   K1 completed, K2 completed
   answer for G2 from the cards: -0.01, not met; saved for G2: C2; history: C1
B: service holds C2; assistant observed C2
   K1 absent-at-lookup, K2 completed
   answer for G2 from the cards: -0.01, not met; saved for G2: C2; history: none
C: service holds C1 C2; assistant observed C1 C2
   K1 completed, K2 completed
   answer for G2 from the cards: -0.01, not met; saved for G2: C2; history: C1
rebinding K1 after an absent lookup: key-already-bound
restored wording is G3: from the cards -0.01, met; saved: none; history: C1 C2
Practice (optional)

Three short checks on the same trace. A hint comes before the answer. What you open is noted beside each item on this page only; nothing is saved, and reloading clears it.

  1. Suppose the person had kept G1, and the assistant has just stopped waiting for A1 (step 7). Assume that any request the assistant sends now reaches the service and is processed, while A1 still follows schedule A, B or C. Under those assumptions, which move leaves exactly one saved G1 comparison, whichever schedule is true?

  2. Schedule C, after step 16. The old reply arrives: C1, saved under G1, criterion met. What answers the person’s question now?

  3. After the whole trace, the person restores the words of G1: “no more than 0.02 below”. Is C1 the current answer again?

What this does not show. No model, agent or service runs here; all of it lives in this page’s memory. The toy contract (a save that registers the key in the same step, records that never change, keys kept for the whole exercise, refusal of a changed payload under a registered key) is stipulated, not a description of a real system. Nothing here cancels a request or blocks an outdated one at the service. A retained key rules out a second record for one operation; it does not make a request arrive, so whether the operation happens at all still depends on delivery, which the timeout comparison assumes rather than guarantees. The scores are sample values, not measurements, and passing the screen would justify only a next test. Nothing here measures whether reading it changes what anyone does.

Audit a comparison with Verify

Verify reads submitted paired scores in your browser; it does not observe runs or execute models.

Before any such scores could exist, a drafted question has to become a precise comparison: what one paired row is, which metric counts as better and in what unit, how large a difference would be worth acting on, and what the rows stand for. The worked example below does this once for the attention question, on an imagined scoring sheet, so you can check each step.

Worked translation · imagined scoring sheet · no model run

1. From the question to five declarations

The question left open by the attention example:

For one fixed model and task, does masking a distractor improve answer accuracy without harming cases that need that source?

The toy calculation changed a mixture from 5 to 2. That is not a score, and it does not carry into anything below. Testing this question would mean scoring answers, so the walk-through switches to something separate and imagined: a four-item scoring sheet written for this page.

A comparison is precise enough to score once it states five things. Each is shown with a worked choice, then where it would go in a workbench draft and where Verify asks for it.

Comparison

Baseline: one fixed model answering with no added mask. Variant: the same model, prompt, decoding and scorer, with a mask over one span chosen in advance at a declared location. Only the mask differs.

In a draft: Comparison / intervention In Verify: the baseline and variant columns of Keyed paired item rows

One paired row

One task item, answered under both conditions. Its two scores share one row and one item ID, so they cannot drift apart or be re-sorted separately. Verify reads one line per item as case_id,baseline,variant.

In a draft: Smallest test In Verify: Keyed paired item rows

Metric, direction and unit

Exact match with the item’s fixed target answer: 1 if correct, 0 if not, and higher is better. Averaged over rows, it is accuracy as a proportion from 0 to 1. Every item counts equally, so accuracy is exactly the arithmetic mean of the rows.

In a draft: Decision rule In Verify: Which direction means better? and Metric and threshold unit

Useful-effect threshold

0.10 accuracy proportion, which is 10 percentage points: the variant must beat the baseline by more than this to be worth the change. A real plan has to fix this number before any score is seen. Here it is an illustration, not a standard.

In a draft: Decision rule In Verify: Useful-effect threshold

Target scope

These exact items at one revision, treated as a fixed evaluation set: a reading would describe them and nothing wider. Part 3 says what a wider claim needs.

In a draft: Held-fixed boundary In Verify: What do these evaluation units represent? and Exact fixed set and revision

2. Work one imagined scoring sheet

Four items. A real plan would tag each item before any scoring: three contain a span judged to be only a distractor, and one is a control whose answer needs that span. Every tag and score here is invented for this page; no model was run.

Imagined scoring sheet · invented scores, not run output
Item · planned tagBaseline (no added mask)Variant (span masked)Variant − baseline
item-1 · distractor only110
item-2 · distractor only01+1
item-3 · needs the masked span10−1
item-4 · distractor only01+1
Mean of 4 rows0.500.75+0.25

Read the sheet in four steps.

  1. Subtract within each row. Pairing keeps item-3’s baseline beside item-3’s variant. If the two conditions were kept as separate columns, one dropped blank or re-sort could silently compare different items.
  2. Average the differences. (0 + 1 − 1 + 1) / 4 = 0.25. That equals 0.75 − 0.50 only because every row has both scores.
  3. Name the unit. +0.25 accuracy proportion, which is +25 percentage points.
  4. Apply the declared rule. +0.25 is larger than 0.10, so on this sheet the variant clears the threshold; a difference exactly equal to 0.10 would not. The scores are invented, so this shows how the rule works, not anything about a real model.

What the average hides

The +0.25 comes from two gains (item-2, item-4), one tie (item-1) and one loss (item-3). That loss is the control that needed the masked span: exactly the case the question’s second clause, “without harming cases that need that source”, is about. On this sheet the harm is plain. Item-3 went from correct (1) to wrong (0).

A net mean cannot show that, and Verify’s reading does not test it: Verify asks only whether the variant is better by more than the threshold. A real plan gives the clause its own rule before scoring, such as how many needs-span items may turn from correct to wrong, and keeps the tags fixed. Re-tagging item-3 after seeing it fail would hide the harm.

One control item is enough to show harm on this sheet. It cannot say how often a real mask would harm such questions, and a sheet without such a loss would not show that it never does.

Check the unit

Suppose a draft’s decision rule says “10 percentage points” and every row is 0 or 1. What number belongs in the threshold that the mean difference is compared with? Work it out, then compare. Nothing is recorded.

Compare your answer

0.10. The mean of 0/1 differences is a proportion between −1 and +1. Written as 10, the threshold could never be exceeded, so the rule would be impossible rather than strict. Write the unit beside the number: “0.10 accuracy proportion”.

3. What the rows stand for

These four items were written for this page. If they were real, the honest scope would be a fixed evaluation set: a reading describes these items at one revision and nothing wider.

A claim about a wider target, such as short questions with one planted distractor span, needs rows drawn independently from a declared population of those questions, and an argument that each row is one independent unit. Verify asks for that argument in Sampling and independence argument; it cannot check it.

Scoring item-3 again adds neither a fifth item nor a rerun. It is still item-3, so the set does not grow, and it repeats one row rather than the comparison. An independent matched run is a separate, complete execution of the whole comparison: every item under both conditions with the same setup, planned in advance and independent of the other runs, giving one baseline and one variant result for the whole sheet. Verify reads those pairs in a separate table, Keyed matched-run rows, and only after the item rows are read as an independent sample. For a fixed evaluation set it withholds that reading.

4. What real evidence would still have to supply

  • Scores from actually running both conditions on every item under a protocol approved in advance, with identical prompts, decoding and scoring.
  • A record that the tags, metric and direction, threshold, scope and stopping rule were fixed before any score was seen. Stating that timing in a draft or in Verify does not prove it.
  • Checks that the items did not overlap with training or fine-tuning data, and that the input alone cannot predict the answer.
  • For a claim beyond the fixed set, a sampling plan and independence argument; for repeatability, independent matched runs of the whole comparison.
  • Review of the plan and its record by a named person who did not design the test. Agreement from an AI model is advice, not that review.

The imagined sheet has none of these, so it does not meet Verify’s design declarations about sampling, contamination, identical evaluation or row independence. Reading it, drafting in the workbench or opening Verify supplies none of this evidence.

Paired scores can come only from running a study under a separately approved protocol, never from a protocol or a draft on its own. No study here has been approved or run, and there are no scores from this page to submit.

Two next moves

Write the five decisions into a draft: the comparison under Comparison / intervention, the paired row under Smallest test, the metric, direction, unit and threshold under Decision rule, and the scope under Held-fixed boundary. The link opens the blank draft, which may resume a draft saved there before; a draft begun from a starter is kept with that starter. Nothing from this page is copied into it.

Write these decisions in a draft

Opening Verify carries nothing from this page, and Verify does not check that the declarations you make there are true.

Open Verify to see the declarations it asks for, or to enter by hand paired scores from a comparison you actually ran under a plan fixed beforehand. The imagined scores above are not such scores.

Open Verify

Where the research stands

No study has been run, nothing has been reviewed independently, and there are no results. Nothing on this page runs a study or arranges independent review; writing a draft does neither.

The record below states where each question stands, what may happen next, and which earlier work is kept as history. Where the project hopes to go is described under Vision.

The research record

In plain words: one question is written down, and the only work allowed on it is a feasibility check that runs no models and involves no participants. No study is running, nothing has been reviewed independently, and there are no results.

Stage
Question written down · no results
Work allowed now
A feasibility check that runs no models
Independent review
None
Study with participants
Not approved
Publication
Not approved

The question in preparation

In plain terms. Suppose a qualified reviewer must decide whether AI-generated evidence about a machine-learning or safety result should be promoted, held or rejected, and each claim in the report points to an exact passage in a source. The question compares those original pointers with the same pointers deliberately shuffled within each case, so that none points to its original passage, while the report text, the sources, the interface and the review time stay the same. It asks what effect, if any, the shuffled pointers have on the reviewers’ decisions.

Why it is narrow. The question is limited to this one comparison. A result would not show that source links help reviewers in general.

What happens next. The only work in scope is a feasibility check that runs no models and recruits no study participants; a reviewer who did not design or carry out the check must then assess its record. Even a favorable outcome would allow only a separate decision on a study protocol; it would not approve a study.

The formal statement follows. In it, a derangement is a reordering in which no item keeps its original place.

Question written down · feasibility check only · as of 16 August 2026

The question as formally stated

Among predeclared, domain-qualified reviewers making bounded promote / hold / reject decisions on independently adjudicated AI-generated ML or safety evidence, and among case families where a matched full derangement is constructible, what is the causal decision cost of complete claim-to-source misbinding when mechanically valid claim-level exact-source-span pointers are compared with the same pointers reassigned by a fixed-point-free, label-blind, within-case full derangement, while report assertions, artifact and source bytes, navigation shell, and review budget are fixed?

Limits: The question covers only cases in which the links can be shuffled so that none keeps its original passage. A result could not show a general benefit of linking claims to sources, that citations are valid, that a system’s behaviour has been verified, how experts would use such links, or that the platform works.

Stopping rule for the feasibility check: The feasibility check must reject the proposal, or return it for revision, if earlier work on the question, exact sources, rights, keeping the conditions identical apart from the links, ethics, a route to qualified reviewers, the outcome measure, statistical power or resources cannot be settled without collecting study materials or involving participants.

Where it stands: written down; no protocol is fixed, no study is running, and there is no evidence.

How this record fits the project

Continuous Function is an independent research project for questions that can be made explicit, challenged, and tested. The public record keeps apart a possible direction and an approved study, a written protocol and a run, and a source and empirical evidence.

Current research question: When reviewers decide whether to accept AI-generated evidence, what effect, if any, does it have on their decisions if every claim’s link to its source passage is shuffled so that none points to its original passage, while the report, the sources, the interface and the review time stay the same?

What open means here: Open here means that the questions, their assumptions, what would count against them, the state of the evidence and the next step are all public and open to criticism. It does not mean that the site runs models, takes in research submissions automatically, or takes up every suggested idea.

One question · five stages

Five stages from a question to a result.

The question stays the same while the work moves from stage to stage. Each stage leaves a record someone else can inspect and ends with a decision made by a person. Negative, inconclusive and invalid outcomes stay in the record.

02 · Available here

Commit

Before seeing any outcome, what will you compare, what will you hold fixed, what will you measure, what result would count against your expectation, and how will you decide?

Draft the study
What you leave behind
A study draft kept in this browser, with a JSON copy.
Decision a person makes
Decide whether the draft is ready for someone independent to criticize its methods. This site cannot approve it or fix it as a protocol.
Where tools could help later
Completeness checks, alternative controls and criticism of the protocol may help; approving and fixing the protocol remain decisions for people.
What passes to the next stage
Export the draft for an independent review of its methods and, separately, approval to run it.
What this site does
The workbench in this browser drafts the study and checks its format. It uploads nothing and creates no evidence.
Available here Partly available here Done elsewhere today Not yet built

Not built: accounts, a shared record of studies, running models, coordinating agents, fixing protocols in advance, or publishing.

How to read a status

Three things are recorded separately: how far the work has gone, what the evidence shows, and how far a finding could reach. Completing a study does not make its hypothesis true; a clear contradiction or an inconclusive result is reported as visibly as support. Sources show where an idea came from; they are never evidence for it.

FieldValue
Proposed · not begunA topic and the decision needed to begin are recorded. No study design, protocol, run or result exists.
Protocol in draftA bounded study design exists in draft. Whether it may proceed is stated separately; no model is run and no result is claimed.
PreregisteredA named version of the protocol is fixed and dated before any data that could count as evidence are collected. Fixing it does not mean it has been run or supported.
Results availableActual results are judged supported, contradicted, inconclusive or invalid, within stated limits. A list of sources never qualifies.

Proposed questions, not begun

These are possible future directions, not active programs. Each needs the decision named below, taken by a person, before a study could be designed.

Behavioral Specification and Human ControlProposed · not begunWhether a model’s behavior keeps to a written specification when the situations it meets change, and whether the people overseeing it can tell when it does not. Decision needed: Choose one written specification, one named change of setting, a comparison condition, a way to score what the model does, and a measure of whether reviewers catch violations, all of which can be studied offline.
Multi-Agent Systems SafetyProposed · proposal writtenHow a fault spreads, and how it can be contained and traced, when AI agents acting for different people or organizations pass work to one another. Decision needed: Find an existing safe, reproducible test environment or set of recorded runs in which the parties have genuinely separate authority, the unit of study is the whole system rather than one agent, the threat involves more than one agent, and it is stated which real settings a result could apply to.
Public Evidence and Technical GovernanceProposed · not begunWhich evidence about an AI system would change one named decision, such as a risk assessment, an audit finding or a required disclosure, and whether the evidence that is published contains it. Decision needed: Name the decision-maker, the decision, the uncertainty the evidence should reduce, a fixed body of records that may lawfully be analyzed, the method of analysis, any conflicts of interest, and whether the study could support a causal claim or only a description.

Methods and earlier work

The records below give depth on method and context for learning. They are not further active programs.

Earlier work: model fusion (Atlas-64)

Historical record. This note comes from earlier model-fusion work and is kept as history. No study is running and there is no result.

Attention serving systems

Learning and methods · no benchmark claim

A public learning and methods track on the trade-offs of caching, batching and serving. It does not claim to outperform production systems, and no completed evaluation stands behind it.

FieldValue
StageTeaching material and study design
EvidenceNone; no model result is published here.
The next stepA planned experiment, and its results, would be needed before any claim about performance.