Skip to content

release: 1.3.0 - #28

Merged
lorem-dev merged 34 commits into
mainfrom
develop
Nov 3, 2026
Merged

lorem-dev merged 34 commits into
mainfrom
develop

Conversation

@lorem-dev

Copy link
Copy Markdown
Owner

Release 1.3.0 from develop:

  • Learning mode (learning.enabled): task classes, a delegation journal, escalation, profiling with a blind judge, and a learned model order the person approves.
  • duolog skill test and the duolog-skill-check skill: test a changed skill across models and efforts.
  • duolog coauthors: credit workers as commit co-authors.
  • Peers: duolog settles routine prompts and gates their commands, peers live in their own Rex session without notifications, and duolog reminds once when a peer's question waits.
  • .duolog cleanup of old task folders, snapshots and removed worktrees; codegraph's read tools allowed by default.

See CHANGES.md, section 1.3.0. Codex (gpt-6.1-sol) wrote much of this code in duolog peer sessions; Claude planned, reviewed and verified it.

🤖 Generated with Claude Code

lorem-dev and others added 30 commits November 2, 2026 12:32
A malformed .duolog/routing.learned.yaml no longer fails Load while learning
is off. Tests pin that, the skipping of an unparsable learned-order key, and
the rejection of an unknown judge model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rules match the lead's feature answers, or the role, in order. A choice walks the
learned order, then the configured ladder, and skips agents that are unavailable. The
router can take the chosen target and run it as a worker even when it equals the lead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The journal keeps NDJSON records under .duolog/journal/ and the open task of each lead.
Trees are captured through a temporary Git index, so the real index stays untouched and
untracked files count. duolog task start records the base commit of a task.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Append cuts a partial last line before writing, NumStat reads NUL-separated
paths without rename detection, and task start tells a repository without
commits from a directory outside Git.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Append now keeps a final line that already parses and only cuts a fragment
that does not, reading just the tail of the file. InGit is exported directly.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
delegate takes --features or --class, picks the class's ladder entry instead of the
role's target and runs it as a worker even when it equals the lead. Each delegation
gets a journal record with cost, time, gate denials and changed paths, and a local copy
of its task, answer and patches for profiling. The result line names the delegation.

Tree capture no longer names .duolog in its git add pathspec: git refuses a pathspec
for an ignored path, and projects ignore .duolog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…empt

A capture kept duolog's own state out by dropping all of .duolog, which also
dropped a committed .duolog/config.yaml, so before.patch deleted it. It now
drops only the .duolog paths the project does not track.

A wait for the lead decided before any worker starts is journalled with the
outcome lead. The record describes the final attempt, so a run here after a
quota fallback is recorded as such, and a failed tree capture records no run.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TestHookCatalogHasDeadlineAndRecovers took 4.2 s on windows-latest against a 3 s bound; the fake sleeps 60 s, so 10 s still proves the deadline.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
TestLogin/done timed out on windows-11-arm: starting the fake agent took
more than the 500 ms that every case had. Only the timeout case keeps the
short wait and the bound check now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
.duolog/sync.lock.json stays a local file: sync keeps working in this
checkout, and Git ignores it in both ignore files. CI now regenerates the
skill copies and compares them with Git instead of `sync --check`, which
needs the lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
--escalate-from names the delegation the lead leaves and --reason one of the
signals the skill lists. The journal counts it as a failure of the entry it
left. A run that hit a provider limit, went back to the lead, ran on the
role's own target or was the person's choice is not escalated from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
learn reads the journal: confirmed verdicts at full weight, the person's task
outcome and failures at half weight, and priors as pseudo-runs. Quality-first
classes take the best entry, or a cheaper one close to it; cost-first classes
take the cheapest entry that clears the threshold. It prints the change as a
diff with its evidence, and --apply writes .duolog/routing.learned.yaml.
A provider limit or a wait for the lead counts for nothing, and
learning.prior_runs must be above zero.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The repository's Claude and Codex hooks call scripts/dev/bin/duolog, which
builds .cache/dev/duolog when a source file is newer and runs it; a
PowerShell copy serves Codex on Windows. On SessionStart it copies the
skills from plugin/ and puts itself on the Claude session's PATH. The duolog
plugin is off in this repository so that no gate runs twice.

.duolog/config.yaml passes the Go settings to workers, .duolog/learned.yaml
lets them run the repository's checks, and .codex/rules and
.claude/settings.json let the lead run them. AGENTS.md also asks agents to
use codegraph when it is available.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog task finish prints what ran on what and what it cost, at most two
offers with a cost estimate from the journal, and the outcome question;
duolog task outcome records the answer. duolog stats --classes reads the
journal. An offer whose cost cannot be estimated is not made.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AGENTS.md asks for a Co-Authored-By line for Codex, with its model, whenever
Codex wrote or changed code in a commit, and CLAUDE.md points Claude sessions
at the rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SessionStart says when learning mode is on, and duolog task start prints the
features, the classes, the skeleton steps, the escalation signals and how to
finish. The skills gain one line and stay under 400 words. docs/learning.md
explains the mode.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A lead's session start now removes the delegation folders under tasks/ and
the artifacts that nothing changed for 7 days, and the sync records of
linked worktrees that Git no longer lists. The binary does it in the hook,
so no one runs a command. A worker never removes state, a folder that holds
other files stays, and a held sync lock defers the cleanup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog profile rebuilds the tree a worker started from in a fixed linked
worktree, at the task's base commit plus the recorded patch, runs the same
task on the target named with --entry, and runs the class's checks. A failed
or interrupted run removes the worktree, the next run cleans a stale one,
and a delegation recorded outside Git is refused with the reason.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog records which agent and model changed files in a delegation or a
peer session, and duolog coauthors prints a Co-Authored-By line for each,
for work newer than HEAD. --hook appends the missing lines to a commit
message from a prepare-commit-msg hook and never blocks a commit. The
repository's rule is set once in config: coauthors.enabled, with a template
per agent. SessionStart reminds the lead while it is on.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog profile ends with a judge that sees both results under neutral labels
in random order and scores the class rubric, on a target of the opposite
vendor where it can. duolog verdict records the person's confirm or
correction; a correction replaces only the criteria it names.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Peers: duolog answers a prompt that a rex.auto_answers rule matches (by
default Codex's hook review, without granting trust) and decides a peer's
request to run a command with the gate, so only an ask reaches the lead.
Workers are asked for one sentence when all went well, and a peer for
"done". peer wait no longer reports a working Codex pane as finished, a
closed peer leaves the registry, peers are keyed by role and work root, a
new peer opens in its own tab, queued questions are reported, and
duolog peer list shows a lead's peers.

Tests clear inherited DUOLOG_* variables. The skills and AGENTS.md ask to
batch small changes into one pull request. The dev build is pinned:
scripts/dev/rebuild checks, rebuilds and restarts idle peers on request.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog learn proposes a class when many delegations fall through to the
role's target with the same features, or when the stated and rule classes
keep disagreeing, as a diff of the project config with features, priority,
rubric and starting ladder. --apply-class writes it and --decline-class
records the refusal in the journal; task finish says when a proposal is
ready. One proposal is offered per name, the largest group first.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A check of both skills on Claude haiku, sonnet and opus at low and high
effort and on Codex luna, terra and sol at low to high effort showed every
model answering a peer's question with duolog allow: the skills never named
duolog peer answer. They do now, and say to wait for each peer alone in the
background. Shortened sentences keep every rule; both skills stay under 400
words. The second check passed 95 of 96 answers.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
learning: holds ten default classes with their roles, ladders, priors and judge rubrics,
ordered classification rules, and the selection parameters. It is off by default.
.duolog/routing.learned.yaml, when present, puts an approved order first in a ladder;
deleting it returns to the configured order.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The learning-mode entries under Development name each command once within
the changelog limits, and the README says what the mode does and links to
docs/learning.md.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A check of the merged skills on twelve model and effort pairs passed 117 of
120 answers; one Codex model ran both waits on one line. The sentence now
names a separate background command.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Run-here, interrupted and needs delegations no longer count as failures of
their ladder entry, get no profiling offer and are not replayed. The judge
is told that 3 is best and that fewer is better for counted criteria. A
--use or --entry target whose agent is unavailable is refused instead of
re-routed. Replay patches ignore the user's diff settings. The profiling
worktree is re-created instead of reset and cleaned, and the default policy
denies writes to .git files. --chain rebuilds both sides from the recorded
trees, and an entry that the lead's effort ceiling would run the same as
the one being left is skipped. The debug class lists the debug role, and
the implicit-task hint names task finish.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
lorem-dev and others added 4 commits November 3, 2026 00:26
The journal truncates a torn tail through a handle opened without O_APPEND,
which Windows allows. duolog's own Git calls for tree capture, diffs and
replays turn off line-ending conversion, so patches apply byte for byte on
runners with core.autocrlf. The file-mode check of the replay copies runs
only where the OS keeps those bits, and CI gives a package four minutes:
delegate takes about two on Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
duolog skill test runs a plan of situations against a SKILL.md on several
agents, models and efforts and prints one table with the cost. The
duolog-skill-check skill tells the lead when and how to use it: the person's
own skill guidelines first, another skill-writing skill for the writing, one
question with the plan and cost, and the answer remembered as skill_tests.
This repository tests its duolog skills always; word limits apply only to
duolog's own skills.

Peers open in their own Rex session, named after the project, each in a tab
named "duolog | <name>", and never take focus or notify; duolog notifies once
when a peer's question waits longer than rex.stuck_notify_minutes.
codegraph's read-only tools are allowed by default, the docs describe how to
start sync in a fresh clone, and the skills and AGENTS.md describe parallel
work.

Co-Authored-By: OpenAI Codex gpt-6.1-sol <noreply@openai.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… test

The default models of duolog skill test skip limits.manual_only_models, so a
first run no longer picks fable or astra; naming one with --models needs
--allow-manual-model, as for delegate. A failed run's output is kept next to
its raw answer, and the error points there instead of a deleted folder.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lorem-dev
lorem-dev merged commit df9c39d into main Nov 3, 2026
18 checks passed
Sign up for free to 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.

1 participant