Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
d43d372
feat(network): add canonical transfer policy
boburning Aug 26, 2026
2415ead
fix(network): provision public transfer roots
boburning Aug 26, 2026
b6eab76
docs(network): record NET-02 device evidence
boburning Aug 26, 2026
9fbaea2
fix(network): make SFTP publication cancel-safe
boburning Aug 26, 2026
aff110b
docs(network): record cancel-safe NET-02 gates
boburning Aug 26, 2026
ef9dbec
fix(network): restore SSH after delayed boot association
boburning Aug 27, 2026
354cb7f
fix(network): require DHCP readiness before services
boburning Aug 27, 2026
6904df1
test(network): wait for watcher cleanup
boburning Aug 27, 2026
864049b
fix(network): verify DHCP watcher startup
boburning Aug 27, 2026
1b35c5d
ci: parallelize fail-fast shell tests
boburning Aug 27, 2026
eb00a08
fix(network): reconcile restored rollback failures
boburning Aug 27, 2026
632da91
ci: parallelize exhaustive validation
boburning Aug 27, 2026
a90748a
ci: reserve exhaustive cppcheck for merge queue
boburning Aug 27, 2026
0b5c706
ci: expose exact-head exhaustive gate
boburning Aug 27, 2026
6f3ce2b
fix(network): make Wi-Fi recovery converge safely
boburning Aug 27, 2026
e639921
fix(network): recover Wi-Fi toggles after partial apply
boburning Aug 27, 2026
1214608
ci: run static analysis beside native tests
boburning Aug 27, 2026
00c1f1e
fix(network): make Wi-Fi mutations rollback-safe
boburning Aug 27, 2026
d74fea5
test(network): provide complete runtime status fixture
boburning Aug 27, 2026
ac9c0cd
fix(deploy): require atomic network helper bundle
boburning Aug 27, 2026
aec6bd3
fix(network): retry timed rollback recovery
boburning Aug 27, 2026
7758e36
ci: bound exhaustive cppcheck configuration expansion
boburning Aug 27, 2026
72ec706
fix(network): recover interrupted mutations during boot
boburning Aug 27, 2026
5017d2e
fix(network): persist boot recovery to device profile
boburning Aug 28, 2026
6f83b9b
fix(network): persist Wi-Fi preference to device profile
boburning Aug 28, 2026
fced082
fix(network): stop inherited BusyBox telnet listener
boburning Aug 28, 2026
e04539d
fix(network): avoid replaying untouched watchdog baseline
boburning Aug 28, 2026
6565d34
fix(network): reject unqualified remote Wi-Fi disable
boburning Aug 28, 2026
bc6abaf
docs(program): mark NET-02 merge ready
boburning Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*.py text eol=lf
*.json text eol=lf
build/openbor/*.patch text eol=lf whitespace=-trailing-space,-space-before-tab
tools/patches/*.patch text eol=lf whitespace=-trailing-space,-space-before-tab
tools/bloom-device text eol=lf
tools/*.sh text eol=lf
tools/bloom-mini-test text eol=lf
Expand Down
5 changes: 3 additions & 2 deletions .github/workflows/shell-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ on:
- 'tools/core_manifest.py'
- 'tools/validate_core_inventory_disposition.py'
- 'tools/provenance_policy.py'
- 'tools/run-shell-tests.sh'
- 'tools/shell_test_inputs.py'
- 'tools/legacy_manifest.py'
- 'tools/validate_core_selection_policy.py'
Expand Down Expand Up @@ -76,9 +77,9 @@ jobs:
if [ "$targets" = full ]; then
make test-shell
elif [ "$targets" != none ]; then
docker run --rm --volume "$PWD:/workspace:ro" \
./tools/run-shell-tests.sh "$PWD" \
ghcr.io/boburning/bloomos-shell-test@sha256:36adeca7c265345688ebf47b575c56e350b9016257e0a9ed15c63dc7e0447d63 \
$targets
1 $targets
fi
{
echo '| Gate | Seconds | Scope |'
Expand Down
81 changes: 55 additions & 26 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: Test build
on:
merge_group:
workflow_dispatch:
pull_request:
paths:
- '.github/workflows/test.yml'
Expand Down Expand Up @@ -29,6 +30,55 @@ concurrency:
cancel-in-progress: true

jobs:
static-analysis:
name: Static analysis
runs-on: ubuntu-latest

steps:
- name: Install cppcheck
run: |
sudo apt-get update
sudo apt-get install --yes cppcheck
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 2
- name: Resolve static-analysis scope
id: scope
if: github.event_name == 'pull_request'
shell: bash
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: echo "targets=$(git diff --name-only "$BASE_SHA"...HEAD | sh tools/ci-scope.sh static-analysis)" >> "$GITHUB_OUTPUT"
- name: Run static analysis
shell: bash
run: |
started=$SECONDS
targets='${{ steps.scope.outputs.targets }}'
if [ '${{ github.event_name }}' != 'pull_request' ]; then
# Full-source integration remains exhaustive by ownership boundary,
# while native, ASan, and ARM compile the real configurations. Avoid
# cppcheck's speculative exponential preprocessor expansion here too.
make static-analysis CPPCHECK_JOBS="$(nproc)" \
CPPCHECK_CONFIG_FLAGS=--max-configs=1
targets=full
elif [ "$targets" = full ]; then
# PR feedback keeps the complete source closure but bounds speculative
# configuration expansion. Merge-group runs retain the exhaustive gate.
make static-analysis CPPCHECK_JOBS="$(nproc)" \
CPPCHECK_CONFIG_FLAGS=--max-configs=1
elif [ "$targets" != none ]; then
# Native, ASAN, and ARM builds cover the real configurations. Bound
# speculative preprocessor expansion for the affected PR components;
# unused-function analysis needs the full source closure below.
make static-analysis CPPCHECK_JOBS="$(nproc)" \
CPPCHECK_CONFIG_FLAGS="--max-configs=1 --suppress=unusedFunction" \
STATIC_ANALYSIS_TARGETS="$targets"
fi
echo "| Gate | Seconds | Scope |" >> "$GITHUB_STEP_SUMMARY"
echo "|---|---:|---|" >> "$GITHUB_STEP_SUMMARY"
echo "| Static analysis | $((SECONDS - started)) | $targets |" >> "$GITHUB_STEP_SUMMARY"

build:
name: Test build
runs-on: ubuntu-latest
Expand All @@ -37,7 +87,7 @@ jobs:
- name: Install test dependencies
run: |
sudo apt-get update
sudo apt-get install --yes build-essential cmake cppcheck libgtest-dev libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev
sudo apt-get install --yes build-essential cmake libgtest-dev libsdl1.2-dev libsdl-image1.2-dev libsdl-ttf2.0-dev
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand Down Expand Up @@ -65,27 +115,6 @@ jobs:
run: |
echo '| Gate | Seconds | Scope |' >> "$GITHUB_STEP_SUMMARY"
echo '|---|---:|---|' >> "$GITHUB_STEP_SUMMARY"
- name: Resolve static-analysis scope
id: scope
if: github.event_name == 'pull_request'
shell: bash
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: echo "targets=$(git diff --name-only "$BASE_SHA"...HEAD | sh tools/ci-scope.sh static-analysis)" >> "$GITHUB_OUTPUT"
- name: Run static analysis
run: |
started=$SECONDS
targets='${{ steps.scope.outputs.targets }}'
if [ '${{ github.event_name }}' != 'pull_request' ] || [ "$targets" = full ]; then
make static-analysis
targets=full
elif [ "$targets" != none ]; then
make external-libs
# Native, ASAN, and ARM builds cover the real configurations. Bound
# speculative preprocessor expansion for the affected PR components.
cppcheck --max-configs=1 -I include --enable=all $targets
fi
echo "| Static analysis | $((SECONDS - started)) | $targets |" >> "$GITHUB_STEP_SUMMARY"
- name: Resolve affected test risk
id: tests
if: github.event_name == 'pull_request'
Expand All @@ -103,10 +132,10 @@ jobs:
started=$SECONDS
filters='${{ steps.tests.outputs.filters }}'
if [ '${{ github.event_name }}' != 'pull_request' ] || [ "$filters" = full ]; then
GTEST_INCLUDE_DIR=/usr/include make test
GTEST_INCLUDE_DIR=/usr/include make -j"$(nproc)" test
filters=full
elif [ "$filters" != none ]; then
GTEST_INCLUDE_DIR=/usr/include make test GTEST_FILTER="$filters"
GTEST_INCLUDE_DIR=/usr/include make -j"$(nproc)" test GTEST_FILTER="$filters"
fi
echo "| Native | $((SECONDS - started)) | risk ${{ steps.tests.outputs.risk || '3' }}, $filters; visuals ${{ steps.tests.outputs.visuals || 'full' }} |" >> "$GITHUB_STEP_SUMMARY"
- name: Test with AddressSanitizer
Expand All @@ -117,9 +146,9 @@ jobs:
started=$SECONDS
filters='${{ steps.tests.outputs.filters }}'
if [ '${{ github.event_name }}' != 'pull_request' ] || [ "$filters" = full ]; then
GTEST_INCLUDE_DIR=/usr/include SANITIZE=1 make test
GTEST_INCLUDE_DIR=/usr/include SANITIZE=1 make -j"$(nproc)" test
filters=full
elif [ "$filters" != none ]; then
GTEST_INCLUDE_DIR=/usr/include SANITIZE=1 make test GTEST_FILTER="$filters"
GTEST_INCLUDE_DIR=/usr/include SANITIZE=1 make -j"$(nproc)" test GTEST_FILTER="$filters"
fi
echo "| ASan | $((SECONDS - started)) | risk ${{ steps.tests.outputs.risk || '3' }}, $filters |" >> "$GITHUB_STEP_SUMMARY"
16 changes: 13 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ endif

TOOLCHAIN := aemiii91/miyoomini-toolchain@sha256:e5123590ad75d27f0f4c91196e3119a255cad45f3ae15243e29a8e0a2ec50132
SHELL_TEST_IMAGE := ghcr.io/boburning/bloomos-shell-test@sha256:36adeca7c265345688ebf47b575c56e350b9016257e0a9ed15c63dc7e0447d63
SHELL_TEST_JOBS ?= 8
CPPCHECK_JOBS ?= 8
CPPCHECK_BUILD_DIR ?= $(BUILD_TEST_DIR)/cppcheck
CPPCHECK_CONFIG_FLAGS ?=
STATIC_ANALYSIS_TARGETS ?= $(SRC_DIR)

include ./src/common/commands.mk

Expand Down Expand Up @@ -172,6 +177,7 @@ core: $(CACHE)/.setup shared-libs
@cp $(ROOT_DIR)/build/ra-core-policy.json $(BUILD_DIR)/.tmp_update/config/ra-core-policy.json
@cp $(ROOT_DIR)/build/core-selection-policy.json $(BUILD_DIR)/.tmp_update/config/core-selection-policy.json
@cp $(ROOT_DIR)/build/save-migration-policy.json $(BUILD_DIR)/.tmp_update/config/save-migration-policy.json
@cp $(ROOT_DIR)/build/transfer-policy.json $(BUILD_DIR)/.tmp_update/config/transfer-policy.json
@cp $(ROOT_DIR)/build/system-catalog.json $(BUILD_DIR)/.tmp_update/config/system-catalog.json

# Build dependencies for installer
Expand Down Expand Up @@ -274,6 +280,9 @@ package-release-unsigned:
--policy $(ROOT_DIR)/build/save-migration-policy.json \
--schema $(ROOT_DIR)/build/save-migration-policy.schema.json \
--core-policy $(ROOT_DIR)/build/core-selection-policy.json
@python3 $(ROOT_DIR)/tools/validate_transfer_policy.py \
--policy $(ROOT_DIR)/build/transfer-policy.json \
--schema $(ROOT_DIR)/build/transfer-policy.schema.json
@python3 $(ROOT_DIR)/tools/legacy_manifest.py validate \
--repository $(ROOT_DIR) \
--manifest $(ROOT_DIR)/build/legacy-manifest.json
Expand Down Expand Up @@ -360,14 +369,15 @@ test: external-libs
@cp -R $(TEST_SRC_DIR)/infoPanel_test_data $(BUILD_TEST_DIR)/
cd $(BUILD_TEST_DIR) && LD_LIBRARY_PATH=$(ROOT_DIR)/lib/ ./test $(if $(GTEST_FILTER),--gtest_filter=$(GTEST_FILTER),)

static-analysis: external-libs
@cd $(ROOT_DIR) && cppcheck -I $(INCLUDE_DIR) --enable=all $(SRC_DIR)
static-analysis:
@mkdir -p $(CPPCHECK_BUILD_DIR)
@cd $(ROOT_DIR) && cppcheck --quiet --cppcheck-build-dir=$(CPPCHECK_BUILD_DIR) -j $(CPPCHECK_JOBS) $(CPPCHECK_CONFIG_FLAGS) -I $(INCLUDE_DIR) --enable=all $(STATIC_ANALYSIS_TARGETS)

format:
@find ./src -regex '.*\.\(c\|h\|cpp\|hpp\)' -exec clang-format -style=file -i {} \;

test-shell:
docker run --rm --volume "$(ROOT_DIR):/workspace:ro" $(SHELL_TEST_IMAGE) /workspace/test/shell
./tools/run-shell-tests.sh "$(ROOT_DIR)" "$(SHELL_TEST_IMAGE)" "$(SHELL_TEST_JOBS)"

rebuild-shell-test-image:
rm -rf $(BUILD_TEST_DIR)/shell-test-inputs
Expand Down
8 changes: 4 additions & 4 deletions build/dependencies.lock
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,10 @@ legacy_channels = ["development"]
[legacy_inventory]
manifest = "build/legacy-manifest.json"
schema = 1
component_count = 329
file_count = 2128
byte_count = 314611699
source_build_components = 225
component_count = 330
file_count = 2129
byte_count = 314637632
source_build_components = 226
unresolved_components = 104
inherited_baseline = "07505ea58c7bba698d6b9220ff43946a43cac76b"

Expand Down
53 changes: 33 additions & 20 deletions build/legacy-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/runtime.sh",
"file_count": 1,
"byte_count": 43892,
"tree_sha256": "1bb79b1f7830bed84571c6279f96ae8516a5f85cbdbbbceeb022382127c8357a",
"byte_count": 45051,
"tree_sha256": "c6a9227bdbe235e730a9610bff62444889e975b7de8ba135f9c3c639948d657a",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -488,8 +488,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-dev-deploy",
"file_count": 1,
"byte_count": 29280,
"tree_sha256": "25ea32af0dcb972020ec907a244910b95eb95358208e01b2e3c46d237a6a0a75",
"byte_count": 30546,
"tree_sha256": "2ebc4df09a587d005dbc16815376341d1df83d7075908e0bbf79956a24616dc2",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand All @@ -501,8 +501,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-dev-ssh",
"file_count": 1,
"byte_count": 12254,
"tree_sha256": "5b3e19adbaf8ffd584980316584a38f5287822f8db69b98038de50d76b3cbc20",
"byte_count": 13539,
"tree_sha256": "967940060ee432fe115d726afef2ad59ce07d07bcf1e11db5e3e7a71e5514b9f",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -592,8 +592,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-listener-audit",
"file_count": 1,
"byte_count": 2713,
"tree_sha256": "76dd00d7010451a0e519e451c388a7473a90c83a421b071d3ae3b8b208c0ff1f",
"byte_count": 2723,
"tree_sha256": "d0d0cc448e9122be7275d73c474619bb0515a9785b7beecf11af0574f73756ed",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand All @@ -605,8 +605,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-network",
"file_count": 1,
"byte_count": 5444,
"tree_sha256": "13919974b5733721c9a68e847086d101aa4968850e237c8e8bd1cdeca0161bca",
"byte_count": 8583,
"tree_sha256": "ee0dd293f4c6e56efd7c853203db60209d116b8f8858a51aaa0734019f11662b",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand All @@ -618,8 +618,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-network-services",
"file_count": 1,
"byte_count": 11212,
"tree_sha256": "eaa9064c27affd9517c3ab015d74ca6575292749f6f58f8aa08bfbdfff7374e1",
"byte_count": 11448,
"tree_sha256": "8623b11bbf007bd87380f8acd514c41cea1f2b83ecca0a8f5186ef8cbda65a3e",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand All @@ -631,8 +631,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-network-transaction",
"file_count": 1,
"byte_count": 24317,
"tree_sha256": "63c23451c6fdfcb24d59fbee2a65ce87d1e2f484674c72a6af5423f780f123ca",
"byte_count": 27658,
"tree_sha256": "96398c18ceb12113691600ebdf18de86ff8a1dc96022ecaa9d0111f851495efe",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -787,8 +787,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-sftp-gate",
"file_count": 1,
"byte_count": 695,
"tree_sha256": "b8bb9b4ffae1e679834ab32a331baec358d9b0e9167c0ea2852f1b32f0375d99",
"byte_count": 1700,
"tree_sha256": "87505677c82771b4a49bbb222ac1f163d25b95782944f4d370ae920cdc017fca",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -847,6 +847,19 @@
"build_recipe": "Makefile",
"resolution": "source-build"
},
{
"id": "runtime-tmp-update-bin-bloom-transfer-policy",
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-transfer-policy",
"file_count": 1,
"byte_count": 7277,
"tree_sha256": "c2030f81a3648e610495089dc41a7cf18fe1ba12e9436ff4cd55ff7d871e895a",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
"build_recipe": "Makefile",
"resolution": "source-build"
},
{
"id": "runtime-tmp-update-bin-bloom-update-activate",
"kind": "runtime",
Expand Down Expand Up @@ -969,8 +982,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/bin/bloom-wifi",
"file_count": 1,
"byte_count": 3258,
"tree_sha256": "8e83b7a25c221b52a046847d5b81c68f3b7f9b04bc7b6cb417d91b5a780ed175",
"byte_count": 9401,
"tree_sha256": "d7dd29d8ae55b7d5f2e8b2febf1bfc318dd60f389e7bab0fe59da12e14f3d7ab",
"source": "https://github.com/boburning/BloomOS",
"source_revision": "release-commit",
"license": "GPL-3.0-only",
Expand Down Expand Up @@ -2295,8 +2308,8 @@
"kind": "runtime",
"path": "static/build/.tmp_update/script/network",
"file_count": 7,
"byte_count": 32703,
"tree_sha256": "2b826c557f9d7c948a61e9e5a45e98f111f973e80d55b70b089b1ca2d73a9289",
"byte_count": 33775,
"tree_sha256": "b8a1ea55882c2d64a63debcaf88f8bb2f45ea3038a149eab8b4877e0c97eb6df",
"source": "https://github.com/OnionUI/Onion",
"source_revision": "07505ea58c7bba698d6b9220ff43946a43cac76b",
"license": "GPL-3.0-only",
Expand Down
Loading
Loading