107 Commits
Author SHA1 Message Date
h0ffmann d876269679 Merge pull request #4 from piabrota/hard-fork-notice
Add the hard fork notice to the README
2026-11-01 06:18:36 -03:00
Matheus HoffmannandClaude Opus 5.5 73f6a24825 Write the hard fork notice as the astrbot_dw repos do
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 06:13:49 -03:00
Matheus HoffmannandClaude Opus 5.5 b365806692 Add the hard fork notice to the README
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 06:11:15 -03:00
h0ffmann 960984b928 Merge pull request #3 from piabrota/eye-logo-png
Add the eye logo as a PNG
2026-11-01 05:35:30 -03:00
Matheus HoffmannandClaude Opus 5.5 d643c5df12 Add the eye logo as a PNG
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]>
2026-11-01 05:32:45 -03:00
h0ffmann e5df894581 Merge pull request #2 from piabrota/piabrota-chart
Make mu the company chart: eight products, forks, logo, む
2026-11-01 05:27:13 -03:00
Matheus HoffmannandClaude Opus 5.5 73ab972bb1 Pin graphify in forks/ and refresh the fork list
PIABROTA.md now lists the org's 14 forks as they are today, with fresh sync counts.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 05:24:45 -03:00
Matheus HoffmannandClaude Opus 5.5 1a0f30f9af Make mu the company chart: the eight products, the site's logo, む, adr-verbatim
- 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]>
2026-11-01 05:23:40 -03:00
h0ffmann fd1d404c4f Merge pull request #1 from piabrota/piabrota-identity
Convert mu to the piabrota identity
2026-11-01 04:50:17 -03:00
Matheus HoffmannandClaude Opus 5.5 e40e46c2e4 Convert mu to the piabrota identity: dogma, repo index, Rust templates, archify
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]>
2026-11-01 04:38:43 -03:00
a2573b34e2 ygg-build.sh --beside-path and the guard on YGG_CMD (B-214); qwen-claude.sh init without a personal folder (B-212) (#92)
* 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]>
2026-10-27 20:45:29 +01:00
bfeae79ce2 The local Qwen how-to points to the operations guide for the server setup (local-models-setup LS-T4) (#91)
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]>
2026-10-26 10:20:27 +01:00
dc71c33042 ygg-models.sh setup and clean: the local model server in one command (#90)
* 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]>
2026-10-26 02:43:23 +00:00
584811d86d Local models: ygg-models.sh, ygg-gpu.sh, and local roles in the proof and smoke scripts (#89)
* 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]>
2026-10-26 02:13:33 +01:00
ab109728a0 The local models spike (LM-T01): the engine facts behind the local models spec (#88)
* 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]>
2026-10-25 22:39:56 +00:00
86cc856fb6 ygg-build.sh and ygg-clean.sh, and the smoke and proof scripts refuse a stale ygg (#87)
* 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]>
2026-10-25 10:19:05 +00:00
d8495dce11 The proof script takes decision files and the retrospective role, and prints the ygg score line (typed-T29) (#85)
* 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]>
2026-10-25 08:59:11 +01:00
14ac180210 pr-open.sh arms auto-merge only when the base is the default branch, so a stacked PR never merges without a human (#86)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-25 07:52:19 +01:00
16e372e622 PRs the pr-bot opens arm auto-merge; the merge invariant says a human's approval decides (#84)
* 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]>
2026-10-24 21:58:15 +00:00
84d7d8f9ba ygg-engine.sh says what podman said, and names a missing runtime dir, instead of guessing at a hung engine (#83)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-24 23:47:38 +02:00
9de8d187a5 setup-repo.sh turns auto-merge on; check-repos.sh --check settings requires it (#82)
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]>
2026-10-24 22:26:59 +02:00
8d401929b6 The repo scripts make repos on an operator's own account ("owner": "user") (#81)
* 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]>
2026-10-24 18:35:25 +02:00
9bdcb66f48 ygg-smoke-runtime.sh: the newest stack image without SIGPIPE (found in gallery-runtime T30) (#80)
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]>
2026-10-23 22:12:25 +02:00
03ef41a428 The runtime smoke and the services check (gallery-runtime T26, T27) (#79)
* 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]>
2026-10-23 15:47:23 +02:00
e982c3a26a ygg-proof-run.sh: the reviewer's reasoning effort and --reject (gallery-runtime T28, T29) (#78)
* 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]>
2026-10-23 10:43:31 +02:00
9077261221 Phase 6: journal-check.sh and the proof-run script (v0-T285, v0-T290, v0-T291) (#77)
* 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]>
2026-10-22 20:26:37 +02:00
5975dbf7f4 The grade smoke ignores the suite's own score.json in the grader's logs folder (#76)
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]>
2026-10-22 03:31:18 +02:00
c0258f28c6 The grade smoke installs the reference without .bin links (#75)
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]>
2026-10-22 03:20:58 +02:00
fc9111faa4 Grade the reference of a task against a suite store, without a copy (#74)
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]>
2026-10-22 03:03:00 +02:00
f8e14a4a34 Journal: the repair path again, graded: reward 1.0 on the derived task (B-109) (#73)
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]>
2026-10-22 01:14:29 +02:00
31f79101d6 A --brief-note run is graded against a derived task version; the journal records B-109 and B-110 (#72)
* 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]>
2026-10-22 01:09:22 +02:00
b53383c628 The smoke can narrow the implementer's task (--brief-note, B-109) and names the go.work its build used (#71)
* 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]>
2026-10-22 00:29:13 +02:00
104838df38 Journal: Qwen finds a fault across two files (P4, 8 of 8) on the engine's OpenCode (#70)
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]>
2026-10-22 00:03:43 +02:00
38165949ce The reviewer bench runs the OpenCode version the engine pins (B-108) (#69)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-21 23:39:21 +02:00
0f6b3faad9 The smoke says which ygg it runs (B-111); the reviewer bench (B-108); repair-path and implementer options (B-109, B-110) (#68)
* 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]>
2026-10-21 23:12:42 +02:00
e403734df9 Point at yggdrasil 5802a01: the leaves on their latest main (yggdrasil #82) (#67)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-21 01:11:37 +02:00
41ac58d470 Products on their latest main; a repositories page lists every repo (#66)
- 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]>
2026-10-21 00:27:55 +02:00
15aee5a1cb Journal: the smoke passes with Qwen3.8 27B as the reviewer (#65)
* 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]>
2026-10-20 23:04:55 +02:00
fc8c864e56 Journal: choosing the reviewer model (seed entry) (#64)
* 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]>
2026-10-20 22:46:39 +02:00
2858c115f7 Local Qwen 3.8 27B: scripts, a how-to, and a three-way comparison (#63)
* 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]>
2026-10-20 02:12:29 +02:00
b92de01967 check-repos knows voluspa; the naming doc and the journal record it (voluspa-T016) (#62)
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]>
2026-10-20 00:07:43 +02:00
603c083bd8 The smoke scripts take --graph; the bind check needs a mount (voluspa-T013) (#61)
* 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]>
2026-10-19 23:14:20 +02:00
618c8c553b Phase 5c: the grader smoke and the real-agent smoke scripts (v0-T262, v0-T263) (#59)
* 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]>
2026-10-19 12:06:55 +02:00
d9d9018a15 check-repos: shared check covers protected-common (protected-configs-T003) (#60)
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]>
2026-10-19 12:02:28 +02:00
b8ddd09350 diagrams.sh: reach Kroki inside its pod, publish no host port (#58)
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]>
2026-10-19 01:57:53 +02:00
d2be93482a Render the two maps again: the SVGs were stale since #45 (#57)
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]>
2026-10-19 01:51:56 +02:00
e20aa673a7 Realm readiness: say what the protected paths do not cover yet, and the one skipping template test (realm-readiness-final) (#56)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-19 01:31:34 +02:00
182a503fca Document the realm readiness checklist and the shared check (realm-readiness-T009) (#55)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-19 00:34:49 +02:00
94c0a87120 Base CI: the full pre-commit base CI, with lint required after merge (base-ci-T008) (#54)
Co-authored-by: Bruno Guilhermo de Barros Valério <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
2026-10-18 23:43:29 +02:00
7508c777f3 md-same-text compares plan blocks as the plan tools see them; plan-generate passes MD032 (#53)
* 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]>
2026-10-18 23:29:02 +02:00