| English | 中文版 |
Version: 1.4 Date: 2026-05-11
Error code format: {PROTOCOL}-{CATEGORY}-{DETAIL}
NPS uses a two-level error system:
| Error Code | NPS Status Code | Description |
|---|---|---|
NCP-ANCHOR-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
Schema referenced by anchor_ref does not exist; agent must re-fetch the AnchorFrame |
NCP-ANCHOR-SCHEMA-INVALID |
NPS-CLIENT-BAD-FRAME |
Schema in AnchorFrame is malformed |
NCP-ANCHOR-ID-MISMATCH |
NPS-CLIENT-CONFLICT |
Different Schemas received for the same anchor_id (anchor-pollution defense) |
NCP-FRAME-UNKNOWN-TYPE |
NPS-CLIENT-BAD-FRAME |
Unknown frame type code |
NCP-FRAME-PAYLOAD-TOO-LARGE |
NPS-LIMIT-PAYLOAD |
Payload exceeds the negotiated max_frame_payload |
NCP-FRAME-FLAGS-INVALID |
NPS-CLIENT-BAD-FRAME |
Reserved bits in the flags field are non-zero |
NCP-STREAM-SEQ-GAP |
NPS-STREAM-SEQ-GAP |
StreamFrame sequence numbers are not contiguous |
NCP-STREAM-NOT-FOUND |
NPS-STREAM-NOT-FOUND |
The stream referenced by stream_id does not exist |
NCP-STREAM-LIMIT-EXCEEDED |
NPS-STREAM-LIMIT |
Maximum concurrent streams per connection exceeded |
NCP-ENCODING-UNSUPPORTED |
NPS-SERVER-ENCODING-UNSUPPORTED |
The requested encoding tier is not supported |
NCP-ANCHOR-STALE |
NPS-CLIENT-CONFLICT |
anchor_ref exists but the schema has been updated; the response carries the latest AnchorFrame via CapsFrame.inline_anchor |
NCP-DIFF-FORMAT-UNSUPPORTED |
NPS-CLIENT-BAD-FRAME |
DiffFrame uses a patch_format the receiver does not support (e.g., binary_bitset) |
NCP-VERSION-INCOMPATIBLE |
NPS-PROTO-VERSION-INCOMPATIBLE |
Client min_version is higher than the server’s maximum supported version (handshake failure) |
NCP-STREAM-WINDOW-OVERFLOW |
NPS-STREAM-LIMIT |
Sender continues to emit StreamFrames after the application-layer flow-control window is exhausted |
NCP-ENC-NOT-NEGOTIATED |
NPS-CLIENT-BAD-FRAME |
Received an ENC=1 frame but no E2E encryption algorithm was negotiated for the session (not declared in HelloFrame) |
NCP-ENC-AUTH-FAILED |
NPS-CLIENT-BAD-FRAME |
E2E encryption auth-tag verification failed; the frame may have been tampered with |
NCP-PREAMBLE-INVALID |
NPS-PROTO-PREAMBLE-INVALID |
Native-mode connection opened with bytes other than the constant preamble b"NPS/1.0\n"; server closes the connection silently without emitting an ErrorFrame (NPS-RFC-0001) |
| Error Code | NPS Status Code | Description |
|---|---|---|
NWP-AUTH-NID-SCOPE-VIOLATION |
NPS-AUTH-FORBIDDEN |
Agent scope does not cover the target node path |
NWP-AUTH-NID-EXPIRED |
NPS-AUTH-UNAUTHENTICATED |
NID certificate has expired |
NWP-AUTH-NID-REVOKED |
NPS-AUTH-UNAUTHENTICATED |
NID has been revoked |
NWP-AUTH-NID-UNTRUSTED-ISSUER |
NPS-AUTH-UNAUTHENTICATED |
NID issuer is not in trusted_issuers |
NWP-AUTH-NID-CAPABILITY-MISSING |
NPS-AUTH-FORBIDDEN |
Agent is missing a capability required by the node (e.g., nwp:query) |
NWP-AUTH-ASSURANCE-TOO-LOW |
NPS-AUTH-FORBIDDEN |
Agent’s assurance level is below the node’s min_assurance_level (NPS-2 §4.1) or per-action override (§4.6); response SHOULD include a hint pointing to a CA enrolment URL (NPS-RFC-0003) |
NWP-AUTH-REPUTATION-BLOCKED |
NPS-AUTH-FORBIDDEN |
Deprecated (RFC-0005): use NWP-REPUTATION-REJECTED / NWP-REPUTATION-BANNED instead. Retained as alias for one alpha cycle. |
NWP-REPUTATION-THROTTLED |
NPS-CLIENT-RATE-LIMITED |
Request rate-limited by reputation policy (throttle_on rule matched). Response includes Retry-After: 60 header (NPS-RFC-0005) |
NWP-REPUTATION-REJECTED |
NPS-AUTH-FORBIDDEN |
Request rejected by reputation policy (reject_on rule matched). Response body includes matched_incident + matched_severity (NPS-RFC-0005) |
NWP-REPUTATION-BANNED |
NPS-AUTH-FORBIDDEN |
Request rejected and NID temporarily banned (ban_on rule matched or active ban cache entry). Response SHOULD include X-NWP-Ban-Expires Unix timestamp (NPS-RFC-0005) |
NWP-QUERY-FILTER-INVALID |
NPS-CLIENT-BAD-PARAM |
Filter syntax is invalid or nests deeper than 8 levels |
NWP-QUERY-FIELD-UNKNOWN |
NPS-CLIENT-BAD-PARAM |
fields references an unknown field |
NWP-QUERY-CURSOR-INVALID |
NPS-CLIENT-BAD-PARAM |
Cursor cannot be decoded or has expired |
NWP-QUERY-REGEX-UNSAFE |
NPS-CLIENT-BAD-PARAM |
$regex pattern rejected (ReDoS risk, excessive length, or nested quantifiers) |
NWP-QUERY-VECTOR-UNSUPPORTED |
NPS-SERVER-UNSUPPORTED |
Node does not support vector search |
NWP-QUERY-AGGREGATE-UNSUPPORTED |
NPS-SERVER-UNSUPPORTED |
Node does not support aggregate queries (capabilities.aggregate=false) |
NWP-QUERY-AGGREGATE-INVALID |
NPS-CLIENT-BAD-PARAM |
Aggregate structure is invalid (unknown func, duplicate alias, missing required fields, etc.) |
NWP-QUERY-STREAM-UNSUPPORTED |
NPS-SERVER-UNSUPPORTED |
Node does not support streaming queries (capabilities.stream_query=false) |
NWP-ACTION-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
action_id is not registered on the node |
NWP-ACTION-PARAMS-INVALID |
NPS-CLIENT-UNPROCESSABLE |
Action params fail schema validation |
NWP-ACTION-IDEMPOTENCY-CONFLICT |
NPS-CLIENT-CONFLICT |
A request with the same idempotency_key is already in progress |
NWP-TASK-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
Asynchronous task referenced by task_id does not exist |
NWP-TASK-ALREADY-CANCELLED |
NPS-CLIENT-CONFLICT |
Task has been cancelled; further operations are not permitted |
NWP-TASK-ALREADY-COMPLETED |
NPS-CLIENT-CONFLICT |
Task has completed and cannot be cancelled |
NWP-TASK-ALREADY-FAILED |
NPS-CLIENT-CONFLICT |
Task has failed and cannot be cancelled |
NWP-SUBSCRIBE-STREAM-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
stream_id referenced by unsubscribe does not exist |
NWP-SUBSCRIBE-LIMIT-EXCEEDED |
NPS-LIMIT-EXCEEDED |
Exceeded the node’s maximum concurrent subscriptions |
NWP-SUBSCRIBE-FILTER-UNSUPPORTED |
NPS-SERVER-UNSUPPORTED |
Node does not support subscriptions with a filter |
NWP-SUBSCRIBE-INTERRUPTED |
NPS-SERVER-UNAVAILABLE |
Subscription stream terminated because the underlying data source was interrupted |
NWP-SUBSCRIBE-SEQ-TOO-OLD |
NPS-CLIENT-CONFLICT |
resume_from_seq is outside the node’s buffer window (recommended: 10 min or 10,000 records); agent must re-query from scratch before re-subscribing |
NWP-BUDGET-EXCEEDED |
NPS-LIMIT-BUDGET |
Response would exceed the X-NWP-Budget limit |
NWP-CGN-LIMIT-EXCEEDED |
NPS-CLIENT-REQUEST-TOO-LARGE |
Response would exceed the effective CGN budget (min(cgn_limit, X-NWP-Budget)); trimming was not possible. Response body SHOULD include effective_budget and estimated_cgn. (token-budget.md §7.4) |
NWP-DEPTH-EXCEEDED |
NPS-CLIENT-BAD-PARAM |
X-NWP-Depth exceeds the node’s permitted max_depth |
NWP-GRAPH-CYCLE |
NPS-CLIENT-UNPROCESSABLE |
Node graph contains a cyclic reference |
NWP-NODE-UNAVAILABLE |
NPS-SERVER-UNAVAILABLE |
Underlying data source is temporarily unavailable |
NWP-MANIFEST-VERSION-UNSUPPORTED |
NPS-CLIENT-BAD-PARAM |
Agent’s NPS version is lower than the node’s min_agent_version |
NWP-MANIFEST-NODE-TYPE-REMOVED |
NPS-CLIENT-BAD-FRAME |
NWM node_type contains the removed legacy value "gateway" (NPS-CR-0001); use "anchor" or "bridge". Response SHOULD include a hint pointing to NPS-CR-0001. |
NWP-MANIFEST-NODE-TYPE-UNKNOWN |
NPS-CLIENT-BAD-FRAME |
NWM node_type contains an unrecognized value (not a known-removed legacy value — use NWP-MANIFEST-NODE-TYPE-REMOVED for that case). |
NWP-RATE-LIMIT-EXCEEDED |
NPS-LIMIT-RATE |
Rate limit exceeded; reset timestamp is in the X-NWP-Rate-Reset header |
NWP-RESERVED-TYPE-UNSUPPORTED |
NPS-SERVER-UNSUPPORTED |
QueryFrame or SubscribeFrame type field contains an unrecognized reserved-type identifier; this node does not implement the requested reserved operation (NWP §12). Distinct from NWP-ACTION-NOT-FOUND — use this code when the type field is the unknown operand, not action_id. |
NWP-TOPOLOGY-UNAUTHORIZED |
NPS-AUTH-FORBIDDEN |
Caller lacks permission to read this Anchor’s topology (NPS-2 §12); authorization policy is implementation-defined per §12.4 (NPS-CR-0002) |
NWP-TOPOLOGY-UNSUPPORTED-SCOPE |
NPS-CLIENT-BAD-PARAM |
topology.scope value is not implemented by this Anchor Node (NPS-CR-0002) |
NWP-TOPOLOGY-DEPTH-UNSUPPORTED |
NPS-CLIENT-BAD-PARAM |
Requested topology.depth exceeds this Anchor Node’s configured maximum (NPS-CR-0002) |
NWP-TOPOLOGY-FILTER-UNSUPPORTED |
NPS-CLIENT-BAD-PARAM |
topology.filter contains an unrecognized key or unsupported operator (NPS-CR-0002) |
| Error Code | NPS Status Code | Description |
|---|---|---|
NIP-CERT-EXPIRED |
NPS-AUTH-UNAUTHENTICATED |
Certificate has expired (expires_at < now) |
NIP-CERT-REVOKED |
NPS-AUTH-UNAUTHENTICATED |
Certificate has been revoked (found in CRL or OCSP) |
NIP-CERT-SIGNATURE-INVALID |
NPS-AUTH-UNAUTHENTICATED |
Certificate signature verification failed |
NIP-CERT-UNTRUSTED-ISSUER |
NPS-AUTH-UNAUTHENTICATED |
Issuer is not in trusted_issuers |
NIP-CERT-CAPABILITY-MISSING |
NPS-AUTH-FORBIDDEN |
Certificate is missing a capability required by the node |
NIP-CERT-SCOPE-VIOLATION |
NPS-AUTH-FORBIDDEN |
Certificate scope does not cover the target path or operation |
NIP-CA-NID-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
NID does not exist in the CA database |
NIP-CA-NID-ALREADY-EXISTS |
NPS-CLIENT-CONFLICT |
NID already exists (duplicate registration) |
NIP-CA-SERIAL-DUPLICATE |
NPS-CLIENT-CONFLICT |
Certificate serial number already in use |
NIP-CA-RENEWAL-TOO-EARLY |
NPS-CLIENT-BAD-PARAM |
More than 7 days until expiry; renewal window not yet open |
NIP-CA-SCOPE-EXPANSION-DENIED |
NPS-AUTH-FORBIDDEN |
Requested scope exceeds the parent scope (delegation-chain violation) |
NIP-OCSP-UNAVAILABLE |
NPS-SERVER-UNAVAILABLE |
OCSP service temporarily unavailable |
NIP-TRUST-FRAME-INVALID |
NPS-CLIENT-BAD-FRAME |
TrustFrame signature or format is invalid — see NPS-3 §5.2 |
NIP-TRUST-FRAME-EXPIRED |
NPS-AUTH-UNAUTHENTICATED |
TrustFrame expires_at is in the past — see NPS-3 §5.2 |
NIP-TRUST-FRAME-GRANTOR-REVOKED |
NPS-AUTH-UNAUTHENTICATED |
TrustFrame grantor_nid’s own CA certificate is revoked or expired — see NPS-3 §5.2 |
NIP-TRUST-FRAME-SCOPE-EXCEEDS-GRANTOR |
NPS-AUTH-FORBIDDEN |
TrustFrame trust_scope contains a capability that the grantor itself does not hold (no-scope-expansion principle) — see NPS-3 §5.2 |
NIP-TRUST-FRAME-NODES-PATTERN-INVALID |
NPS-CLIENT-BAD-FRAME |
TrustFrame nodes entry is not a valid nwp:// URL pattern (e.g. malformed wildcard) — see NPS-3 §5.2 |
NIP-REVOKE-FRAME-INVALID |
NPS-CLIENT-BAD-FRAME |
RevokeFrame is malformed (missing required field, signature verification fails, or canonical form is invalid) — see NPS-3 §5.3 |
NIP-REVOKE-FRAME-UNAUTHORIZED-ISSUER |
NPS-AUTH-FORBIDDEN |
RevokeFrame signer_nid is not authorised to revoke target_nid — see NPS-3 §5.3 |
NIP-REVOKE-FRAME-SERIAL-MISMATCH |
NPS-CLIENT-BAD-PARAM |
RevokeFrame serial is present but does not match any currently-issued cert for target_nid — see NPS-3 §5.3 |
NIP-REVOKE-FRAME-REASON-UNKNOWN |
NPS-CLIENT-BAD-FRAME |
RevokeFrame reason carries a value outside the defined enum; receivers treat it as key_compromise (most restrictive) — see NPS-3 §5.3 |
NIP-ASSURANCE-MISMATCH |
NPS-CLIENT-BAD-FRAME |
IdentFrame.assurance_level does not match the cert extension id-nid-assurance-level (downgrade-attack defence) — see NPS-3 §5.1.1 (NPS-RFC-0003) |
NIP-ASSURANCE-UNKNOWN |
NPS-CLIENT-BAD-FRAME |
assurance_level carries a value outside the defined enum (anonymous / attested / verified) — see NPS-3 §5.1.1 (NPS-RFC-0003) |
NIP-REPUTATION-ENTRY-INVALID |
NPS-CLIENT-BAD-FRAME |
Reputation log entry signature fails verification or canonical (RFC 8785 JCS) form is malformed — see NPS-3 §5.1.2 (NPS-RFC-0004) |
NIP-REPUTATION-LOG-UNREACHABLE |
NPS-DOWNSTREAM-UNAVAILABLE |
A log operator referenced by a Node’s reputation_policy cannot be reached during admission evaluation — see NPS-3 §5.1.2 (NPS-RFC-0004) |
NIP-REPUTATION-GOSSIP-FORK |
NPS-SERVER-INTERNAL |
Cross-peer STH consistency check failed; possible Merkle tree fork detected — see NPS-RFC-0004 §4.5 |
NIP-REPUTATION-GOSSIP-SIG-INVALID |
NPS-CLIENT-BAD-FRAME |
Peer STH signature verification failed during gossip exchange — see NPS-RFC-0004 §4.5 |
NIP-CERT-FORMAT-INVALID |
NPS-CLIENT-BAD-FRAME |
IdentFrame.cert_chain is not DER-encoded X.509 or fails ASN.1 parsing — see NPS-RFC-0002 §4.3 |
NIP-CERT-EKU-MISSING |
NPS-CLIENT-BAD-FRAME |
Required NPS EKU (agent-identity or node-identity) absent or non-critical on the leaf cert — see NPS-RFC-0002 §4.1 / §4.3 |
NIP-CERT-SUBJECT-NID-MISMATCH |
NPS-CLIENT-BAD-FRAME |
X.509 leaf cert subject CN / SAN URI does not match the IdentFrame.nid field — see NPS-RFC-0002 §4.3 |
NIP-ACME-CHALLENGE-FAILED |
NPS-CLIENT-BAD-FRAME |
ACME agent-01 challenge validation failed (token mismatch, signature verification failure, or replay) — see NPS-RFC-0002 §4.4 |
NIP-CA-GROUP-REVOKED |
NPS-AUTH-FORBIDDEN |
Cannot issue a session under a group NID that has been revoked — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CA-PARENT-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
The parent_nid / group NID referenced by a session-issue request does not exist — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CA-PARENT-NOT-GROUP |
NPS-CLIENT-BAD-PARAM |
The referenced parent NID exists but is not registered as lineage.role = "group" — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CA-SESSION-VALIDITY-INVALID |
NPS-CLIENT-BAD-PARAM |
Requested session validity below 60 seconds or above the CA’s configured maximum — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CA-JWS-INVALID |
NPS-AUTH-UNAUTHENTICATED |
Group-JWS authorisation on a session-issue request fails signature, header, or shape validation — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CA-JWS-EXPIRED |
NPS-AUTH-UNAUTHENTICATED |
Group-JWS iat outside the CA’s clock-skew window (default ±5 minutes) — see NPS-3 §5.1.3 (NPS-CR-0003) |
NIP-CERT-PARENT-REVOKED |
NPS-AUTH-UNAUTHENTICATED |
A session NID’s parent / group NID is revoked or expired (chain check, NPS-3 §7 step 3a) — see NPS-3 §5.1.3 (NPS-CR-0003) |
| Error Code | NPS Status Code | Description |
|---|---|---|
NDP-RESOLVE-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
nwp:// address cannot be resolved to a physical endpoint |
NDP-RESOLVE-AMBIGUOUS |
NPS-CLIENT-CONFLICT |
Resolution result is conflicting (multiple inconsistent registrations) |
NDP-RESOLVE-TIMEOUT |
NPS-SERVER-TIMEOUT |
Resolution request timed out |
NDP-ANNOUNCE-SIGNATURE-INVALID |
NPS-AUTH-UNAUTHENTICATED |
AnnounceFrame signature verification failed |
NDP-ANNOUNCE-NID-MISMATCH |
NPS-CLIENT-BAD-FRAME |
NID in AnnounceFrame does not match the signing certificate |
NDP-ANNOUNCE-ROLE-REMOVED |
NPS-CLIENT-BAD-FRAME |
AnnounceFrame node_roles contains the removed legacy value "gateway" (NPS-CR-0001); use "anchor" or "bridge". Response SHOULD include a hint pointing to NPS-CR-0001. |
NDP-ANNOUNCE-ROLE-UNKNOWN |
NPS-CLIENT-BAD-FRAME |
AnnounceFrame node_roles contains an unrecognized value (not a known-removed legacy value — use NDP-ANNOUNCE-ROLE-REMOVED for that case). |
NDP-ANNOUNCE-CONFLICT |
NPS-CLIENT-CONFLICT |
Two AnnounceFrames share the same nid and graph_seq but differ in covered content (registry-poisoning attempt; see NPS-4 §7.4) |
NDP-GRAPH-SEQ-ROLLBACK |
NPS-CLIENT-BAD-FRAME |
AnnounceFrame graph_seq is less than or equal to the highest value previously accepted for that NID (rollback attempt; see NPS-4 §7.5) |
NDP-GRAPH-SEQ-GAP |
NPS-STREAM-SEQ-GAP |
GraphFrame sequence numbers are not contiguous |
NDP-ISSUER-NOT-ALLOWED |
NPS-AUTH-FORBIDDEN |
AnnounceFrame issuer (signing CA) is not in the active registry profile’s issuer allowlist (see NPS-4 §7.3) |
NDP-CA-ATTEST-REQUIRED |
NPS-AUTH-UNAUTHENTICATED |
Active registry profile requires a CA-attested NID and the AnnounceFrame’s certificate chain does not anchor in the configured trust roots (see NPS-4 §7.3) |
NDP-REGISTRY-UNAVAILABLE |
NPS-SERVER-UNAVAILABLE |
NDP Registry temporarily unavailable |
| Error Code | NPS Status Code | Description |
|---|---|---|
NOP-TASK-NOT-FOUND |
NPS-CLIENT-NOT-FOUND |
task_id does not exist |
NOP-TASK-TIMEOUT |
NPS-SERVER-TIMEOUT |
Overall task execution timed out |
NOP-TASK-DAG-INVALID |
NPS-CLIENT-BAD-FRAME |
DAG structure is invalid (missing entry/exit node, field error, etc.) |
NOP-TASK-DAG-CYCLE |
NPS-CLIENT-BAD-FRAME |
DAG contains a cycle |
NOP-TASK-DAG-TOO-LARGE |
NPS-CLIENT-BAD-FRAME |
DAG node count exceeds the limit (default 32) |
NOP-TASK-ALREADY-COMPLETED |
NPS-CLIENT-CONFLICT |
Task has completed; cannot be resubmitted |
NOP-TASK-CANCELLED |
NPS-CLIENT-CONFLICT |
Task has been cancelled |
NOP-DELEGATE-SCOPE-VIOLATION |
NPS-AUTH-FORBIDDEN |
delegated_scope exceeds the parent agent’s scope |
NOP-DELEGATE-REJECTED |
NPS-CLIENT-UNPROCESSABLE |
Target agent declined the delegation (insufficient capability or overload); response includes retry_after_ms |
NOP-DELEGATE-CHAIN-TOO-DEEP |
NPS-CLIENT-BAD-PARAM |
Delegation chain depth exceeds the limit (default 3 levels) |
NOP-DELEGATE-TIMEOUT |
NPS-SERVER-TIMEOUT |
Subtask did not complete before deadline_at |
NOP-SYNC-TIMEOUT |
NPS-SERVER-TIMEOUT |
SyncFrame timed out waiting for dependent tasks |
NOP-SYNC-DEPENDENCY-FAILED |
NPS-CLIENT-UNPROCESSABLE |
Dependency subtask has failed (and failure count exceeds the K-of-N tolerance) |
NOP-STREAM-SEQ-GAP |
NPS-STREAM-SEQ-GAP |
AlignStream sequence numbers are not contiguous |
NOP-STREAM-NID-MISMATCH |
NPS-AUTH-UNAUTHENTICATED |
AlignStream sender_nid does not match the connection identity |
NOP-RESOURCE-INSUFFICIENT |
NPS-SERVER-UNAVAILABLE |
Preflight found one or more Worker Agents lack sufficient resources (CGN or capabilities) |
NOP-CONDITION-EVAL-ERROR |
NPS-CLIENT-BAD-PARAM |
DAG node condition expression failed to evaluate (syntax error or missing referenced field) |
NOP-INPUT-MAPPING-ERROR |
NPS-CLIENT-UNPROCESSABLE |
input_mapping JSONPath could not be resolved or target field is missing |
NOP-COMPENSATION-FAILED |
NPS-CLIENT-UNPROCESSABLE |
Terminal — node compensate_action returned an error during saga rollback |
NOP-COMPENSATION-NOT-SUPPORTED |
NPS-CLIENT-UNPROCESSABLE |
Terminal — predecessor that must be compensated has no compensate_action (and compensation_policy="strict") |
Copyright: LabAcacia / INNO LOTUS PTY LTD · Apache 2.0