Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
6a63657
docs: standardize operator-facing tape devices on the no-rewind /dev/…
Amantux Sep 11, 2026
b4f9bb2
feat: add opt-in docker-compose.hardware.example.yml for containerize…
Amantux Sep 11, 2026
5bda299
feat(mhvtl): rehearsal rig — 1 changer + 3 LTO-8 drives + 8 barcoded …
Amantux Sep 11, 2026
3b99e4d
feat(hardware): parse drive unit serial number from sg_inq
Amantux Sep 11, 2026
dee3ca2
feat(hardware): correlate drive elements to devices by serial, refuse…
Amantux Sep 11, 2026
00a3ba3
test: three-drive coverage for the simulator, scheduler and hardware …
Amantux Sep 11, 2026
948328b
docs: document serial-based multi-drive correlation in hardware setup
Amantux Sep 11, 2026
4a8ae99
fix(mtx): parse drive barcodes and import/export slots from real mtx …
Amantux Sep 11, 2026
3d6009a
fix(ltfs): talk to drives on their sg node, parse real device_list, w…
Amantux Sep 11, 2026
bb65284
fix(tests): hardware helpers issued SCSI on rewinding nodes and a 6-c…
Amantux Sep 11, 2026
868cdc2
feat(mhvtl): scratch formatting, reset, larger media, and the rig README
Amantux Sep 11, 2026
3dbd8ec
docs: record the first real-backend test pass (mhvtl rehearsal)
Amantux Sep 11, 2026
49c8c92
fix(validation): device_list_ok compared a tape node against LTFS sg …
Amantux Sep 11, 2026
dabb83e
docs: drop the python fence on a keyword-argument snippet
Amantux Sep 11, 2026
149fabc
fix(hardware): close the correlation gaps found in adversarial review
Amantux Sep 11, 2026
ab5f0fc
fix(mtx): keep import/export slots out of the storage-slot list
Amantux Sep 11, 2026
68069c0
fix(ltfs): unmount succeeds only when the drive is actually free
Amantux Sep 11, 2026
530b4ae
fix(mhvtl): scope the rig scripts so they cannot touch the wrong tape…
Amantux Sep 11, 2026
49fd2f1
docs: record what adversarial review changed in the rehearsal
Amantux Sep 11, 2026
a74842d
chore: ignore the hardware perf-test results file
Amantux Sep 11, 2026
0793a35
docs: fix heading level and widen section 4 to cover sg.py
Amantux Sep 11, 2026
da86461
docs: the bring-up plan is not on master, so stop linking to it as if…
Amantux Sep 11, 2026
10955d7
Merge feat/three-drive-serial-correlation (keep both hardware-setup s…
Amantux Sep 11, 2026
939515d
Merge feat/mhvtl-rehearsal (keep both mtx sample imports)
Amantux Sep 11, 2026
814e25e
test: I/E characterization test asserts the fixed behavior (separate …
Amantux Sep 11, 2026
37434a5
test: pin i3 irregular mtx forms + high element addresses round-trip …
Amantux Sep 11, 2026
e02014a
docs: real i3 bring-up plan — ordered obstacles from repo baseline to…
Amantux Sep 11, 2026
28f08f1
docs: first-contact gate — ordered 10-minute isolation sequence for t…
Amantux Sep 11, 2026
30294c3
docs: record the parked CI/README tail of the Flask NAS + parity-cove…
Amantux Sep 11, 2026
48378f0
campaign: deterministic real-data dataset generator + manifest
Amantux Sep 11, 2026
a13772e
fix(cli): honour OPENBLADE_BACKEND instead of always simulating
Amantux Sep 11, 2026
e2a2495
feat(assistant): read-only Ollama-backed operator assistant core
Amantux Sep 11, 2026
2119553
feat(cli): add `openblade assist` (one-shot and interactive REPL)
Amantux Sep 11, 2026
f4ffd5f
docs(wiki): generate the CLI and API reference from live introspection
Amantux Sep 11, 2026
8739f79
test(assistant): 77 tests incl. mutation-checked read-only guards
Amantux Sep 11, 2026
c23b0f1
fix(tape-ops): load the cartridge before formatting; log the real fai…
Amantux Sep 11, 2026
b983b21
docs(wiki): assistant setup, capabilities, and the safety line
Amantux Sep 11, 2026
24271e9
fix(ltfs): read real tape capacity from the mount, and stop zeroing u…
Amantux Sep 11, 2026
3c415b3
docs(wiki): operator guides for every user-facing function
Amantux Sep 11, 2026
fb795d6
docs(wiki): sharpen the mock-init warning in getting-started
Amantux Sep 11, 2026
2892e67
fix(archive): a full tape is not a valid home for a zero-byte file
Amantux Sep 11, 2026
f5c485f
docs(wiki): fix three operator-harming overgeneralisations found in r…
Amantux Sep 11, 2026
bffd191
fix(hydration): log why the tape read failed instead of blaming the m…
Amantux Sep 11, 2026
5de810b
fix(assistant): close two proxy escapes and six review findings
Amantux Sep 11, 2026
665d2e4
test(assistant): cover the proxy escapes, and stop the source scan un…
Amantux Sep 11, 2026
7c041a5
fix(sharded): STRIPE overwrote same-named files; failed jobs recorded…
Amantux Sep 11, 2026
9d82533
fix(tape-ops): refuse a move destination that is not a data storage slot
Amantux Sep 11, 2026
0ed1a39
docs: real-data campaign runbook
Amantux Sep 11, 2026
831be6d
fix(assistant): go through InventoryService, satisfying SAFETY_003
Amantux Sep 11, 2026
441c11e
fix(sharded): confine the STRIPE tape path under /stripe
Amantux Sep 11, 2026
a7c8823
fix: close the format-token bypass this branch made reachable, + revi…
Amantux Sep 11, 2026
8b0ad48
Merge branch 'feat/operator-assistant' into integrate/campaign-wiki-a…
Amantux Sep 11, 2026
05087b0
Merge branch 'feat/real-data-campaign' into integrate/campaign-wiki-a…
Amantux Sep 11, 2026
cffc946
fix: sanitize jobs.error — raw exception text no longer reaches the u…
Amantux Sep 11, 2026
59b43a1
docs: reconcile wiki with campaign fixes (CLI backend selection, form…
Amantux Sep 11, 2026
d51cc88
test: reconcile job-error test with the sanitizer — typed errors carr…
Amantux Sep 11, 2026
5f3f0e0
fix: __main__ guard for python -m; exact-phrase + backtick-aware docs…
Amantux Sep 11, 2026
e373876
refactor(assistant): generalize the read-only proxy and seal what it …
Amantux Sep 11, 2026
e8fe03d
feat(assistant): a narrow, allowlisted write facade for tier-1 setup …
Amantux Sep 11, 2026
d408686
feat(assistant): gate tier-1 actions behind an in-chat confirmation
Amantux Sep 11, 2026
360facd
feat(cli): confirm tier-1 actions in the assist REPL
Amantux Sep 11, 2026
79522a9
test: cover the two-tier model, and mutation-check every new guard
Amantux Sep 11, 2026
f7496dc
docs(assistant): document the two tiers and a worked pool-setup trans…
Amantux Sep 11, 2026
3806aaf
fix(assistant): close the failure paths an adversarial review found
Amantux Sep 11, 2026
9bd5f1d
feat: add the tier-2 media facade and its graded-confirmation registry
Amantux Sep 11, 2026
5553855
feat: wire the media tier into the session, the prompt and the REPL
Amantux Sep 11, 2026
690e04d
test: cover the media tier and mutation-check every guard it adds
Amantux Sep 11, 2026
0c4b13d
docs: document the media tier and its live-rig worked example
Amantux Sep 11, 2026
53f1d5e
docs: show the format prompt refusing a bare "y" on the live rig
Amantux Sep 11, 2026
3b97590
docs: the assist registration comment no longer claims read-only
Amantux Sep 11, 2026
118458c
ci: gate the generated wiki reference pages on a staleness check
Amantux Sep 11, 2026
56bb2cd
ci: add the weekly mhvtl rehearsal canary
Amantux Sep 11, 2026
d52a63b
docs: correct the 'sudo apt install mhvtl' claim in the hardware suit…
Amantux Sep 11, 2026
cc1fddb
feat(library): model import/export (mailslot) elements in both backends
Amantux Sep 11, 2026
63e0534
feat(mailslot): import/export flows through the tape orchestrator
Amantux Sep 11, 2026
289e45a
feat(restore): bulk tree restore over the existing per-file services
Amantux Sep 11, 2026
b7a8cf3
feat(cli): restore tree/file, archive sharded, and mailslot commands
Amantux Sep 11, 2026
85404c6
test: move to a discovered free slot instead of hardcoded 1,1,11
Amantux Sep 11, 2026
24919a4
test: seed real on-tape bytes for the dataset verify test
Amantux Sep 11, 2026
f43f8f9
fix: close the three destructive paths the adversarial review broke
Amantux Sep 11, 2026
2b5cba6
feat(scalar-http): implement drive_device via operator-declared seria…
Amantux Sep 11, 2026
1a9320f
feat(api): add read-only POST /assist
Amantux Sep 11, 2026
5db80cb
feat(fuse): read-only FUSE mount over the catalog namespace
Amantux Sep 11, 2026
4f0e473
feat(hardware): TapeAlert parsing and `openblade hardware drive-health`
Amantux Sep 11, 2026
646354a
docs(wiki): fuse-and-nas describes the mount that now exists
Amantux Sep 11, 2026
5e6e4c6
fix(mailslot,restore): correctness and typing follow-ups
Amantux Sep 12, 2026
59465a3
fix: repair the two gates the new route and signature broke
Amantux Sep 12, 2026
2b024cb
feat(api): gate the native REST surface behind a bearer token
Amantux Sep 12, 2026
c623d8f
test: sweep every native route for the API-token gate
Amantux Sep 12, 2026
bb4df68
test(i3): carry the native API token through the compliance client
Amantux Sep 12, 2026
ced2899
docs(wiki): document native API authentication
Amantux Sep 12, 2026
b540c7e
fix: reserve room for the LTFS index when deciding a tape is full
Amantux Sep 12, 2026
9ec4ca7
fix: hydrate RealLTFSBackend tape capacities from the catalog at cons…
Amantux Sep 12, 2026
7478224
test: cover the mailslot flows, tree restore, and CLI/API sharded parity
Amantux Sep 12, 2026
e5d583d
chore: drop the stray bytecode change from the /assist commit
Amantux Sep 12, 2026
a12773c
docs(correlation): say what the disjoint-serials warning cannot rule out
Amantux Sep 12, 2026
3a13255
docs: rig addendum for the mailslot flows and bulk restore
Amantux Sep 12, 2026
8f738a4
fix(restore): refuse a catalog path that cannot map safely under --dest
Amantux Sep 12, 2026
efbb1f0
test: pin that a full library refuses to unload rather than eject to …
Amantux Sep 12, 2026
940d61d
refactor(api): collapse the auth-disabled check to one fail-open branch
Amantux Sep 12, 2026
0463867
fix(mailslot): close three ways the export guard could be walked past
Amantux Sep 12, 2026
4838af2
docs: bring the rig addendum up to the post-review behaviour
Amantux Sep 12, 2026
502a40f
fix: refuse an element-id number-space mismatch, and stop /assist sta…
Amantux Sep 12, 2026
36c3a41
fix(api): gate /aml/proxy, classify on the routed path, de-vacuum the…
Amantux Sep 12, 2026
bec02ea
fix(api): never classify on a client-controlled path (XFP bypass)
Amantux Sep 12, 2026
b7f499e
Merge branch 'fix/capacity-reserve-hydration' into integrate/eight-items
Amantux Sep 12, 2026
ccca10e
Merge branch 'feat/assistant-media-tier' into integrate/eight-items
Amantux Sep 12, 2026
7a4eda9
Merge branch 'feat/fuse-tapealert' into integrate/eight-items
Amantux Sep 12, 2026
ce33c3a
Merge branch 'feat/cli-restore-shard-mailslot' into integrate/eight-i…
Amantux Sep 12, 2026
5a57058
Merge branch 'feat/scalar-drive-device-and-assist-api' into integrate…
Amantux Sep 12, 2026
0edf2f4
Merge branch 'feat/api-auth' into integrate/eight-items
Amantux Sep 12, 2026
a6a08ff
Merge branch 'ci/wiki-and-mhvtl-jobs' into integrate/eight-items
Amantux Sep 12, 2026
c17558d
chore(lint): pin ruff exactly and document the rule-set decision
Amantux Sep 11, 2026
5aa2f2a
fix(lint): clear the 12 real ruff findings on the pinned toolchain
Amantux Sep 12, 2026
f6a5eba
test(i3): annotate the one deliberate lint exception (SIM222)
Amantux Sep 12, 2026
b768bf5
docs: retire the lint-backlog debt entry and pin the toolchain rule
Amantux Sep 12, 2026
44034ae
style: ruff format the integrated tree; regenerate wiki reference (fo…
Amantux Sep 12, 2026
07e328d
fix: sanitize AML move error details; make backend-lint blocking on t…
Amantux Sep 12, 2026
5290d3d
fix: mailslot reads route through InventoryService (SAFETY_003)
Amantux Sep 12, 2026
f80f1a7
fix: restore the cross-repo emulator image pin; pin typer/click exactly
Amantux Sep 13, 2026
2f14250
fix: deterministic CLI output — plain-JSON data channel, no auto-high…
Amantux Sep 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
44 changes: 38 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ jobs:
simulator: ${{ steps.filter.outputs.simulator }}
frontend: ${{ steps.filter.outputs.frontend }}
cicd: ${{ steps.filter.outputs.cicd }}
wiki: ${{ steps.filter.outputs.wiki }}
steps:
- uses: actions/checkout@v5
- uses: dorny/paths-filter@v3
Expand Down Expand Up @@ -66,17 +67,25 @@ jobs:
- 'frontend/**'
cicd:
- '.github/workflows/**'
# docs/wiki/reference/{cli,api}.md are GENERATED from the Typer CLI
# tree and the FastAPI route table. Anything that can move either
# surface — or the generator itself — has to re-run the staleness
# check, or the wiki silently starts describing a past release.
wiki:
- 'openblade/cli/**'
- 'openblade/api/**'
- 'tools/gen_wiki_reference.py'
- 'docs/wiki/reference/**'

backend-lint:
name: backend-lint
needs: changes
if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.api == 'true' || needs.changes.outputs.simulator == 'true' }}
runs-on: ubuntu-latest
# Advisory: the repo carries a large pre-existing ruff/format backlog (~180
# lint findings + ~160 files needing `ruff format`). This job still runs and
# reports, but does not fail CI (so trusted-PR auto-merge can proceed). Not a
# required check. Tracked for incremental cleanup; new code should still lint.
continue-on-error: true
# BLOCKING since the toolchain was pinned (ruff==0.15.22 via the dev extra)
# and the baseline cleared to zero findings / fully formatted. If this job
# goes red, the fix is `ruff check --fix` / `ruff format` with the PINNED
# version, never a version bump in the same change.
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
Expand Down Expand Up @@ -204,6 +213,24 @@ jobs:
- run: npm run build
- run: npm run test -- --run

wiki-reference:
name: wiki-reference
needs: changes
if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.wiki == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
- run: pip install -e '.[dev]'
# The generator imports the app and introspects it, so it needs the real
# dependency set — not just a markdown diff. `--check` writes nothing and
# exits 1 naming each stale page.
- name: Generated wiki reference matches the code
run: python3 tools/gen_wiki_reference.py --check

cicd-workflow-validate:
name: cicd-workflow-validate
needs: changes
Expand Down Expand Up @@ -233,7 +260,7 @@ jobs:
# branch-protection check (plus operability-gate). It understands a valid
# `skipped` result from path-filtered jobs and fails on any real failure or
# cancellation, so branch protection no longer has to reason about skips.
# backend-lint / backend-typecheck are advisory (reported, never blocking).
# backend-typecheck is advisory (reported, never blocking); backend-lint blocks.
ci-gate:
name: ci-gate
needs:
Expand All @@ -244,6 +271,7 @@ jobs:
- i3-smoke
- frontend-build-test
- cicd-workflow-validate
- wiki-reference
if: ${{ always() }}
runs-on: ubuntu-latest
steps:
Expand All @@ -261,6 +289,10 @@ jobs:
check i3-smoke "${{ needs.i3-smoke.result }}"
check frontend-build-test "${{ needs.frontend-build-test.result }}"
check cicd-workflow-validate "${{ needs.cicd-workflow-validate.result }}"
# Blocking on purpose: the fix is one command
# (`python3 tools/gen_wiki_reference.py`) and a stale generated page
# is indistinguishable from a correct one to a reader.
check wiki-reference "${{ needs.wiki-reference.result }}"
echo "advisory (non-blocking): backend-lint=${{ needs.backend-lint.result }} backend-typecheck=${{ needs.backend-typecheck.result }}"
if [ "$fail" -ne 0 ]; then
echo "::error::ci-gate: a required job failed or was cancelled"
Expand Down
27 changes: 15 additions & 12 deletions .github/workflows/emulator-change-gates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,9 @@ jobs:
- run: pip install -e '.[dev]'
- run: python3 tools/emulator_spec/validate_cross_repo_contract.py
- run: python3 tools/emulator_spec/generate_matrix_endpoint_catalog.py
- run: >
python -m pytest
tests/i3/test_14_emulator_profile.py
tests/i3/test_18_config_profiles.py
tests/i3/test_15_manual_matrix_contract.py
tests/i3/test_16_manual_matrix_generated_suites.py
tests/i3/test_17_matrix_endpoint_coverage.py
tests/integration/test_aml_emulator_latency*.py
tests/integration/test_aml_scope_lockdown.py
tests/integration/test_aml_library_spec_parity.py
tests/unit/test_emulator_client_config.py
-q --tb=short
# Boot BEFORE the suites: this ordering was wrong since the workflow was
# written, masked for months because the contract-validator step above
# failed first — the suites below dial 127.0.0.1:8000.
- run: |
rm -f /tmp/openblade-emulator-gates.db
OPENBLADE_BACKEND=mock OPENBLADE_DB_URL=sqlite:////tmp/openblade-emulator-gates.db \
Expand All @@ -96,4 +87,16 @@ jobs:
time.sleep(1)
raise SystemExit("API did not become healthy in time")
PY
- run: >
python -m pytest
tests/i3/test_14_emulator_profile.py
tests/i3/test_18_config_profiles.py
tests/i3/test_15_manual_matrix_contract.py
tests/i3/test_16_manual_matrix_generated_suites.py
tests/i3/test_17_matrix_endpoint_coverage.py
tests/integration/test_aml_emulator_latency*.py
tests/integration/test_aml_scope_lockdown.py
tests/integration/test_aml_library_spec_parity.py
tests/unit/test_emulator_client_config.py
-q --tb=short
- run: python -m pytest tests/i3/ -m i3 -q --tb=short
Loading
Loading