Places such as an avatar upload take PNG, GIF or JPG, not SVG. docs/drawings/eye.png is 1024 x 1024 with
transparent corners. Nix writes it from eye.svg, and the flake checks it.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
- mu is piabrota's company chart, not an umbrella, and the README header is centred.
- products/ holds pirsig, alerts, ihero, gramatico, nix-os, dojo, rax and agents. The yggdrasil and
asgard submodules go; our forks of them stay in the index.
- PIABROTA.md follows the org as it is now: 24 public repos.
- The logo is the eye that piabrota.art shows. む is drawn in pure Nix, with nix-os' pen, and checked by
the flake.
- .claude/skills/adr-verbatim is copied unchanged from davidondrej/cloudroom, under Apache-2.0, with
credit in NOTICE.md.
- The map shows the eight products, and the portfolio figure goes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This repo was a copy of Ouroboric's umbrella. It becomes piabrota's company umbrella, ready for pirsig
to manage it.
- DOGMA.md holds ten invariants, and AGENTS.md follows it.
- PIABROTA.md indexes the org's public repos, rendered by minijinja-cli from scripts/piabrota/repos.toml.
- docs/DECISION_MODELS.md tracks decision models and where routines run.
- brain/ and pirsig.toml seed PARA, smart notes and the decision track record.
- The org, the bot name, the charter, the roadmap, the budget, the legal page and the palette change.
- Ouroboric's logos go. Its licences stay, with credit in NOTICE.md. Dated records keep their text.
- The Go component template becomes a Rust one, rendered by minijinja-cli.
- Every plot is drawn with archify, pinned in forks/archify. Mermaid, D2 and diagrams.sh go.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-build.sh --beside-path, and the stale-binary guard on a single-file YGG_CMD (B-214)
--out FILE --beside-path builds a second ygg beside the one on PATH, writes its
facts and prints YGG_CMD=FILE; a plain --out still fails when PATH resolves
elsewhere. ygg_guard takes the command to check: a YGG_CMD of one executable
file is checked against its build facts as the ygg from PATH is (--any-ygg
skips it); several words are used unchecked, with a line that says so.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* qwen-claude.sh init leaves out the skills link and the merge hook when the personal folder lacks them (B-212)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* Review fixes: the YGG_CMD stale hint rebuilds that file; qwen-claude init drops a stale skills link
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* ygg-models.sh setup and clean; the example names its files and sources (local-models-setup LS-T3)
setup does the first-time setup and is safe to run again: the GPU, the list from
the example (--price required for a new one, refused before anything changes),
the missing download files (hf, else uvx), the image, start, load, and the chat
template when the list names a missing one (the first start leaves that line out
of the preset, then template, stop, start and load). clean removes the container,
the network (refused while another container is on it) and the image; --state
and --weights remove only the files they name.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* ygg-models.sh clean decides first, and --weights removes hf's cache folder (local-models-setup LS-T3)
clean lists the other containers on the model network before it stops anything:
a refusal names them and leaves the server, the network and the image as they
are. --weights also removes <weights>/.cache/huggingface, the state hf download
leaves there, and no other path.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* ygg-models.sh setup never restarts the server under a run; gungnir's patterns (local-models-setup LS-T3)
setup checks the model network before step 1 when making the template would stop
and start the server, and refuses, changing nothing, while a run is on it; it
checks again before the restart. A failed template step says the server runs
without the chat template. The download repo, revision and paths use gungnir's
patterns, so none starts with a dash. clean --weights refuses a symlinked
.cache or .cache/huggingface. The network refusal points at ygg-clean.sh, and
the example says to comment out chat-template-file until template has run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* ygg-gpu.sh setup|check: the toolkit and the CDI spec in the Podman machine, repeatable (local-models LM-T15)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-models.sh start|stop|status|load, and the qwen scripts find the server through it (local-models LM-T12)
qwen-local.sh and its test are removed; qwen-lib.sh reads ygg-models.sh status.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-models.sh: --folder, exact names, reserved networks, load retry; qwen scripts tell engine errors from not running (local-models LM-T12)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* The proof and smoke scripts take opencode:local/<name> roles and --models FILE (local-models LM-T13)
A local role writes models.file into the config and, for the reviewer, no reasoning line. The OpenRouter
key and the usd caps are asked for only when a role is on OpenRouter. A local role without --models is
refused before anything is made. The default roles give the same config as before.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* ygg-models.sh uses engine-side mount paths, a template step, and a hardened container (local-models review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* ygg-gpu.sh checks the engine before any wsl.exe -d and reads the state with one probe (local-models review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* Proof and smoke refuse two local models; the how-to uses the template step and the image (local-models review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* ygg-gpu.sh sends root scripts on stdin to sh -s, and the template step knows a fixed template (local-models review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
* The example model list takes temp, top-k and top-p from the model file, and sets only min-p (local-models review)
The Qwen GGUF carries general.sampling.temp, top_k and top_p, which llama-server uses unless a
preset key overrides them. The founder uses the model's own values in most cases.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01H5rHSQVuXrzFdTaNXZdSde
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The local models spike: a published port works from an internal network, the router's endpoints and preset format, OpenCode's bundled provider, the sidecar's DNS; CUDA needs the CDI spec in the Podman machine (LM-T01)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local models spike: item 1 confirmed once the toolkit is in the Podman machine; the machine has no systemd
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* ygg-build.sh builds ygg from the umbrella and records its commits, ygg-clean.sh runs doctor on ended runs, and the smoke and proof scripts refuse a stale ygg (ygg-build-clean)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-clean.sh refuses when it cannot tell a live run and also checks open lock files, and the guard follows links and prints the whole build command (ygg-build-clean review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The proof script takes decisions files, the retrospective role, and prints the ygg score line (typed-T29)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The proof script quotes the run id in the score line, refuses control characters in a decisions path, and wraps its header (typed-T29 review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A run that ends 5 is a finished run: the proof script records it and prints the ygg score line (typed-T29 review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The run grades itself and its retro follows: the proof script no longer runs ygg grade (typed-T29 review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* setup-repo.sh turns auto-merge on; check-repos.sh --check settings requires it
A pull request merges by itself once a human approves it and the required checks pass. The
ruleset is unchanged: one approval from someone other than the last pusher, and the checks.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* pr-open.sh opens a pull request as the bot and arms auto-merge; the merge invariant says why a human still decides
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
A pull request merges by itself once a human approves it and the required checks pass. The
ruleset is unchanged: one approval from someone other than the last pusher, and the checks.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The repo scripts make repos on an operator's own account ("owner": "user")
Any operator can now make private or public repos on their own GitHub account with the same setup as
ouroboric-dev's. A config with "owner": "user" gets it, with the differences GitHub forces:
- create-repo.sh creates through /user/repos, after checking that the token belongs to the config's
user, so a repo never lands on the wrong account.
- setup-repo.sh writes each user repo's own Actions allowlist (lint.yml's pinned actions, nothing
else), since a user has no org to hold it. On a user's private repo it skips secret scanning, push
protection and private vulnerability reporting, which GitHub doesn't offer there, and says so.
- If GitHub refuses the ruleset (a user's private repo without GitHub Pro), setup-repo.sh fails and
says main is not protected, after every other setting is in place; new-repo.sh then reports the repo
as unprotected. The ruleset itself is unchanged.
An operator's config is theirs, not the company's: it lives in scripts/orgs/local/, which git ignores
except for its README, and --org reads it from there (a name in both folders is refused). Only
generic examples are committed, in scripts/orgs/examples/: a user config and a proprietary licence
text that names no one. Invariant 9 in AGENTS.md says never to commit an operator's config, and a test
fails if any committed config is neither an org's nor an example. The fakes learn GET /user,
POST /user/repos and refused writes.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* check-repos.sh --check operator: no tracked file names the operator (invariant 9)
The check reads each repo's local clone and fails when a tracked file names the operator who runs it: their
login, their home folder's name, or a user account in scripts/orgs/local/, as whole words in any case. The
names come from the machine, so the check serves any operator and the script names no one;
CHECK_REPOS_OPERATOR replaces them. It prints the files, never the names, and fails closed on a missing
clone, an empty name list or a git error. The records of past work keep their paths as written: RECORDS
lists those files one by one, so a new plan beside them is still checked. It is a default check.
The local-qwen design, plan and how-to now give paths relative to the clones, and the design no longer
names the founder's folders. Invariant 9 also covers docs, plans and fixtures.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
stack() took the newest localhost/ygg-stack-<realm> image with `podman images ... | head -n 1`. With
several stack images, head closed the pipe while podman still wrote, podman died of SIGPIPE, and under
pipefail the command substitution failed: set -e stopped the script with 141 before its first line. The
founder's T30 smoke hit it twice after `ygg sandbox build` added images. sed -n 1p reads every line.
The test's stand-in podman lists several images and dies with 141 when its reader has gone; the new case
runs without --api-image and --web-image and checks the newest image of each realm is used.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* ygg-smoke-runtime.sh: the runtime smoke on an internal network (gallery-runtime-T26)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-proof-run.sh: a note and a reason also refuse U+2028 and U+2029 (gallery-runtime-T29)
Odin now refuses them; the script says so before it calls ygg.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-smoke-runtime.sh: bind-mapped engine paths, root cleanup, sturdier checks (gallery-runtime-T26)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-proof-run.sh: a note and a reason also refuse the C1 controls (gallery-runtime-T29)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* check-repos.sh --check services keeps the services' versions equal; niflheim-local joins the leaves (gallery-runtime-T27)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* check-repos.sh services: as in any case, FROM flags, and a variable pin fails (gallery-runtime-T27)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-smoke-runtime.sh: rm -f -v, a bounded no-answer test, start.sh compared with the template (gallery-runtime-T26)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The proof run sets the reviewer's reasoning effort, medium by default (F2)
--reviewer-reasoning low|medium|high|off goes into the reviewer role of the proof config, the plan line and
proof.meta; --continue refuses it as a setup flag. (gallery-runtime-T28)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A proof folder from before --reviewer-reasoning can still be continued (gallery-runtime-T28)
Without a reviewer_reasoning line in proof.meta, --continue shows "reasoning unset" in the plan; a bad value
still fails.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-proof-run.sh --continue --reject GATE --reason TEXT, run as --approve is; re-wrap the header (gallery-runtime-T29)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* ygg-proof-run.sh: neutral step 9 wording, report header records reasoning, wrap fixes (gallery-runtime-T29)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* Check the journal: journal-check.sh and the factory-change tag (v0-T285)
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
* journal-check compares the whole index row, refuses a duplicate, and reads quoted and block-style lists (v0-T285 review)
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
* journal-check reads bare scalar lists and tags in any case (v0-T285 review)
Co-Authored-By: Claude Haiku 5.5 <[email protected]>
* The proof-run script: setup and the dry run (v0-T290)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script resolves folders physically, never enters the suites folder, and refuses unsafe paths (v0-T290 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script: the run, the grade and the evidence (v0-T291)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script gives the credentials to the run only, survives any byte, keeps the run's exit code and passes signals on (v0-T291 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script kills the run's whole process group at the wall clock, starts no run after a stop, and redacts or withholds (v0-T291 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script never echoes a bad credentials line and stops the build on any signal (v0-T291 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run test fails if a Ctrl-C does not stop the build within five seconds (v0-T291 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run test never waits without a bound (v0-T291 review)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The proof-run script survives a terminal's Ctrl-C and hang-up, compares across proof folders, continues a stopped run itself, and cleans up after an abnormal end (ouroboric review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The proof-run script keeps its report after a Ctrl-C and a closed terminal, and writes proof.meta private (ouroboric review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The proof-run script keeps only its own files private and runs ygg with the caller's umask (ouroboric review)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Haiku 5.5 <[email protected]>
The hidden suite's reporter writes a score.json into the logs folder the grader keeps under the
run folder (grade/logs-*). The 'score.json nowhere else' check counted it as a leak. It is not
Odin's and no agent sees it, so the check skips that folder; a real leak is still caught.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
The first real run failed at the project export: node_modules/.bin/semver is a symlink and the
grader's export refuses anything that is not a regular file. npm ci now runs with --no-bin-links
(the reference starts with node server.mjs), and the script stops with a message if any other
symlink is left in node_modules.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
The grader smoke could only run smoke-notes against the public sample
suite that the script copies into its work folder. To grade the reference
solution of client-gallery-lite against the hidden suite, the script now
takes --task, --suite-dir and --reference: the grader's suite_dir is the
given store as it is (never copied, never read), the reference is put at
the project root on the host (with npm ci and node_modules committed, a
test-project hack because the grader has no network; open question
B-118), and the scripted agents only write a README so the run still ends
in the grade node. The engine's own output goes to files and the summary
holds numbers only, so the output is safe to paste.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
Run 20261021-231003-db15c7: Qwen raised the planted P4 fault, Sonnet fixed it, Qwen closed it,
and the grader scored the derived task smoke-notes 1.0.1000 at reward 1.0, for $0.0996.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* A --brief-note run is graded against a derived task version; the journal records the repair path (B-109)
With --brief-note, ygg-smoke-real.sh copies the task to the run's folder, writes the noted brief as its
instruction.md, sets brief_sha256 to the new hash and the version to the patch number plus 1000, and points
grader.tasks_dir at the copy. odin finds the task from the brief's path and refuses a changed brief, so the
run before this could not be graded. The journal entry on the reviewer model gets the three repair-path runs.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The journal promises no graded run, and names the gleipnir commits; the script warns that notes share a version (B-109)
The odin on main reads scores only from the keyed stdout line, which mimir's sample suite does not print yet, so
the journal no longer says the next run is graded. The go.work cause is in the past tense with the gleipnir
commits. The script's header says every note gives the same derived version, and the test names the odin commit
its loader rules were read from.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Journal: Qwen as the implementer gets reward 0.5, and the Qwen reviewer misses its faults (B-110)
Run 20261021-225348-f4bd10 changed only the implementer. Qwen3.8 27B wrote a Python product
that passed the unit check but failed 3 of 6 scenarios of the public suite (no labelled sign-up
field, 501 for a delete without a session), and the Qwen reviewer reported nothing.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The smoke can narrow the implementer's task with --brief-note and says whether its build used go.work (B-109, B-111)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* P4-note.md speaks of the implementer and names health as the one route without a session (B-109)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
The reviewer bench (B-108) ran Qwen3.8 27B on the planted fault P4, a delete that ignores the
owner, on OpenCode 1.18.32: 8 valid reports, 8 catches, one finding each, about $0.11. One of the
entry's open questions is answered; the repair path and Qwen as the implementer stay open.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* The real-agent smoke says which ygg it runs (B-111)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* The reviewer bench is a script with a test and planted-fault leaves (B-108)
scripts/ygg-reviewer-bench.sh runs N OpenCode reviewer sessions of one model on
a fresh copy of a leaf, with the smoke reviewer's prompt as the engine builds it
(odin testdata/smoke-grade/prompts/review.md, the smoke-notes brief, and
jormungandr's ReviewRequest), and the OpenCode adapter's settings (strict
OpenRouter provider, effort high, read-only, 10 turns). It prints the journal's
table: valid reports, findings, fault found, tokens and cost. A cost of 0 with
tokens prints as unknown. --dry-run prints the commands and spends nothing.
The leaves P0 to P3 are the product of the failed smoke run and its three
planted faults. P4 is new: DELETE removes another person's note, and it shows
only when server.js and notes.js are read together.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* A bench session gets only the variables the script names, and no global OpenCode config (B-108)
The engine's OpenCode session gets only the adapter's variables. The bench passed the caller's whole
environment, so an OPENCODE_* variable or ~/.config/opencode could change a session. Now each session
runs under env -i with PATH, HOME, TMPDIR, XDG_CACHE_HOME, the key and the OpenCode settings, and has
its own empty XDG_CONFIG_HOME. The header says the bench has no token limit, only the timeout, and
lists session-N.exit.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The reviewer bench's scorer is its own file, ygg-reviewer-bench.py (B-108)
The Python scorer moves out of the shell script, as qwen-measure.py is, and opens its files in with
blocks. Its output is unchanged: the tests pass as they were, and a replayed real session gives the
same summary byte for byte.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The real-agent smoke can start from a planted-fault leaf, say whether a finding took the repair path, and change the implementer (B-109, B-110)
--from-leaf LEAF copies odin's smoke pack into the run's folder with LEAF as the template of repos/notes and
every leaf file in the first commit. ygg-repair-path.sh reads the run's ledger and prints "repair path: finding
raised, fixed, closed" or the missing step; the smoke adds that line to its report. --implementer AGENT:MODEL
replaces the implementer line of the run's factory.yaml, such as opencode:openrouter/qwen/qwen3.8-27b.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The real-agent smoke checks the repair path only from a leaf, copies the whole report with --clip, and keeps a leaf's start.sh shebang (B-109, B-111)
The repair-path line runs only with --from-leaf, so a plain run does not end with a missing step. --clip no
longer goes to ygg-evidence.sh: the whole report.txt, with the ygg line and the repair path, goes to clip.exe at
the end. A run from a leaf starts an executable start.sh as a program and falls back to sh. A dry run prints
what happens after the run.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* AGENTS.md lists the reviewer bench and the smoke's new options (B-108, B-109, B-110)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* The real-agent smoke's test runs the tail after the run against a fake ygg, behind a guard (B-109, B-111)
run_real runs the script without --dry-run only when YGG_CMD is an executable in the test's temp folder and the
engine check is off; the folder and the credentials file are the test's. The fake ygg's run writes a made-up
ledger. The cases: a run from a leaf adds the repair-path line to report.txt, a plain run adds none, and --clip
gives clip.exe the whole report.txt with the ygg line.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
- products/yggdrasil: 3e2543e (#6) -> 9754911 (#81); products/asgard: 04ba71a -> 3e614b4 (#11).
- docs/1-company/repos.md lists all ouroboric-dev repos: the umbrellas, Yggdrasil's eight
leaves, .github, mimir, ouroboric-packages, and the hidden huldra.
- README.md and docs/README.md link to it instead of two drifting copies of a four-row table.
- The root README's map alt text matches docs/README.md again (Voluspa, Ginnungagap later).
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* Journal: the smoke passes with Qwen3.8 27B as the reviewer
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* Journal: four failed runs, not three
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* Journal: choosing the reviewer model (seed entry, result pending)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* Journal: the reviewer entry gets the full results, the planted faults and corrected counts
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* Journal: correct the output-cost lesson
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* Local Qwen 3.8 27B: design and plan
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-local.sh: start, stop and status for the local llama-server
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-opencode.sh: OpenCode on the local Qwen server
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-claude.sh: Claude Code on the local Qwen server, in its own config dir
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local Qwen: setup procedure and verified server flags
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-local.sh: native reasoning flags and MTP on by default
llama-server has --reasoning-effort and --reasoning off, so the plan's
--chat-template-kwargs is replaced (plan corrected in Task 2). The MTP
default, checked against this build's --help, drafts with mtp.gguf on the GPU.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Claude Code on local Qwen: fix the chat template, pass the context size
Claude Code sends hook context as a system message mid-conversation, and
Qwen's template refuses any system message after the first, so every
request failed with HTTP 500. qwen-local.sh template saves a copy that
renders it as a system turn, and start uses it. qwen-claude.sh tells
Claude Code the server's context (CLAUDE_CODE_MAX_CONTEXT_TOKENS).
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-opencode.sh: always --standalone
OpenCode 2 runs sessions in a background service that keeps the config
and environment it started with, so a later OPENCODE_CONFIG_CONTENT (and
the safety variables) were ignored. --standalone gives each session a
private server with exactly this config.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local Qwen: measured speed, context and reasoning effort
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-local.sh: cap the prompt cache in system RAM at 2 GB
llama-server keeps a prompt cache in system RAM, 8 GB by default. In an
agent session it grew past WSL's 12 GB memory cap, and the kernel's
out-of-memory killer stopped the server. With --cache-ram 2048 the
server stays at about 3.4 GB after five long prompts.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-local.sh: keep 4 context checkpoints, not 32
Qwen 3.8 is a hybrid model: each context checkpoint holds its recurrent
state in system RAM. With llama-server's default of 32, a long session
grew the server from 2 GB to 5.7 GB, and with an agent and Go tests
beside it, WSL's 12 GB cap was hit and the server was killed. With 4 it
stays at about 2.3 GB through 50K tokens of conversation.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local Qwen: three-way comparison and lessons
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-claude.sh: guard the account dirs in both modes; strip cloud switches
The config-dir guard covered only init and missed $HOME, so a run with
QWEN_CLAUDE_DIR=~/.claude would have used the work config, and init with
$HOME would have written ~/.claude.json. Both modes now refuse a dir that
is inside an account dir or holds one. The Bedrock, Vertex and Foundry
switches are removed, since they take Claude Code past the base URL.
Found by the final review.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local Qwen notes: the remaining config differences and the skills link
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-measure.py and qwen-capture.py: the measurement and capture tools
The speed, long-prompt and memory-growth measurements in the notes, and
the request capture that found the template and OpenCode service bugs,
were throwaway scripts. They are now repo tools with tests, so the
experiment can be repeated.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* qwen-compare.sh: run one task three ways and keep the evidence
The three-way comparison (OpenCode on local Qwen, Claude Code on local
Qwen, Claude Code on a hosted model) was a throwaway runner. It is now a
repo script with tests: throwaway worktrees at one commit, the same
prompt, and per run the output, diff, server-log slice and wall time.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
* Local Qwen: a reproduce how-to, the comparison's evidence, docs accepted
The how-to holds every step: setup, daily use, the measurements, the
comparison and request capture, with troubleshooting for what broke. The
notes keep the findings. The three B-071 diffs, the prompt and the run
summary are kept, since the worktrees are removed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
voluspa joins LEAVES, so the agents check looks in yggdrasil/voluspa.
The naming doc marks Voluspa built and screened. A journal entry
records the move of the graph, with H03 against H02.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* The smoke scripts take --graph and check the bind mount is mounted (voluspa-T013)
ygg run now takes --graph; ygg sandbox build keeps --realm. ygg-smoke-realms.sh
takes --graph NAME|DIR (default: odin's smoke-lead folder; a name needs a graphs
section in factory.yaml), ygg-smoke-loop.sh takes --graph DIR, and the grade and
real smokes pass --graph to ygg run.
ygg-smoke-realms.sh and ygg-engine.sh also refuse a bind folder that exists but
has nothing mounted on it (mountpoint -q), and say to run sudo mount --bind.
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* Fix round 1: the loop smoke checks the mount too; the message checks are enforced (voluspa-T013)
ygg-smoke-loop.sh gets the same mountpoint check as the realms smoke, and the
three scripts share one message. The message checks of the new tests now sit
inside check, and two tests pin the ^graphs: anchor (a commented-out section
and an indented one are both refused).
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
* ygg-smoke-grade.sh: the grader smoke on a real engine, with the public sample suite of smoke-notes (v0-T262)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* ygg-smoke-real.sh: the real-agent smoke with real caps, a dry run, a wall clock and the cost from the ledger (v0-T263)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* ygg-smoke-grade.test.sh: a dry run that loads the credentials in the main shell now fails the test
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* ygg-smoke-real.sh: no xtrace in the credential subshells, and a strict --wall
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* ygg-smoke-grade.sh: stop the engine poller on any exit, and a null reward does not pass as below 1
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* ygg-cost.sh and ygg-smoke-real.sh: odd ledger lines, a missing cap and a failing cost no longer break the run's result
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
The realms now share devcontainer/checks/protected-common with helheim-go,
so the shared check compares it alongside docs.sh. The fixture gives both
realms the same copy by default, and two new cases cover a differing copy
and a missing one in midgard-react.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
A container that died uncleanly left a netavark DNAT rule for port 8000
pointing at an address no container uses any more. It sat ahead of the
live pod's rule, so every Mermaid render failed while Kroki was healthy,
and recreating the pod did not help.
All Kroki requests now go through `podman exec` to the pod's loopback,
as D2 already did, and the pod publishes no port. No host port means
no forwarding rules that can go stale, and diagram sources cannot leave
the machine, so KROKI_URL and DIAGRAMS_ALLOW_REMOTE are gone.
Adds scripts/tests/diagrams.test.sh (fake podman, failing host curl).
Re-renders the diagrams, since the setup hash covers the script.
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
The founder rendered them with the local Kroki, which the design session couldn't reach from the host.
scripts/diagrams.sh check . reports "diagrams fresh".
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
* md-same-text: also compare blocks as the plan tools find them (base-ci follow-up)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* plan-generate.py: a blank line before the Files list, for MD032 (base-ci follow-up)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
* md-same-text: allow only the empty -> text info change in plan blocks (base-ci follow-up)
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
---------
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>