Promote dev to main: research map redesign, trial polish, issue fixes #127 #129 #132 - #144
Merged
Merged
Conversation
…what each role runs On the trial host the operator picked gpt-6-astra and every call still went to gemini: the quick picker writes ARGUS_SKILL_MODEL, but the twelve role knobs had been pinned to gemini at setup and a role knob wins. The picker now sends apply_to_roles, which releases the role pins so all roles follow the shared choice (a pin set afterwards in the role table wins again; ARGUS_SKILL_FIGURE_MODEL and ARGUS_SKILL_MAP_MODEL are not role pins and stay). The panel lists what each role actually runs when it differs from the chosen model, and the response reports the pins released and left. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he page simple The quick section now offers a select for the execution model and one for the map model, built from the harness catalog plus models that answered on this home in the last thirty days. Budgets, the advisor model, explanation effort and raw configuration moved under Advanced. The knowledge and skill libraries fold in the sidebar and remember the choice. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…fication Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The per-push check is now ruff plus pytest under xdist. The mypy type gate moves to the on-demand extended workflow with a base revision input; it cost a minute and most of this week's red runs on cosmetic mixin declarations. The launcher console tests stub the release identity so they no longer depend on an earlier test having warmed its cache, which the parallel run exposed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
(cherry picked from commit 76af32665810b94806b974759a5ed1bda441cbe8)
Windows 0.1.8: session-safe UI, library guides and signed-release preparation
Three things seen on the stable web trial (s-54218bf4, 2026-09-18):
- On a narrow canvas a card of up to three steps stacks them in one column.
The wide layout opened a question-and-answer card at 460px on a 390px
screen, so the answer started off-screen. Longer cards keep the wide
layout and pan as before.
- A turn started by picking an option on a choice card ("直接做") is titled
by the task it carries out, which `manager.turn.started` already records,
instead of by the option's label. HISTORY_VERSION 8 rebuilds stored cards.
- Inside the workbench shell the map no longer reserves the tab bar's height
a second time, which left a blank band above the bar on a phone.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
map: a phone shows the whole answer, and a card is named after its task
The map looked unfinished in three ways (stable web trial, iclr-eval-v5): - The order work happened in, which is every edge of a map without recorded dependencies, was drawn as sparse grey dots and read as noise. It is now a continuous slate line that strengthens toward the card it arrives at, with a small anchor where it leaves and a lighter swept arrowhead. The dash is kept for "related work", an association rather than a path. Step links inside an open card use the same line. - Each card chose its overview tier from its own width, so one view mixed headed cards with bare grey tiles. The tier now comes from the zoom alone. - Between overview and detail a card was its small layout magnified: 40px type, a title cut off under the toolbar, a footer spilling out of the frame. Type now lives in a band of screen sizes, so a larger card says more at the same size; content is clipped inside the card, and the title ends on a whole line that fits the card's height. Chrome (hairline, corner, state rail, shadow) is measured on the screen, so it is the same at every zoom. A card that keeps earlier parts shows a second sheet behind it. Zooming into open canvas no longer enters detail mode with no card in focus, which dimmed the whole map around nothing. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two things taken from the 0.1.3 map (the version PR #119 is built on), which a later simplification had dropped: every card shows the course its task ran, and the sheet has a head. Then a visual language for the whole map. - The course: four marks on a task card (planned, carried out, reviewed, delivered), inked where the record holds a step of that kind. At overview they are four beads, so a whole map shows at a glance which tasks were reviewed and which stopped short; with room they carry icon and label. - The head: a letterspaced kicker over the session's name, and one thin bar ahead of the status sentence that shows how the tasks divide. - Ink on paper. The restraint is Apple's: whitespace, one frosted material for every control, hairlines, soft depth. The vocabulary is ink painting's: a paper ground with a felt grain, washes of diluted ink and far hills where coloured light drifted before, serif titles, and the mineral pigments of that tradition (malachite, indigo, vermilion, gamboge, ochre) spent only on state. Night ink is the dark theme. - A route that is a path is drawn as a brush stroke: set down lightly, gaining weight, pressed once and lifted to a point. It shows where it is going along its whole length and needs no arrowhead. An association keeps its dashed line. `brushStroke` builds the outline from the route's samples, resampled by arc length. - The legend gains the line most maps are made of, the order of work, and the dashed swatch's tooltip now describes the dashed line. The minimap and the deliveries button speak the same palette. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Seen on the stable web trial after the ink map went out. With the sidebar open the overview runs at a lower zoom, and a card kept its course beads at the cost of its title: task 02 read "Author…". And where the 0.1.3 map gave every card a line of explanation, ours had none at overview, because the excerpt was the last thing to be given any height. A card now counts the whole lines it has room for and spends them in the order a reader from outside the team needs: two lines of title, a line of explanation, the course beads, then more of each. The explanation at overview is the task's own (the generated summary, else its objective, else the tidied record). The notice that an execution ended short of the goal reads the same on every such card and filled the map with one repeated sentence; it stays on the larger card, where the state mark already carries it at overview. The team branch pill joins the sheet: paper, hairline, pigment rail, serif. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…rder Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Relation labels were hidden below half scale, and a map is normally read at
0.1 to 0.3. So what connects two tasks ("模型集成前置", "同一计划") was only
ever seen by zooming in on the line itself, and the map read as having no
stated relations at all. The 0.1.3 map behaved the same way; this is not a
regression, it was never visible.
- Labels are placed through the overview in twentieth-step zoom buckets, and
give way only below 0.05 where cards are down to a title. Placement still
drops a label that fits nowhere, so none is laid over a card.
- A label that states a relation (a dependency, related work, a changed
plan) claims its place before one that only says two tasks share a study.
- A stated relation is a small slip of paper on the line; the order of work
is a quiet annotation, so a map of chronological edges is not a row of
identical chips. Type stays inside the box the collision pass reserves.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…abels Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Zooming the redesigned map ran at a quarter of the frame rate it had before the redesign (12 fps against 50 in the same harness). Three things did it, all mine: - Type and card chrome were sized against the live zoom, so every card was laid out again on every frame. They are now sized against the zoom in quarter-octave steps, and a moving map keeps the step it had: a gesture scales one picture and text is set again when the movement rests, or once the picture has drifted two steps small or three large. - The live zoom was published as an inherited custom property, which restyled the whole map each frame whether or not anything read it. Only the step is published now. - The ink washes carried a 36px blur on large drifting layers, the grain and the night hills used blend modes and filters, and every label and panel had a backdrop blur. Washes get their softness from the gradient, grain and hills are drawn in their own colours, labels are plain paper, and the frosted panels turn to paper while the map moves. Every line at overview read "same study". A line that can only name its kind now says so when the reader points at one of its tasks, and the lines that have something to say are asked for it: POST /api/map-lines takes the pairs the map draws and has the map model write, once per map, what one task handed the next, or nothing where the records show no connection. A note annotates an existing line and never adds one or changes its kind, so the layout does not depend on it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… line notes Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The notes were gated on the project still running, like card explanations. A finished map is the one that gets read, and its lines are written once, in one small call, so the gate only kept them from ever appearing. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…shed projects Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Inside a task, every stretch of tool activity had become a card of its own
("40 steps of work", "said what comes next"), so a one-round task was twelve
cards, the stages of the work (goal, round, review, changes asked for, next
round, result) were lost among them, and the links between cards, which name
a relation only between adjacent stages, had nothing left to say but "then".
The map from before that change (PR #119's base) read better for exactly
this reason: one card per stage, a named relation on every link.
- Tool activity is folded into the round of work or review it happened in.
The round's card says how many actions it holds; opening it lists them
after the round's own record, without repeating what that record says.
Where there is no round (a single-agent turn) consecutive stretches are
one step.
- A round still under way is titled and summarised by the latest thing its
agent said.
- A failed tool call is marked on its line and no longer turns the whole
step red; being put on the plan and being taken up are moments, so a
finished task no longer shows them as "in progress".
- Steps are named by their stage (task goal, work started, this round's
work, review passed / another pass asked for, changes asked for, result of
the work) and links by their relation, with wording for entering a round,
a review followed straight by the next round, and a task taken up again.
- A column that continues a round says which part it holds.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…k interior Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PR #119's map read well at a glance because every card carried a written title and a sentence. Since then the explanation of a task is written only when a reader opens it (it grew into a full lesson, and costs accordingly), and not at all once the project's daemon has stopped, which on a trial is every project. So the cards showed the planner's own text: an imperative English title, the first words of a specification, and the state of the execution said three times. - POST /api/map-cards has the map model write, in one small request per map, a short title and a sentence or two per task, from the task's goal and the last record its work left (a task's `summary` is as often a harness note). About 3.5k tokens and half a cent for ten tasks with gemini-3.8-flash. The full explanation stays on demand and takes over the card once it exists. - With words on it, a card no longer prints the specification under the title, and says its state once, on the chip. An explanation written before an execution ended short of its goal still may not head the card; the map's words, written knowing how it ended, may. A reader's own turns keep the reader's words. - A step's detail no longer shows harness instructions ({"wait_for": ...}) or raw JSON arguments, and lists eight actions with a count of the rest instead of all hundred. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
An explanation is written only for what a reader opens. It was also held back
whenever the project's daemon was not running, which is when a map is read
most: on a trial every project is stopped, so opening a card never produced
an explanation at all. Writing one is a separate read-only turn and needs no
daemon, so the hook no longer asks; nothing is written for a card that is
merely on screen or focused, as before.
Trying it on a stopped project with gemini-3.8-flash showed the writing then
failing about half the time: the model returns a section of the reader brief
as an object of named parts ({"name", "restriction", ...}), the way `concept`
is shaped, where the schema asks for one text. The brief already tolerated
one such shape, but only after the schema check had rejected it. The shape is
now put right before the schema sees it (the model's own paragraphs, joined
in its own order; the schema's length limits still apply), and anything else
still fails as an invalid brief.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…opped projects Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
They were already written in the interface's language and kept per language,
but their limits were sized for Chinese and applied by cutting: an English
reader got "Formulate three long-context LLM researc" as a title and "Method
contract an" beside a line.
- Titles, sentences and line phrases have per-language limits, and the prompt
asks for the length in that language only (sixteen characters or eight
words; ten characters or a two-to-three-word noun phrase) and says to write
in the reader's language whatever language the records are in.
- The schema is wider than what is shown, so one overlong phrase does not
throw away every other card's words; text that overruns is ended at a
sentence, clause or word, never inside a word or a number ("38.31%").
- A line's pill is wide enough for an English phrase, and its width estimate
matches the bold serif it is set in. Relations stated by an explanation get
the same per-language label length.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…words Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…mand Stop generating explanation snapshots and redundant relation evidence. Keep cached explanations and old questions readable, and retain task records only when a reader asks about a selected explanation. Preserve click-to-read generation and expose preparation failures without silently rewriting explanations. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 072ba9df-603c-4f3e-bcb7-59385fd508ef
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 072ba9df-603c-4f3e-bcb7-59385fd508ef
…e tools Keep historical review failures distinct from scientific rejection and link final delivery. Remove zoom-dependent card text collapsing. Replace live reviewer prose parsing and the extra interpretation call with native review actions, preserving waiting and venue acceptance semantics. Refresh release metadata and bundled frontends. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 5f36246b-910c-4964-99da-28bf7892c6a2
- Replace the native route <select> in the conversation and map composers with a segmented radiogroup (RouteSegment); request body unchanged (route_override only sent for task/chat). - Drop the redundant 'Enter to send' hint in the map composer toolbar. - Collapse button on the preview panel now also resets the mobile preview state, so it closes on desktop after opening via the Files button. - Rebuild frontend/web/dist. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…, phone menu on empty landing; fix stale reviewer tests - Plugins entry uses the shared sidebar row so its hover fill matches Skill library and Knowledge base. - The unpaired landing shows the localized pairing hint instead of the fixed English error message; the missing-project notice is localized. - A phone with no project yet gets an Open menu button on the landing. - Migrate two reviewer tests to the native review-action contract that the previous commit introduced (prose STATUS lines are no longer parsed). - Desktop: the Windows-path ownership assertion is platform-aware, since same_path only folds verbatim prefixes on Windows. - Rebuild frontend/web/dist. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Retiring a route and then revising its goal claim left the ledger failing check with route_goal_stale forever, even with a replacement route on the current statement. A retired route is history of an attempt against the claim as it then stood. Validation now checks a retired route's goal against every recorded claim version (kind, id and content hash), while an active route must still target the current version. An unknown id or a wrong digest on a retired route is reported as route_goal_unknown. Tests: kernel cases for superseded goal, active stale goal, blank reason, unknown id, wrong hash, retired self-dependency; the public CLI retire/revise/replace round trip from the issue. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A new Copilot CLI session killed by the turn-cap watchdog before its terminal result left thread_id null, so priced receipts could not be reconciled and admission stayed blocked as if the budget were exhausted. A new session now gets a pre-allocated UUID passed as --session-id (when the executable advertises the flag), bound to the call before spawn and recorded on the agent.io.start row. Watchdog kill, idle timeout, process failure and a missing terminal result all return that identity; resumed calls keep their original identity and never get a replacement. An early session.start or terminal result whose sessionId differs from the bound identity fails closed: thread_id is cleared, the turn stays failed and the conflict is recorded. Identity never implies completion. Failed calls with unreachable usage carry an explicit accounting_pending cause (lost_session_identity / session_identity_conflict) in the refusal text. Tests: 14 runner-level and 7 adapter-level cases with mocked subprocess boundaries; the suite stubs the --help probe so no test spawns Copilot. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tion (#132) After ENOSPC left a truncated record spliced onto a later one, the usage reader skipped the malformed line and admission proceeded. The reader now reports malformed physical lines as UsageJournalIntegrityError instead of dropping them; reserve_call_budget and cost_admission_reason refuse with accounting_integrity: corrupt_accounting_journal (file and line) before any transport, and the global read no longer treats one project's corruption as ignorable. Blank lines stay benign; a partial final line is tolerated only while another writer holds usage.lock. Reconciliation refuses to rewrite a journal that contains malformed lines, leaving the bytes intact. A failed unknown-cost settlement writes a durable marker under cost-control.failed/ that blocks admission as unresolved liability across PID exit and restart until an acknowledgement or a later settled receipt retires it. No zero-cost rows or synthetic completions are created. Out of scope, still open in the issue: the prepare/review/apply recovery transaction, durable waiting, continuation ownership, acknowledgement audit ordering. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…imeout The first powershell.exe start on a hosted Windows runner takes close to 40 s cold, so the 40 s subprocess bound made the first test in this file fail intermittently (three of the last four runs on this branch). The bound now only guards against a hang. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
map: connections read as a route, and zoom shows more instead of bigger
main's #139/#141 landed with lint and an architecture ratchet failing; after merging main into dev the same three points remain: - argus/skills/stage_machine.py used typing.Any without importing it. - argus/life/supervisor/_planning_cycle_intake.py kept an import whose only use moved to _planning_cycle_completion.py. - tests/skills/test_research_idea_portfolio.py imported argus.team.pool unused. - The runtime-incident store and the runtime failure circuit read memory.root like the rest of the supervisor (their reader in _idle_cycle.py uses the same root), so MEMORY_ROOT_READS is 81 with the reason recorded. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
main's #139/#141 added life.runtime.incident.detected/recovered/escalated to the event catalog; dev's exhaustive event renderer had no case for them, so the merged tree failed tsc in the desktop build. They join the runtime failure circuit events in the bookkeeping fallback group. Regenerate the renderer coverage fixture and rebuild the web dist and TUI bundle. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes everything reviewed on
devsince the last promotion (55 commits, PRs #140, #142, #143 and the Windows 0.1.8 release branch) intomain.mainkeeps its own seven runtime-recovery commits from #139 and #141; the merge is conflict-free (git merge-treeclean) and the merged tree was linted and run through the full pytest suite locally before opening this PR.Research map (PR #143, #142)
Connections read as a route instead of sparse dots; a card's overview tier follows the zoom, so zooming shows more rather than bigger; type and chrome are sized in quarter-octave zoom steps (
zoomStep.ts) so a gesture scales one picture and text is re-set when the movement rests, restoring ~45 fps on a ten-task map. Ink-on-paper palette, brushed route strokes (brush.ts), a course row per card, one stylesheetfrontend/web/src/map/design.css. A line says what it carries viaPOST /api/map-lines/{source}/{name}(argus/webapi/map_lines.py); a card gets a title and one sentence in the reader's language viaPOST /api/map-cards/{source}/{name}(argus/webapi/map_cards.py); both per-language length budgets, ending at a sentence or word. Task interiors read as stages (goal, plan, rounds, review, result) with tool activity folded into its round. A stopped project can still be explained; brief sections returned as objects are normalised before the schema check. Phones show the whole answer and cards named after their task. Documentation:docs/research-map.md.Reviewer through native tools (#143)
The Reviewer submits its judgment with native review actions (
argus/reviewer/tools.py,pi_review_tools.mjs) instead of parsed prose; the prose decision parser is removed; waiting and venue-acceptance semantics preserved; historical review failures stay distinct from scientific rejection. Prompt catalog and reviewer tests updated to the new contract.Web trial polish (#143)
Per-message route as a segmented Auto / Task / Chat control in both composers (
RouteSegment.tsx), request body unchanged; the preview panel's collapse button now closes it on desktop; sidebar Plugins row aligned with Skill library and Knowledge base; the unpaired landing shows the localized pairing hint instead of a fixed English error; the missing-project notice is localized; a phone with no project gets an Open menu button. Frontend tests updated (slashCompletion,mapComposerLifecycle,pluginLanding);frontend/web/distrebuilt.Issue fixes (#143)
MathState._route_issues: a retired route is validated against every recorded claim version (full SubjectRef); active routes still target the current version; unknown id or wrong hash on a retired route reportsroute_goal_unknown. Tests intests/proof_ledger/.--session-idbound before spawn (argus/agent_cli/copilot_session.py), kept through watchdog kill, timeout, failure and missing terminal result; resumed identity retained; mismatching stdout identities fail closed; failed calls carryaccounting_pending: lost_session_identity. Tests:tests/agent_cli/test_copilot_session_identity.py,tests/test_copilot_session_binding.py;tests/conftest.pystubs the help probe.argus/core/usage.pyraisesUsageJournalIntegrityErroron malformed journal lines instead of skipping them;argus/core/cost_control.pyrefuses admission withaccounting_integrity: corrupt_accounting_journal, refuses reconciliation rewrites over damaged journals, and writes a durablecost-control.failed/marker when unknown-cost settlement fails so the block survives restart. Tests:tests/core/test_accounting_integrity.py. Remaining items of ENOSPC recovery: corrupted accounting failed open, autonomous dispatch continued, and safe same-campaign recovery required manual intervention #132 stay open there.Windows 0.1.8 release branch (#140), settings (0.1.7)
Session-safe UI, library guides, resources above sessions with Chinese library explanations, workspace diffs with original-text fallback, read-only view clarity, Windows newline handling in knowledge pages, isolated session drafts and desktop notifications; release inputs pinned and Hatchling editable hook included in the pinned Windows tools (
.github/workflows), versions aligned for Windows 0.1.8, frontend identity regenerated. Settings: pick models from a list, one choice applies to every role, sidebar libraries folded. Release manifests and bundles rebuilt at each step (argus/release_manifest.json,frontend/tui/bundle,frontend/web/dist).CI and tests
tests.ymlruns lint then the whole suite as one job per push. The desktop identity test's Windows-path ownership assertion is platform-aware; the Windows installer preflight PowerShell probe has a 180 s bound instead of 40 s (cold start on hosted runners sat at the edge). Ondevat f1f98a2: lint + tests green; desktop workflow green on windows-latest, macos-14 and macos-15-intel; PR description gate green.🤖 Generated with Claude Code
Reconciliation with main (14a87fe)
main's #139/#141 landed with lint and an architecture ratchet failing (itstestsworkflow has been red since 2026-09-18). Mergingmainintodevcarries the same three points, fixed here:argus/skills/stage_machine.pyusedtyping.Anywithout importing it;argus/life/supervisor/_planning_cycle_intake.pykept an import whose only use moved to_planning_cycle_completion.py;tests/skills/test_research_idea_portfolio.pyimportedargus.team.poolunused. The runtime-incident store and runtime failure circuit readmemory.rootlike the rest of the supervisor (their reader in_idle_cycle.pyuses the same root), soMEMORY_ROOT_READSintests/test_architecture_invariants.pyis 81 with the reason recorded next to it. After this,devcontainsmain, and this PR is a fast-forward ofmaintodev.