The opc-ua driver (Eclipse Milo + netty + jaxb universe) exhausts the
16GB hosted runner during the native-image analysis step even with
-J-Xmx10g; it builds fine on larger local machines. Its native image has
never shipped, so dropping it from the matrix removes nothing users
already have. It stays on the JVM line with dnp3/ble/opc-da until the
heap cap is property-driven or a larger runner hosts the job.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Batch 3 joins the native line: modbus-rtu, serial, mbus, dlt645, dlms
and zigbee - the jSerialComm serial family. jSerialComm ships no
native-image configuration of its own, so DriverNativeRuntimeHints
registers the embedded per-platform JNI libraries as resources and the
SerialPort JNI surface explicitly (string-based references keep
non-serial drivers unaffected). The tracing snapshots carry the early
boot surface only - serial paths open on device access and stay covered
by the explicit registrations. zigbee is best-effort: no radio hardware
locally, gRPC registration and scheduling are the acceptance line.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Batch 2 joins the native line: mysql, postgresql, sqlserver, oracle,
redis and kafka - database dialects and messaging clients, all pure
Java. DriverNativeRuntimeHints gains the four JDBC dialect driver
constructors (string-based TypeReferences; each class exists only on
its own driver's classpath and native-image ignores hints for absent
classes). Same generated shape as the previous batches: targets, matrix
entries, compose blocks and per-driver agent snapshots.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Batch 1b joins the native line: knx, bacnet-ip, melsec, plcs7, lorawan,
opc-ua, lwm2m and iec61850 - pure-Java protocol SDKs (calimero,
bacnet4j, iot-communication, milo, leshan, openiec61850). iec61850's
GOOSE raw-ethernet paths stay untested on native and are validated in
TCP mode only, as flagged in the CI matrix comment. Same shape as batch
1a: native targets, matrix entries, compose overlay blocks behind the
native-drivers profile, and per-driver agent snapshots.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Batch 1a joins the native line: tcp-udp, listening-virtual, can,
ethernet-ip, fins, http, snmp, iec104 and coap - pure-Java protocol
stacks with no JNI dependencies. Native targets mirror the jar line's
directory layout (listening-virtual keeps its TCP/UDP EXPOSEs), the CI
matrix gains the nine entries, and the compose overlay defines the nine
services behind the native-drivers profile with keys matching
docker-compose.yml so overlay semantics hold (the pilot keys are renamed
to the short main-compose form for the same reason).
Each driver carries a tracing-agent snapshot per the dual-track policy:
RuntimeHints covers the shared SDK surface, snapshots carry the
logback/logstash parsing depth and per-protocol reflective access.
Co-Authored-By: Claude Code <noreply@anthropic.com>
A serial driver loop cannot fit the 360-minute GitHub job cap once the
later batches join. Add a build-native-drivers matrix job (one driver
per job, fail-fast off, max-parallel five, its own gha cache scope) that
pins the NATIVE_SERVICE build arg to the matrix service, and gate the
release job on it.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The mockito jar sha1 pin still targeted the pre-upgrade artifact while
the build resolves 5.24.0, so every CI run failed the agent-integrity
check even after refetching. Re-pin to the 5.24.0 jar sha1 verified
against Maven Central metadata.
Document the InsightApi.Invoke RPC in the dc3-api-data README so the
proto-to-documentation guard passes.
Co-Authored-By: Claude Code <noreply@anthropic.com>
adopts the remaining uncommitted work from the parallel session:
five new guardian test files (client-errors, device-import-template,
entity-id-guard, jwt-guard, option-hygiene) that lock in the error
taxonomy, id encoding, and cli option hygiene; an attachment file
cleaner in the agentic service; attachment controller and service
tests; a salt-type fix in the auth store; ci workflow typecheck step;
and the cli test report. 818 tests total across 37 files.
Co-Authored-By: Claude Code <noreply@anthropic.com>
adds the provider model and attachment command groups to the readme
with usage examples for every subcommand, documents device
import-template and alert point-profile, corrects the point history
option name from --count to --limit, fixes the mcp example key from
transport to type, adds config profile create/delete to the multi-
profile section, and aligns the test suite with the updated command
surface. also updates ci to run typecheck alongside tests.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The e2e job now runs with empty MVN_SETTINGS so make test-e2e resolves artifacts from public repositories instead of silently inheriting the local Aliyun mirror, and the mockito agent integrity steps extract the version from the pom with help:evaluate (pinned to the official 5.23.0 sha1) so the guard follows the build instead of drifting from it.
The release job concatenated the whole dc3/doc/CHANGE.md (236KB) into
the release_notes output; passing it as the action's body input needs
an INPUT_BODY env var beyond the 128KB MAX_ARG_STRLEN limit, so the
runner died with "Argument list too long" while spawning node for the
action — the last failure before the first successful release. Extract
just the current version's block (as the backfill tool does): 17KB.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The first gateway compile took ~20 min on the 4-core hosted runner —
six services with sequential pushes come to ~140 min, past the
120-minute limit. The run would die to the job timeout, not to a
build failure.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The first-ever published build-backend run pushed fine to Docker Hub
but Aliyun ACR rejected the image index: "denied: unknown manifest
class for application/vnd.oci.empty.v1+json" — buildx attaches SLSA
provenance attestations by default and ACR cannot accept them. This
workflow never reached the push step before (startup_failure since
a58064cc5), so the dc3-docker fix (provenance: false) was never
mirrored here. Disable provenance on the backend loop, the native
loop and the web build.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Three consecutive fresh-cache runs failed the same way: the mockito
javaagent jar under ~/.m2 is corrupt ("Error opening zip file") and the
surefire/failsafe forks die during VM init. The artifact on Central is
intact (sha1 verified from three networks), so the corruption happens
in transit on hosted runners.
Two mitigations: -T 1 overrides the .mvn/maven.config parallel build
for CI test runs (the resolver part-file race under -T 1C is the prime
suspect), and a pre-step verifies the jar's sha1 and refetches it via
curl when corrupt before the forks ever load it.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Every Docker Images run since a58064cc5 failed as startup_failure before
any job started: the workflow-level permissions grant (contents: read)
is below what the reusable test.yml declares (contents + pull-requests),
and GitHub refuses to start a caller that under-grants its callees. Add
pull-requests: read to the workflow-level grant — job-level grants
(actions: write on build jobs, contents: write on the release job) stay
as they are.
Isolated by bisection on a probe branch: reusable call + permissions
reproduces startup_failure in 0s; either alone succeeds.
Co-Authored-By: Claude Code <noreply@anthropic.com>
tag.sh and the docker-ci validate step extract the release identity
with an awk range over the <parent> block, but the root pom carries
its own coordinates without a <parent> — both read an empty version
and refused to run. That is why every release since a58064cc5 was
backfilled through the API and never exercised this pipeline. Fall
back to the first <version> element (the project's own coordinates),
matching how changelog.py resolves the version.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Add a build-native job to the v* release pipeline: the six native
services (dc3-center/* + dc3-gateway) build via the native-builder
Dockerfile stage and publish alongside the jar images with the
-native tag suffix (latest-native / series-native / version-native)
to Docker Hub and Aliyun, same image names as the jar variants.
amd64 only for now — native-image under QEMU needs ~13GB RSS and
OOMs the 16GB hosted runners; arm64 native images wait for native
arm64 runners. The release job now gates on build-native so a broken
native pipeline is loud instead of silently shipping jar-only.
Co-Authored-By: Claude Code <noreply@anthropic.com>
Adopt the dc3.site canonical slogan across every surface: the platform
is an open-source Industrial IoT Runtime for Physical AI. Hero taglines
and tech-tag strips in all seven language banners regenerate from the
new copy (MCP tool gateway / safe / controllable / traceable replace
the edge-cloud and SENSE-DECIDE-ACT strips); READMEs follow — badge
line gains the live demo and industry-demo links, the AI section
rewrites around the MCP tool gateway loop (OAuth client registration,
per-tool authorization, audit trail), and the intro names the core
decoupling: drivers push normalized point data to the bus, applications
consume through one unified API. AGENTS.md carries the same one-paragraph
positioning for AI assistants.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The forced re-download proved the javaagent failure is not a corrupted
cache: freshly downloaded jars fail identically, so the diagnostic step
served its purpose and the investigation moves to an issue.
The e2e suite runs the verify lifecycle too, so its shallow checkout
also needs the origin/main baseline for spotless ratchetFrom. Unit,
integration and coverage jobs additionally restore a maven cache that
contains a truncated mockito jar from an earlier failed run; the
restore-key fallback keeps resurrecting it and -U never re-downloads a
file that already exists, so drop implausibly small jars before the
build.
The mixed 'initialize spotless:check' direct-goal invocation resolves
inter-module jars from remote repositories instead of the reactor and
fails within seconds on a clean cache — Backend CI on main has been red
since early September because of it. Both checks already bind to the
verify phase, so a plain skipped-tests verify run executes them with
normal reactor resolution (verified against an empty local repository).
ratchetFrom origin/main (38204bf7d) needs an origin/main ref that the
default depth-1 PR checkout does not provide, so compile, Unit tests
and Integration tests all failed within seconds on the first PR since.
Fetch the main tip right after checkout in every affected job; the
ratchet only diffs the working tree against that one commit.
develop is no longer the integration target (main is the only active
line). Route all four ecosystems to main so updates are proposed against
the active branch; the develop branch is kept as an archive.
Co-Authored-By: Claude Code <noreply@anthropic.com>
The config file only carried two paths-ignore entries, which the init action accepts directly as inputs; folding them into codeql.yml removes the separate .github/codeql directory without behavior change.
- dc3-common-auth imports com.baomidou.mybatisplus.spring.service
directly since the 3.5.17 split but never declared the artifact;
out-of-reactor consumers hit FileNotFoundException at boot. Manage
it in the root BOM alongside the existing entry.
- ci-cli.yml gates dc3-cli (lint, test, build, help smoke) on PRs
touching dc3-cli/**
- adapt AuthenticGatewayFilterTest to the extended constructor
- translate the banner template documentation and protocol-mesh comments in the eight localized banners, the template, and the social preview
- keep the localized tagline copy inside the comment blocks (it documents the LANGS table values)
- verified: all nine svg files parse as xml and the template placeholders remain intact
The first deploy after enabling the demo.dc3.site custom domain landed in
deployment_queued and was cancelled by the Pages backend. Bump error_count
(10→20) and timeout (10m→15m) so transient queue stalls can ride through
instead of aborting.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat(web): complete static mock demo for GitHub Pages
- register core/dashboard/dictionary handlers + seed data (driver/device/
profile/point, dictionaries, dashboard stats/topology/alerts)
- fix router-guard timing: pre-seed auth at main.ts top level before router
install, since the initial navigation runs as a microtask ahead of the
async mock-chunk import
- hide agentic assistant in mock mode (its chat streams over raw fetch and
bypasses the axios adapter)
- assetUrl helper for subpath-safe public assets
- GitHub Pages deploy workflow + public/CNAME (demo.dc3.site)
- unit tests covering the mock adapter
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* fix(web): commit mock core handler skipped by core.* gitignore
The repo-root `core.*` rule (meant for JVM crash dumps) silently skipped
dc3-web/src/mock/handlers/core.ts during `git add`, so the PR build failed
type-check with "Cannot find module './handlers/core'". Force-add the file
and add a negation exception so it can't be dropped again.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* test(web): drop `as never` cast in mock-adapter test
The AI guardrail forbids double-assertion / never-cast type laundering.
Use the real AxiosRequestConfig type and a single boundary cast to R
(the interceptor unwraps the envelope) instead of `request(config as never)`.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* chore(docs): move docs site to standalone pnoker/iot-dc3-docs repo
The VitePress docs site now lives in pnoker/iot-dc3-docs and serves docs.dc3.site from there. Remove the in-repo docs/ and all docs-only build/deploy wiring so nothing dangles.
- delete docs/ (source moved to pnoker/iot-dc3-docs)
- delete .github/workflows/docs.yml (deploy owned by iot-dc3-docs)
- drop npm /docs dependabot block; clean codeql/.gitignore docs paths
- remove Makefile docs-* targets
- relocate AI testing policy into dc3-web/tests/ so the required Web guardrail test is self-contained (was reading ../docs/...)
- rewire README image refs (7 READMEs) and in-repo doc links (README.ai.md, AGENTS.md, dc3/doc/README.md) to https://docs.dc3.site / the new repo
dc3/doc/{TITLE,CHANGE,USAGE}.md STAY - release tooling (make changelog, docker-ci) regenerates them; the docs repo snapshots them.
* fix(docs): repair pre-existing broken doc links found during migration
- 8 READMEs: /en|zh/introduction/technology-stack -> /en|zh/development/technology-stack (page lives under development/, not introduction/)
- dc3-web/tests/README.md: ../docs/test-debugging.md (missing) -> https://docs.dc3.site/en/frontend/test-debugging
pnpm/action-setup was pinned to a commit running on the deprecated Node.js 20 runtime (GitHub forces Node 24 and emits a warning). Bump to v6.0.10 (0977fd9) which runs natively on Node 24, removing the deprecation warning. Updates docs.yml (1) + ci-web.yml (2).
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
ci-backend.yml ignored dc3-web paths on pull_request, so npm-only
dependabot PRs never triggered backend CI — but compile/Unit/Integration/
coverage are required status checks, leaving those PRs perpetually
BLOCKED (had to --admin merge). Drop the pull_request paths-ignore so
every PR runs backend CI; keep it on push (a dc3-web-only push still
skips backend CI, which is fine — the PR already ran it).
dependabot.yml had no target-branch, so updates targeted the default
branch (main). main is the release branch and was red — compiler fixes
lived only on develop — which left every open dependabot PR BLOCKED.
Set target-branch: develop on all five ecosystems so upgrades land on
the integration branch first, get validated, then promote to main.