Read
AGENTS.mdanddocs/skills/README.mdbefore any work.
In-repo skills (version-controlled, always current — load these first):
- ujust recipes and gum patterns:
.github/skills/ujust-recipes.md- Local/hardware OTA testing:
docs/skills/local-ota.md- Agent role policies (Hive):
files/hive/agent-policies/- Full skill index:
docs/skills/README.md
/chronicle improve — target skills, not this file#
When running /chronicle improve or any session retrospective:
- Do not edit this file with session learnings.
- Write all findings to the appropriate file in
docs/skills/. - Use the routing table in
docs/skills/README.mdto find the right file. - If no relevant skill file exists, create one and add it to the routing table.
- Format: add a
### <pattern name> (YYYY-MM-DD)entry under## Lessons Learned.
Exception: Add a new entry to ## ⚠️ Hard rules below when a pattern has caused repeated failures across multiple sessions and warrants enforcement as a rule (not just knowledge). That is the only reason to edit this file.
This file contains hard architectural rules. docs/skills/ contains accumulated operational knowledge. Keep them separate.
Build commands#
just bst build oci/bluefin.bst # full image build (inside bst2 container)
just build # alias for the above
just export # export OCI image from BST into podman
just lint # bootc container lint (requires exported image)
just bst show oci/bluefin.bst # inspect element dependency graph
Builds run inside the pinned bst2 container. BST_FLAGS env var injects flags:
just bst build oci/bluefin.bst
⚠️ Hard rules (learned from real mistakes)#
1. Work directly in projectbluefin/dakota — always push to upstream#
git checkout upstream/main -b feature/my-change
git push upstream feature/my-change
Never push via the castrojo fork for any PR or retrigger intended for projectbluefin/dakota. The fork diverges and PRs/CI runs against the fork have no effect on upstream.
Dep-update PRs (auto/track-*) are same-repo branches in projectbluefin/dakota. Retrigger by pushing directly to upstream:
git push upstream local-branch:auto/track-foo
Verify your diff is clean before pushing:
git diff upstream/main...HEAD --stat
2. cargo2 source blocks are generated — never hand-written#
python3 files/scripts/generate_cargo_sources.py path/to/Cargo.lock
The first ~65 lines of a Rust BST element are hand-authored (build commands, install paths). Everything after that is generated crate manifest. Do not write crate entries by hand.
3. Layer elements must be kind: compose, not kind: stack#
Elements staged as /layer in OCI script elements must be kind: compose. kind: stack is a dependency aggregator that produces zero filesystem output — the image builds successfully but the layer is silently empty.
# ✅ correct — produces filesystem content
kind: compose
# ❌ wrong — silently empty layer
kind: stack
4. No /issues/NNN paths in issue bodies#
GitHub autolinks org/repo#NNN and /issues/NNN paths regardless of code fence context, firing cross-repo notifications. Write upstream references as plain text:
# ✅ correct
bootc-dev/bootc issue 7
# ❌ wrong — spams the other repo
https://github.com/bootc-dev/bootc/issues/7
5. Never post unsolicited GitHub comments#
Do not post a GitHub comment, review, or PR body edit unless explicitly asked to. Proactively posting comments has caused repeated inbox spam and user frustration across multiple sessions.
- One comment per PR when you do post — combine all findings.
- Never post to report status that is already visible in the GitHub UI (CI pass/fail, merge queue position).
- When in doubt: do the task silently and report back in the chat, not on GitHub.
6. All pushes target upstream (projectbluefin/dakota), never origin (the fork)#
The castrojo/dakota fork exists only as a working copy. Never push a PR branch to origin. Always push to upstream:
git push upstream my-branch
PRs are opened against projectbluefin/dakota. The fork is irrelevant to the PR workflow.
7. Check projectbluefin/testsuite before building any e2e/testing infrastructure#
projectbluefin/testsuite provides a reusable workflow for all GNOME desktop e2e testing. Before implementing any e2e, VM boot, SSH, or QEMU pipeline:
- Check
projectbluefin/testsuite/.github/workflows/for an existing reusable workflow. - If it exists, call it — do not build a parallel solution.
# ✅ correct — delegate to testsuite
uses: projectbluefin/testsuite/.github/workflows/e2e.yml@<sha>
with:
image: ghcr.io/projectbluefin/dakota:testing
suites: smoke
Building a custom QEMU/SSH/BIB pipeline when a reusable action exists wastes sessions and always loses.
8. Mandatory skill contribution before task_complete#
Every PR must include an update to the relevant docs/skills/ file (per AGENTS.md). Before marking a task complete, verify:
- Did any code change introduce a new pattern worth documenting? → add to the relevant skill file.
- Is a new skill file needed? → create it and add it to
docs/skills/README.mdrouting table.
task_complete without the skill contribution is incomplete.
CI overview#
- Schedule: nightly at 13:00 UTC (after gnome-build-meta nightly ~08:00 UTC finish)
- Publish triggers:
merge_group,schedule,workflow_dispatch(notpull_request) - Remote cache:
cache.projectbluefin.io:11002(mTLS —CASD_CLIENT_CERT+CASD_CLIENT_KEY) - Image:
ghcr.io/projectbluefin/dakota:{testing,latest,stable}and:<sha>
Key architecture#
- Built on gnome-build-meta + freedesktop-sdk via BST junctions
elements/bluefin/deps.bst(kind: stack) — add new packages hereelements/oci/layers/— compose chain filters artifacts into the final layerelements/oci/bluefin.bst— final OCI assembly scriptpatches/gnome-build-meta/— drop.patchfiles here (alphabetical order, no edits tognome-build-meta.bst)