Skip to content

Synchronize latest Public updates - #18

Merged
River Li (lbx154) merged 103 commits into
mainfrom
sync/public-20260821
Aug 21, 2026
Merged

Synchronize latest Public updates#18
River Li (lbx154) merged 103 commits into
mainfrom
sync/public-20260821

Conversation

@lbx154

Copy link
Copy Markdown
Contributor

Direct synchronization of the latest Public commits without additional modifications. Conflict files were resolved to the Public versions.

River Li (lbx154)and others added 30 commits August 21, 2026 09:34
`ruff check argus_skill tests` is the first step of the test workflow, so main
is red until this file's import block is ordered.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Figure 1 advertised seven benchmark scores while the report's central claim
had become that campaigns run without a person in the loop, and the two
concepts the reframe introduced had no illustration at all.
- replace the two nanochat cards in Figure 1 with the metrics the report now
leads on: 40.7 hours per human request against roughly one hour for a
turn-by-turn agent, and duty cycle against its infrastructure-degraded case
- split the bottom card so upstream review by outside maintainers appears on
the teaser, since it is the only result decided outside this project
- add a figure pairing per-campaign duty cycle with the classification of all
38 interruptions, annotating the two lower bars with why they sit lower
- add a figure for the containment relation between auto research and RSI and
the loop in which each is a precondition for the other, colour-coded by
what is measured here and what remains
Figures are hand-authored SVG matching the existing palette and rendered to
PDF, consistent with the other diagrams in the report.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The teaser advertised benchmark scores and autonomy metrics, but the work
that took the most effort and carries the most external validation appeared
only deep in the results. A reader who saw one page saw none of it.
Add a delivery band of three domain cards below the runtime diagram, each
naming what was built and who judged it:
- infrastructure: four fla-org kernels accepted by outside maintainers, the
FlashAttention-4 diffusion-LLM adaptation within 5-14% of native for under
Y80, the SGLang integration, and a 62 GiB video model on a 24 GB laptop
- science: MOF chemical control, structure judgment from 0.594 to 0.833 AUC,
a simpler sampler admitted after a confound was removed, and the Erdos
campaign keeping a falsified route with its evidence
- silicon: ACE-2 functional closure, mapped SKY130 synthesis, and the human
cost of that campaign at eight days and six interruptions, two of which
were the server failing rather than the runtime asking
Existing cards and their text are unchanged; the canvas grows to fit.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`argus --web` was undiscoverable. The flag, its host/port options and a
doctor check all existed, but the product-facing help never named it, so the
only way to learn the web UI exists was to read the source or set a debug
environment variable.
`argus --web` could not report a broken install. The guard meant to print an
actionable message caught only the `webapi.server` import, while that module
imports uvicorn lazily inside `serve()` — so the pairing banner offered a URL
and a bare ImportError escaped as a traceback. The message it could not print
was wrong anyway: it advised installing an `argus-skill[web]` extra, and no
such extra exists because fastapi and uvicorn are required dependencies. The
web stack is now probed before anything promises a URL.
`argus --config-help` hid three supported backends. The set was written out by
hand in four places — the `--backend` choices, the `--advisor` choices, the
readiness check and the operator knob help — and the knob help had drifted to
five of the eight. A user reading the documented control surface could not
learn that grok, qoder and dsh exist. All four now render from the
`RunnerBackend` type, so the drift is unrepresentable.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The runtime diagram still drew the four roles as a pipeline, which was the
old framing. It showed neither which role answers which question, nor the
channel by which a Reviewer can question the plan that produced the round
it is reviewing.
- label Planner with Q2 and Reviewer with Q1, and give each role its actual
scope: the Reviewer runs read-only and returns one of four verdicts, and
the Engineer may self-review low-risk work
- replace the generic CONTROL box with the Q3 authority boundary, naming
what stops for the operator and stating that only those stop
- draw the plan-challenge path from Reviewer to Manager, with the Manager's
keep, revise, or replace decision in its I/O row
- rewrite the caption to read the diagram as a distribution of the three
questions rather than a dataflow
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Three items on the teaser assumed the reader had already read the report.
- drop the bare 1.41x from the SWE-Bench card; a token ratio with no units
or baseline stated next to it is unreadable on its own, and the figure is
given properly in the results table
- retitle the interruption card "How often it needs you", label the two bars
Argus and a chat-style agent, and say which direction is better
- retitle the duty cycle card "Share of time working", qualify it with
"while it has a task in hand", and label the low bar with its cause
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The second bar on the duty cycle card showed Argus's own worst campaign,
which answers a question nobody asked at that point in the figure. The
comparison that belongs there is the one the report is about: a harness
whose Driver is a person.
That ceiling is arithmetic, not a measured system — a harness cannot outlast
its operator's working day, so eight hours a day bounds it near a third of
wall-clock time regardless of model capability. Both the card and the
results text say so explicitly rather than presenting it as an observation.
The degraded-infrastructure campaign remains in Figure 4 and Table 6, where
it answers its own question.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Ink puts stdin in raw mode, so `argus` from a pipe, a redirect, cron or CI
announced that it was starting the backend and then died inside the bundled
JavaScript:
Error: Raw mode is not supported on the current process.stdin, which Ink
uses as input stream by default.
Read about how to prevent this error on https://github.com/vadimdemedes/ink
at handleSetRawMode (file:///.../argus.mjs:119:2015)
Reproduce with `argus < /dev/null`. The launcher already refuses a missing
bundle, a missing Node and an old Node with one actionable line each; the
most common way to have no cockpit was the one it did not check.
Nothing starts now, and the reply names the surfaces that work without a
terminal — `--web`, `--watch`, `--status`, `--daemon` — because that is the
question the operator actually has. `ARGUS_SKILL_ALLOW_HEADLESS_TUI=1` keeps
the old behaviour for a host that embeds the cockpit in its own pty.
Both launcher test modules drive `main()` as a terminal invocation, so each
grows an autouse fixture that says so rather than every test restating it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The formalism was written for the previous framing and had drifted from what
the report now argues. Several symbols were decorative, one proposition was
inflated, and the claims the report is proudest of had no formal support.
Contradictions with the narrative:
- the campaign tuple posited an evaluation procedure f, introduced once and
never used again, while the report argues no such evaluator exists for the
tasks it targets; replace it with an evidence structure that degrades to a
scalar where one happens to exist
- ManagerAdmit was an ordinary goal-update rule; state the two conditions
that make it evidence-driven, namely that authority may refuse a revision
but not erase what prompted it, and that standing intent is the only fixed
point while the objective is a revisable hypothesis
- the role state machine omitted replan_requested, so the relation contained
no edge by which a better-informed role could question the decision it was
working under
Overreach:
- demote Proposition 1 to a remark; it is the data-processing inequality,
true by construction, and the strict case was asserted without argument.
Say plainly that it locates the burden rather than discharging it
- drop the monotonicity conditions on capability width and depth, which the
same paragraph then contradicted and the longitudinal data refutes
- separate the counterfactual reuse value from the confounded startup-mature
difference actually measured, and rename the latter
- state which term of the review-precision identity the evidence cannot
constrain, rather than presenting Bayes' rule and moving on
Additions:
- formalize iterating without a score: the progress set that admits
informative failure, the invariant forbidding a non-idea failure from
refuting a hypothesis, and evidence profiles ordered by strictness
- derive the two retention surfaces from the two terms of the compression
objective instead of asserting the equation explains them
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The abstract had grown to 856 words as claims were added to it, and the
conclusion to 1,000, most of which restated the abstract. Several paragraphs
elsewhere had accumulated past the point where a reader tracks them.
- abstract 856 to 505 words, in three movements: the Driver and why
verification is what makes the seat delegable, the measurement, and the
work those hours produced
- conclusion 1,000 to 555 words, ending on what the report does not
establish rather than on a restatement of its numbers
- convert the terminology paragraph in the method section, which was a
glossary written as prose, into a definition list
- shorten the MLE-Bench and delivery passages, which explained the same
comparison twice
No claims or figures were added, removed, or weakened.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`argus --web --web-host 0.0.0.0` mints a token and tells the operator "a
token was generated for this run"; the flag help promises that a non-loopback
bind always requires a bearer token. Every POST honoured that. The reads did
not, so any host on the network could ask for and receive:
GET /api/projects 200
GET /api/projects/{sid}/transcript 200 <- the whole agent transcript
GET /api/projects/{sid}/journal 200
GET /api/projects/{sid}/events 200
GET /api/projects/{sid}/snapshot 200
GET /api/projects/{sid}/status 200
GET /api/projects/{sid}/doctor 200
Reproduce by binding to 0.0.0.0 and curling any of those from the LAN address
with no Authorization header.
This reads as an omission rather than a decision: `/api/system/doctor` carried
the dependency while `/api/projects/{sid}/doctor` beside it did not, and the
suite asserted "reads stay open (no auth on GET)" two lines above a note that
artifact reads are protected "because they expose project files" — which the
transcript, journal and snapshot do more of.
`require_auth` already returns immediately when no token is configured, so the
default `127.0.0.1` bind is untouched: it has no token and stays open. The web
UI sends `authHeaders()` on reads as well as writes, so a paired browser is
unaffected. Verified end to end against a real 0.0.0.0 bind: 401 without the
token, 200 with it, and unchanged on the default localhost bind.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Future work already claimed the runtime produces the process data a training
stage would consume, and that such data is scarce because nobody is paid to
record reasoning that did not work. It did not say what distinguishes these
traces from the agent corpora already being assembled, which is that they are
days long.
- report the measured spans in the results section: 4 of 27 campaigns exceed
a week, the longest runs 8.1 days, and one trace records 61,797 events
- argue in future work that span rather than volume is the property that
matters, since supervision for long-horizon judgment is carried by
dependencies a short episode structurally cannot contain -- a hypothesis
proposed on day one, contradicted on day three, revised on day five, with
every intermediate verdict retained
- state the concrete form the second axis would take, using the verdicts the
trajectories already carry as labels, and say plainly that we have not
done it
The claim stays in future work; nothing is presented as demonstrated.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The report measures multi-day unattended operation and then, in future work,
argues those traces are the supervision a next-generation model would need.
The abstract stopped at the measurement.
Add a closing movement: multi-day autonomy is a capability the harness
reached before the models did, the runtime records reaching it at length,
and scraped corpora contain the artifacts of such work and almost none of
the deliberation. Whether long-horizon judgment can be trained into a model
rather than supplied to it by scaffolding is stated as the direction this
points at and explicitly not as a result.
Offset by tightening two earlier passages; net growth is 87 words.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
An AST scan for byte-identical function bodies found 23 duplicated groups.
These three were the ones where the copies could drift apart into a real
defect rather than merely costing lines.
`_srv` — four modules split out of `server.py` each carried the same
three-line late-binding resolver, whose whole reason to exist (a test that
monkeypatches `server.<dep>` must still be seen) is easy to lose when someone
"simplifies" one copy into a module-scope import.
`_sha256_file` — six copies across the image API, the run contract and four
verticals. Provenance and evidence checks compare these digests across
subsystems, so they have to be computed the same way in all of them.
`_load_json` — five literary verticals, each raising the `ManifestError`
defined in the shared contract module they all already import from. The
helper now lives beside the error it raises.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`argus --gc --gc-days -5` — a plausible typo for `--gc-days 5` — moved 50
projects to `projects_trash/` on a real global root. Forty-two of them were
ones the same run's `--gc-dry-run` had not listed a minute earlier, because a
negative window puts the cutoff in the *future*: every project then reads as
untouched for longer than it, including one modified a second ago.
Found by running the command; the projects were restored from the trash.
`retention_days_default()` already clamped the environment spelling with
`max(0, ...)`, so a negative window was never meant to be legal — the clamp
was simply missing from the explicit argument, which is the destructive path.
The collector now refuses one from any caller, and the CLI names the mistake
and its consequence before the sweep can start. Zero stays legal: "prune
anything not live" is a real operator choice.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
"Who Drives the Harness?" named the role but not the interval, which is
where the result actually lives: a person can drive a harness, just not for
eight days without stopping.
- title becomes "Who Drives the Harness for Days?"
- subtitle trades "Long-Horizon" for "Multi-Day", which is concrete rather
than jargon and matches what the campaigns measure
- the introduction's answering line now carries the same implication: naming
the driver as a person also answers how long the driving can last
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The report gave no indication that Argus began in May 2026 and that every
campaign in it ran within the following four months. That omission cuts both
ways: it hides a real limitation, and it lets the results be read as the
output of a mature system rather than a new one.
- open the limitations with the window, since the rest should be read
against it: no evidence on long-term stability, and a runtime that changed
underneath its own evaluation, so the campaigns are not instances of one
frozen system
- open future work by naming the preceding list as a route rather than a
backlog, and this runtime as the first version of a program
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
`argus --web --web-port 99999` printed the pairing banner's URL on that port
and then raised `OverflowError: bind(): port must be 0-65535` out of uvicorn,
so the operator was offered an address that could never exist and then shown
a traceback. `--web-port abc` and a negative port did the same.
The parser now carries the range, which is where argparse can say it without
any consumer having to. Zero stays legal: it asks the kernel for a free port.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The results section carried two SWE-Bench Pro figures whose content
overlapped: panel (a) of the evolution figure already reported adaptive
routing and review outcomes, which was the whole of the separate reviewer
mechanism figure.
Remove the standalone figure and keep its one non-redundant point -- that
verifier pass and strict rescue are nested inside the revision-requested
group rather than being separate outcome classes -- as prose, with the
counts carried by the existing macros.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The ledger was pinned with [H], so when it did not fit in the remaining space
it moved wholesale to the next page and left roughly a quarter of page 24
empty. It is a summary table with no sentence depending on its exact
position, so [!t] is the correct placement and the surrounding text closes
the gap.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Both figures in the paper-production case study were pinned with [H]. The
manuscript grid is tall enough that it could not fit in the space left on
page 26, so it jumped whole and left a third of that page empty and nearly
half of page 27.
Neither figure is referenced positionally, so [!tb] is correct. The two now
sit together at the top of page 27 and the surrounding prose closes both
gaps. No page in the document now ends with more than a few blank lines.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
A read-through from the position of someone who has never seen this project
found the same handful of stumbles repeatedly.
- define the four nested scopes once, at the top of the method section:
vertical selects the rules, campaign is what persists, Stage is where it
currently is, mission is what it is doing now. These were used throughout
and never laid out together
- say explicitly that RQ0-RQ4 are the questions we measure and Q1-Q3 are the
questions the runtime decides; the two numbering schemes were confusable
and a reader scanning for "Q1" landed in the wrong place
- make the Figure 1 caption explain the plan-challenge path rather than name
it, since the term is not introduced until thirty pages later
- rename the ACE-2 section from "A Chip the Runtime Designed" to "RTL to
Mapped Synthesis"; the old title invited a reading the section itself
spends a paragraph retracting
- replace "2x#1" for SOL-ExecBench, which reads as twice the top score, with
what it means: beat the top-ranked entrant on two kernels
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The formal section defined density, research value, process-data dominance,
typed compression, and reuse value -- none of which this report measures --
while the quantities it does measure appeared either as one equation buried
in the results or as prose. That is backwards.
- define duty cycle and interruption rate in the formal section, with the
three contestable choices in the duty-cycle denominator stated plainly:
call intervals rather than event gaps, external jobs neither credited nor
penalised, and what subtracting unavailable time does to the question
being answered
- formalize the interruption partition, since only the research-judgment
share measures what the Driver framing is about; the authority share is
bounded below by design and the infrastructure share is a property of the
deployment
- formalize the review funnel as nested inclusions, which is what stops a
reader adding recovery counts to the outcome partition
- open the section by naming which equations carry data and which do not,
and mark the untested ones individually where they appear
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Three of the equations marked untested could be evaluated against the
campaign ledgers directly, and two of them turned out to carry the strongest
numbers in the section.
- the progress set: across the campaigns the runtime recorded 604 frontier
transitions, 598 in the progress set, of which only 167 are
artifact_improved. The remaining 72.1% is reduced uncertainty, information
gained from failure, retired risk, and bounded repair -- advances a scalar
objective registers as zero or as loss. This is the empirical case for the
typed vocabulary, and it was previously argued only in prose
- process-data strictness: of 1,852 bounded missions, 346 did not reach a
done verdict, including 103 explicitly declared blocked. Nearly a fifth of
what the runtime did leaves no trace in what it produced
- the refutation invariant: the campaigns ran under verticals that do not
emit the four-state record, so we report it as an enforced property of the
implementation and say we have no field rate, rather than reporting zero
violations from an empty set
Also narrow the section preamble to match what is now measured.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Qualifications had accumulated to the point of restating each other. The
frozen-state replay appeared in the methodology, the results, the discussion,
the conclusion, and the appendix; the delivery asymmetries were set out in
full in both the results and the limitations; and the conclusion had become
an index of section 8.
- state the frozen-replay requirement once where it does argumentative work
and refer to it elsewhere
- compress the delivery caveat in the results to one sentence, keeping the
distinction that matters -- the third comparison was decided by people
with no stake in it -- and leaving the asymmetries to the limitations
- end the conclusion on what the evidence supports rather than re-listing
what it does not
Hedging phrases drop from 28 to 20 across the report. No qualification is
removed, only the repetitions of it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Lead the duty-cycle section with the result instead of the caveats, and
state measured outcomes as findings rather than as things the data is
merely 'consistent with'.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Guo Sufeng (aHappend)and others added 28 commits August 21, 2026 09:34
An evidence gap could be closed by "a planned supplement, ablation, or claim
downgrade", and a modest credible effect could justify "targeted improvement or
a narrower claim". Listed as peers, the option that costs nothing wins.
Each gap now names the supplement or ablation that would close it, and a
downgrade is what is left when none is affordable. A modest credible effect is
a reason to push the method further.
Research-vertical only.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The resume delta exists so a continuing role session is not charged for the
immutable contract twice, and its header already promises that the state below
supersedes stale session facts. It carried the journal, the runtime digest and
the stage, and dropped the one block that moves most between cycles: the
vertical's search altitude.
Found by driving four live ICLR campaigns on the new build. The altitude
rendered 534 characters through the prompt catalog and appeared zero times in
the verbatim prompt log, because every long campaign resumes its Planner
session and the resumed path never included it.
This is not research-specific. A metric campaign loses its promoted floor,
frozen count and recombination history the same way; each vertical still
renders only its own block, and a vertical with no altitude still renders
nothing.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Across the four live ICLR campaigns, 55 of 125 completed missions were
certification, scope, checklist, schema and package work against 41 that ran an
experiment — about ten hours spent on the runtime agreeing with itself. Sample
titles: "Resolve submission certification hold", "Prescribe final-submission
Planner scope", "Making final submission certification host-visible",
"Obtaining project-final independent certification" twice in a row.
The same mechanism shows up in what the campaigns called their own analyses.
Eight of run-01's eleven analysis directories are named `*_repair`,
`*_limitation` or `*_strict_gate`; not one is named after a hypothesis. When the
next mission is chosen as the next unsatisfied requirement, the work becomes a
sequence of repairs and the paper never accumulates an argument.
Both roles now say the same thing from their own side. The Planner picks the
work that advances the argument — the experiment that decides a claim, the
comparison that earns it, the rewrite that makes one insight carry the paper —
names missions after the question they answer rather than the defect they
repair, and treats certification, scope prescription, package assembly and
schema conformance as finishing steps inside the mission whose work they
certify. The Reviewer stops sending work back for them: a missing certificate
or schema field belongs in next_action.
Three checklist items go with it, all of them restatements rather than
requirements: `benchmark.backbone` repeated the lock that `plan.backbone` sets
and `run.backbone` proves, `run.environment_preflight` repeated
`benchmark.environment_preflight`, and `review.placeholders` repeated a check
the deterministic structural validator already performs. Every restatement is
one more box an agent can open a mission to go tick.
`submission.upstream` was removed and put back: alongside the bookkeeping it
carries the recorded-Manager-decision skip that lets a literature review pass
without an experiment section.
Research-vertical only.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The router sent agents to argus_builtin_skills/engineer/..., a path that
exists nowhere; the renderer actually ships beside the skill. Five of the
nine skill cross-references pointed at the same missing tree.
With that path dead and PPT Master absent, the only route that ran was
typing <rect> and <line> into a file, which is exactly what Figure 1
became. The renderer's own contract pushed the same way: --output *.svg
extracts an <svg> the page already has, so a figure laid out in CSS fails
with "figure root contains no SVG" and hand-writing one looks like the
fix. It is not; --output *.pdf is the vector route for CSS, and LaTeX
includes PDF directly. The error now says so.
"Deterministic HTML/SVG" bundled a browser-rendered layout together with
hand-typed markup and offered both as one option. Splitting them leaves
the route that produces a publishable figure.
Each figure now gets its own subagent, so one drawing gets one undivided
attempt.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
FigureSpec was the third route pointing into argus_skill/builtin_skills/,
a tree that does not exist, so between it, the browser renderer's dead
path and an absent PPT Master, every route a figure could take failed.
Typing SVG by hand was the only thing left that worked.
Its path is now resolvable, but reaching it is not enough. Rendering the
skill's own three-box example produces four rects and three texts with no
gradient and no shadow: the flat diagram a reviewer reads as a whiteboard
sketch. The router offered that as the route for "simple exact topology",
and a method figure with three boxes and two arrows looks simple, so that
is where Figure 1 kept landing.
Figure 1 is the figure a reviewer looks at before reading a word. Three
boxes still need hierarchy, depth and a type scale, so the simple row is
now scoped to supporting figures and the opening figure takes a polished
route regardless of how few nodes it has.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Persist deterministic stage-transition failures as unresolved Manager feedback so the next planning cycle repairs the missing evidence instead of repeating the same rejected advance.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Distinguish project-domain verticals from optional research domains in the routing prompt, and retry a bounded standalone decision when the model puts a project slug in the wrong field.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The daemon's stop is cooperative and lands between missions. A round that
yields to external work waits inside its mission, in `while True`, for as
long as that work keeps reporting a healthy heartbeat — so it never
reaches a boundary, and the request never arrives. In practice the daemon
logged "received signal 15, requesting stop", then sat in `time.sleep`
for fifteen minutes until it was killed, with a running experiment as the
only thing keeping it alive.
Signals cannot be read from inside that loop, so the handler now records
the request in one process-wide flag and the loop reads it. The cadence
wait checks the same flag after each poll-sized sleep, which bounds the
delay to one poll interval instead of a whole cadence.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the configured branch remote and merge ref explicitly so stale fetch refspecs for deleted branches cannot block an otherwise safe fast-forward update.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep source updates on the canonical public release line instead of inheriting a checkout's private branch upstream.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix(manager): preserve autonomous route continuity
Allow fresh operator handoffs to revise persisted workflow and research contracts while keeping active bounded campaign supplements fail-closed. Surface persisted route state and legal enums to Manager, preserve staged exploratory workflows, and add regression coverage for the observed direct-to-staged failure.
* fix(core): keep final completion gates domain-blind
Resolve final-stage validation through the active vertical contract instead of importing research modules from Manager, then refresh the release identity and shipped frontend artifacts so deployment/runtime checks match the source tree.
All four ICLR campaigns produced the same paper: a boundary study. run-03
is titled "A Boundary Study"; run-04's headline endpoint is AUROC 0.503
against random 0.501. That was not four unlucky ideas. The policy offered
exactly two endings — a positive result, or "the remaining boundary,
mechanism, scaling, or decision finding becomes the paper" — so a method
that lost to its own baseline had nowhere to go but into a manuscript.
The campaign now commits to the problem and treats a named mechanism as a
disposable bet on it. Selection fixes the end-task claim, the strongest
resource-matched baseline, the win that would matter, the cheapest run
that discriminates, and a rescue budget that ends, and that run is bought
early while the method is still cheap to abandon. Evidence leaving the
method short at that final run is a bet settling rather than a defect to
repair, so the Reviewer returns `replan_requested` at selection and the
accumulated evidence funds the next candidate. The rollback path already
existed; nothing described it as anything but a defect.
Cheap probes still cannot veto an idea — only claim-bearing evidence at
the scale named at selection settles one.
A refutation still earns a paper when the belief it overturns is one the
field already builds on. This campaign's own method failing is memory.
The Planner's schema example also shipped `"title":"title"` with objective
"work and decisive check", and every campaign ran at least one mission
copied straight out of it. The placeholders now read as slots.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The previous pass gave a settled bet somewhere to go, but it asked the
Reviewer to decide whether the shortfall was explained by the mechanism
itself. That judgement is not reliably available — a method usually falls
short because something in the implementation, the optimization, the data,
the scale or the evaluator is not yet right, and telling those apart from
a wrong mechanism is exactly what the campaign cannot yet do. Asking for
it buys premature retirement, which trades one failure mode for another.
Falling short is now a gap with a size, and closing it is the work: each
round names what the shortfall is made of, buys the fix that addresses it,
and measures again. Many rounds are the normal shape of the thing; an
early miss is the starting position, not a result about the idea. That is
how a leaderboard result gets earned, and it is what the campaign spends
itself on once the baseline number exists — so selection now buys that
measurement early, to have a number to improve for the rest of the run.
What stays closed is the exit that produced four boundary studies: a loss
never becomes the paper. Moving on means another attempt.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Closing the gap is the campaign's normal state, so nothing that happens
inside a mission should be able to end an idea. The Reviewer now says as
much, and the research vertical gives the Manager — which had no role
policy at all — the one seat that can make that call.
The call is written to be reluctant. It wants sustained optimization
already spent across implementation, data, scale and evaluator, the gap
unmoved by any of it, and a reason the next round would fail that is not
simply that the last one did. Anything less is impatience wearing the
costume of judgement: a shortfall stays an engineering shortfall until the
engineering has actually been done.
A retired idea rolls back to selection carrying its evidence. What it
still never becomes is the paper.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Argus grinds well already. It will read a failing test, hypothesise, fix,
re-run and re-fix until it is green, and nobody has to tell it the third
attempt is allowed. The science gets a stranger treatment: implement
once, measure once, and start writing about what it found. The same
system that spends twenty rounds on a harness spends two on the result.
The gap was never capability, so this is not a new mechanism. It is the
missing description of the work: the first number is a first draft and
the six things it is usually made of; measure, diagnose one cause, buy
that fix, measure again; reproduce the baseline in your own harness
before believing anything measured against it.
Flat stretches get their own section, because the response to one is
where campaigns go wrong. A plateau is what the middle of a hard problem
feels like from inside, not a signal — it is only informative once the
diagnosis has stopped producing new causes. Lowering the target, softening
the claim and starting to write all feel like progress there.
And the part that is easiest to miss: after twenty rounds of local
repairs the method is not the one that was proposed, and that is the
research happening rather than drift to correct. So when the number
lands, look at what is actually in your hands, find the part that carried
it, and write about that. A real discovery buried in an implementation
detail, under a paper about the original proposal, is the common way a
good result becomes a forgettable paper.
The last section is about judgement over procedure: chase the surprising
ablation over the next three planned runs, spend attention where the
uncertainty is, and change the metric only for a reason you can state
without mentioning your own result.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Ideation was one model asked once. Six candidates then share one model's
taste and, more expensively, one model's blind spots — and the campaign
that follows spends weeks on whichever of them that single taste liked.
The panel asks each installed backend separately, so the proposals are
genuinely independent, and then hands each seat the others' candidates
and asks for the strongest reason each would fail plus the one it would
actually bet a month of GPUs on. An objection a GPT-family model cannot
see is often obvious to a Gemini- or Claude-family one, and a candidate
that survives a stranger's cross-examination is a better bet than one
nobody argued with.
Availability decides the panel, because most machines do not have every
CLI. A name Argus does not support and a CLI that is not installed are
the same answer: no seat. Fewer than two seats is not a panel, so a
single-backend box takes exactly the single-model path it took before —
same call, same label, no debate section — and one panellist returning
nothing degrades the same way rather than into a one-sided argument.
Operators who want specific labs can name them, as `backend` or
`backend:model`, and missing seats are dropped from the list rather than
failing it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
An installed CLI is not a subscription. Someone who pays for one vendor
still has the other launchers on PATH — this machine has codex on PATH
and cannot log into it — so resolving a binary was the wrong question to
ask. The panel would have seated codex, spent an ideation round finding
out it has no credentials, and only then fallen back.
Seats now go through the readiness check Argus already owns, once per
process, and anything it cannot confirm is not a seat. On this box that
takes the auto panel from two names to one, which is the honest answer:
one usable backend is not a panel, so ideation runs exactly the call it
ran before.
Operators with a single subscription are not shut out. One backend often
fronts several labs' weights, so naming them explicitly still seats a
panel — the knob says so, with an example. What the framework will not do
is guess model ids on their behalf, because a guessed id is just another
failed call.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two defects that only a real debate could show, both hidden by the
fail-open wrapper that was supposed to protect the campaign.
A bare runner is not the campaign's wrapped one: it wants the thread
stated, and it reads the agent_cli options type rather than the core one,
so every call died in the command builder before reaching a model. The
panel dutifully logged nothing and fell back, which is exactly the shape
of bug that survives a green test suite.
The second is worse, because it produced output. Seats were identified by
their launcher, so a panel of two models reached through one CLI filtered
both of them out of "the others" and handed each reviewer an empty page.
Gemini said so in its own review — "since no candidate proposals were
explicitly attached to the prompt, I have autonomously inferred three
archetypal proposals" — and then reviewed candidates it had invented. A
seat is now the model it speaks for, which is the case an operator with a
single subscription depends on.
Run after the fix: gpt-5.5 and gemini-3.1-pro-preview proposed four
different candidates, then argued. GPT told Gemini its manifold was the
SAE's consistency set rather than the model's, so the do-operator was
probably not an intervention at all; Gemini answered that both of GPT's
candidates were mathematical band-aids on the same terminal disease and
bet zero GPUs on either. That disagreement is the thing worth having.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The panel appended its work to research/IDEA_CANDIDATES.md, which belongs
to the Idea Creator step: that step reads the file, ranks what it finds,
and writes the file back whole. In the first real campaign it did exactly
that seven minutes after the panel finished, and 21KB of proposals and
cross-examination — the entire reason the panel exists — went from 37KB
to 20KB with no trace and no error.
The debate now has its own file. The candidate file still receives the
candidates, so ranking sees everything it saw before, plus a line telling
it where the objections and the bets are. A rewrite of the candidate file
can no longer take the argument with it.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Argus parallelises missions — the daemon runs its supervisors in a thread
pool — but ideation is one blocking call inside one mission, so none of
that reached it and the panel asked its seats one after another. Seats do
not read each other while proposing, so the round now costs the slowest
model rather than the sum of them, using the same pool-with-single-item-
fast-path shape the daemon already uses. A seat that raises loses its own
seat and nothing else.
The panel also had no ending. It produced proposals and objections and
left the choosing to whatever read the file, which is a strange way to
spend two models arguing. Each seat now reads the whole record — every
candidate and every objection against it — and names the one it would
run, including one it did not propose or one it attacked, with the risk
it is knowingly accepting and the measurement that would show within a
week that it picked wrong. Agreement is a strong signal, disagreement is
information, and neither is decided in host code.
One more shape of the availability problem: a backend named twice with no
model is one model arguing with itself, which is worse than no panel
because it looks like one. Those collapse to a single seat, so the
campaign falls through to single-model ideation. Different models on one
backend are still two labs and still seat a panel.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep status read-only in fresh directories, show the backend selected by setup, and reserve paper-specific workbench modules and labels for research routes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Scaled the question up: four fresh directions, two arms each, four
candidates per arm, thirty-two candidates scored blind and shuffled by a
judge that sat on neither arm. The panel lost. Control 16.12, panel
14.88, and the permutation test on that gap is p = 0.92 — the wrong side
of the null, not a near miss. Two earlier experiments had said the
opposite, and both were the same single direction.
What survives all three is spread, not level. The panel produced the best
candidate in the batch by a clear margin — the only one the judge
advanced — and also nine of the thirteen weakest. Per direction, best
against best, it is a draw: 18.50 to 18.25, two directions each.
That is a real trade and it may well be the right one when selection is
good. It is not a trade a campaign should inherit from which CLIs happen
to be sitting on PATH, so auto-seating is gone. Naming seats turns it on;
unset, ideation is exactly what it was. The knob says what the scoring
found so the choice is made with the evidence rather than the pitch.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@lbx154
River Li (lbx154) merged commit b6b1500 into mainAug 21, 2026
1 check passed
@lbx154
River Li (lbx154) deleted the sync/public-20260821 branch August 21, 2026 16:35
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@lbx154@aHappend@Chenxxxxxx06