@knowttl/artium-axi 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +79 -30
  2. package/bin/artium-axi.mjs +1420 -227
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -14,8 +14,8 @@ Administrators manage accounts, roles, encrypted service credentials and audit r
14
14
  The client follows AXI (Agent eXperience Interface) conventions for discovery, help and structured errors.
15
15
 
16
16
  **Status: under construction.**
17
- Falcon, Vectra, Azure, Graph and LDAP are wired into the production server entry point.
18
- See the [evidence ledger](docs/evidence-ledger.md) for the acceptance boundaries.
17
+ Falcon, Vectra, Azure, Graph, LDAP and Azure DevOps are wired into the production server entry point.
18
+ See the [evidence ledger](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/evidence-ledger.md) for the acceptance boundaries.
19
19
 
20
20
  ## Agent Ergonomics
21
21
 
@@ -96,7 +96,7 @@ artium-axi setup --host claude --hook
96
96
  ```
97
97
 
98
98
  Use `--host codex`, `--host opencode` or `--host pi` without `--hook` for those hosts.
99
- See [host paths and configuration overrides](docs/verification-s45.md) for installation locations.
99
+ See [host paths and configuration overrides](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s45.md) for installation locations.
100
100
  Setup requires the configured server URL and an authenticated account.
101
101
  It fetches reviewed adaptations of the server's pinned upstream skills; command examples run through `artium-axi <tool>` using Artium-managed credentials.
102
102
  Skills include granted tools that are disabled; running those tools still returns `TOOL_DISABLED`.
@@ -111,7 +111,7 @@ Artium-managed skills for tools no longer granted are retained and reported, not
111
111
  Unmanaged standalone skills outside the current grants are left untouched and unreported.
112
112
  Output lists one installed, unchanged or retained row per skill.
113
113
  Keep the bundle at its installed path; rerun setup if it moves so recorded invocations are repaired.
114
- See [host verification](docs/verification-s45.md) for recorded discovery checks and outstanding acceptance.
114
+ See [host verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s45.md) for recorded discovery checks and outstanding acceptance.
115
115
 
116
116
  ## Other ways to install
117
117
 
@@ -209,6 +209,7 @@ The [credential standard](docs/credential-standard.md#9-hosted-contract-artium-a
209
209
  | Azure (`az-axi`) | Entra tenant ID, application client ID, client secret or certificate private key and SHA-256 thumbprint, subscription IDs and optional workspace mapping. | `account list`; data-plane roles need their own permitted reads. |
210
210
  | Microsoft Graph (`mg-axi`) | Entra tenant ID, application client ID, client secret or certificate private key and SHA-256 thumbprint, administrator-consented Graph application permissions. | `entra user list --limit 1`; other domains need their own permissions. |
211
211
  | LDAP (`ldap-axi`) | Verified LDAPS or StartTLS URL, read-only bind identity and password, optional search base and private CA PEM. | `auth status`; binds once and reports the selected identity. |
212
+ | Azure DevOps (`ado-axi`) | Organization, optional default project and personal access token (PAT). | `project list --limit 1`. |
212
213
 
213
214
  #### Falcon
214
215
 
@@ -224,14 +225,15 @@ Falcon's fixed `auth status` test reports local credential resolution, so also r
224
225
 
225
226
  #### Vectra
226
227
 
227
- Obtain the deployment's canonical HTTPS origin, without a path or trailing slash.
228
+ Obtain the deployment's HTTPS origin; see [credential editor guidance](#browser-administration) for accepted input.
228
229
  For QUX, select `kind=qux`, `apiVersion=2.5` and either `auth=token` with `token`, or `auth=oauth` with `clientId` and `clientSecret`.
229
230
  QUX OAuth requires appliance release 9.1 or later; `applianceRelease` is optional release metadata.
230
231
  For RUX, select `kind=rux`, `apiVersion=3.4`, `auth=oauth`, `clientId` and `clientSecret`; leave `applianceRelease` blank.
231
232
  Create a QUX personal token under **My Profile** using a local account, or have a Vectra administrator create an OAuth API client under **Manage > API Clients** and record the displayed ID and secret.
232
233
  Tokens inherit their user's rights and clients inherit their assigned role; grant read access to health and the Hosts, Accounts, Detections or other areas you need.
233
234
  See [Vectra's credential issuance guidance](https://github.com/vectranetworks/vectraautomatedresponse#getting-a-vectra-api-token-for-vectra-detect-api-v2) and the pinned [Vectra configuration contract](https://github.com/knowttl/vectra-axi/tree/v0.1.5#configuration) for deployment-specific requirements.
234
- If the deployment uses a private CA, paste its PEM contents into `caBundle`; enter no server file path.
235
+ For a credential-specific private CA, paste its PEM contents into `caBundle`; enter no server file path.
236
+ For shared trust across tools, follow the [private CA runbook](docs/runbook.md#tls-inspection-and-private-upstream-cas).
235
237
  Keep Native settings empty for read-only use; optional writes need the native operation allowlist and upstream permissions.
236
238
  Save, run **Test credential**, enable and grant the tool, then run `artium-axi vectra-axi detection list --limit 1` to check the intended read domain.
237
239
 
@@ -325,7 +327,7 @@ For a certificate, choose `auth=certificate`, enter the PEM in `privateKey` and
325
327
  Leave `allowDeviceCode`, `preview`, `sensitiveAreas` and `writes` at their defaults for the initial read-only setup.
326
328
  Save, run **Test credential**, follow the [activation requirements](#browser-administration), enable and grant the tool, then run `artium-axi mg-axi entra user list --limit 1`.
327
329
  Hosted application mode acquires tokens silently; do not run upstream `auth login` or supply `--scopes` through Artium.
328
- See the [evidence ledger](docs/evidence-ledger.md) for recorded local and captain live acceptance; credential setup instructions do not establish acceptance for a new host or every upstream operation.
330
+ See the [evidence ledger](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/evidence-ledger.md) for recorded local and owner live acceptance; credential setup instructions do not establish acceptance for a new host or every upstream operation.
329
331
 
330
332
  #### LDAP
331
333
 
@@ -337,9 +339,11 @@ The native Kerberos provider and its installation script are unnecessary for thi
337
339
 
338
340
  Obtain a dedicated directory identity with read access only, its bind DN and password, and a directory URL whose certificate can be verified.
339
341
  At `/admin/tools/ldap-axi`, enter `url`, choose `auth=simple`, and enter `bindDn` and the password value in `bindPassword`.
340
- Use `ldaps://<directory-host>:636`, or `ldap://<directory-host>:389` with `startTls=true`.
342
+ Use `ldaps://<directory-host>:636` with `startTls` left at the default (unset) or explicitly `false`, or `ldap://<directory-host>:389` with `startTls=true`.
343
+ Saving an `ldaps://` URL with `startTls=true` is rejected with `INVALID_INPUT` and the message `startTls must be false for this URL.`
341
344
  Plaintext simple bind, anonymous authentication, disabled certificate verification and caller-supplied connection or credential overrides are refused.
342
- If a private CA is required, supply its PEM contents in `caFile`, not a server file path.
345
+ For a credential-specific private CA, supply its PEM contents in `caFile`, not a server file path.
346
+ For shared trust across tools, follow the [private CA runbook](docs/runbook.md#tls-inspection-and-private-upstream-cas).
343
347
  The multi-line `caFile` editor preserves newlines through saving and private CA file materialization for each call.
344
348
  Artium's CLI has no credential-save command.
345
349
  Optional `base` limits the search context; otherwise the pinned tool discovers the directory's default naming context.
@@ -352,6 +356,29 @@ LDAP is read-only by design and has no editable native write settings.
352
356
  The [LDAP inventory](tools/inventories/ldap-axi.json) owns the supported commands, blocked overrides and resource requirements.
353
357
  Local fake-directory and offline profile checks do not establish live directory acceptance.
354
358
 
359
+ #### Azure DevOps
360
+
361
+ Artium uses the [pinned](tools/package.json) `@jeffreyhaen/ado-axi` release without upstream modifications.
362
+ At `/admin/tools/ado-axi`, enter `org`, optional `project`, choose `auth=pat`, and paste the PAT itself into `token`.
363
+ Organization-root URLs such as `https://dev.azure.com/<org>` and `https://<org>.visualstudio.com` normalize to the organization name.
364
+ Artium encrypts the PAT in its credential store and injects it through a private per-call profile and environment variable.
365
+ Do not enter a SecretRef or environment-variable name.
366
+ Create a dedicated PAT scoped to the organization with Work Items, Code and Build read permissions as needed for the commands you use.
367
+ Grant corresponding read-write permissions only for intended mutations; a write switch never grants Azure DevOps permissions.
368
+ Save, run **Test credential**, enable the tool, grant it to a role, then run `artium-axi ado-axi project list --limit 1`.
369
+
370
+ Writes are off by default; follow [write-access administration](docs/runbook.md#roles-credentials-and-health) to enable them.
371
+ Artium classifies every command using the reviewed [ADO inventory](tools/inventories/ado-axi.json), which binds the routing review to upstream source digests.
372
+ Artium manages `--org`, `--profile` and `--config`; those overrides and the top-level `config` and `update` commands are refused.
373
+ Use `--project` to select another project within the managed organization.
374
+ The `api` command accepts relative paths and GET only, even when writes are enabled; body flags and absolute URLs are refused.
375
+ All commands refuse repeated flags, stdin and files.
376
+ Use `pipeline watch --timeout 50` or less to stay within the runner's call timeout.
377
+ Writes are journaled by Artium only; see [audit action classification](#audit-screen-and-api).
378
+ For an interrupted write, run the returned read-back command and follow its inspection guidance before retrying.
379
+ PAT authentication is available now; client ID and secret authentication is a separate integration phase, with no device flow.
380
+ Local fake-service checks do not establish live organization acceptance.
381
+
355
382
  ### Build from source
356
383
 
357
384
  The source toolchain requires Node **24.11 or later** and **pnpm 10.22.0**.
@@ -369,7 +396,8 @@ After signing in, run `node dist/cli/artium-axi.mjs setup --host codex` to insta
369
396
  The root package remains private for server development; `pnpm build:npm` stages the separate public client package in `dist/npm` using the root package version.
370
397
  Run `npm pack --dry-run ./dist/npm` to inspect the client tarball before release.
371
398
  Only the bundled CLI, skill, README, LICENSE, NOTICE and client package metadata are included.
372
- See [npm client releases](docs/runbook.md#npm-client-releases) for automated publishing and owner setup.
399
+ Release automation also publishes the pinned server image to `ghcr.io/knowttl/artium-axi:<release-tag>` with OCI labels and provenance.
400
+ See [release publishing](docs/runbook.md#npm-client-releases) for owner setup and image digest and attestation verification before deployment.
373
401
 
374
402
  ## Usage
375
403
 
@@ -385,7 +413,7 @@ See [npm client releases](docs/runbook.md#npm-client-releases) for automated pub
385
413
  | `artium-axi whoami` | Show identity, roles, access expiry and server URL. |
386
414
  | `artium-axi tools` | List enabled runtime tools granted through your roles. |
387
415
  | `artium-axi tools show falcon-axi` | Show cached status, vetted pinned help and a first-call example. |
388
- | `artium-axi doctor` | Check server address, certificate, token, CLI version and cached tool health. |
416
+ | `artium-axi doctor` | Check server address, certificate, token, CLI version and cached tool health, with a five-second deadline per request. Stop dependent probes after address or TLS connection failure. |
389
417
  | `artium-axi logout` | Remove local tokens and attempt server-session revocation. |
390
418
  | `artium-axi setup --host claude --hook` | Install your granted skills and optional Claude Code hook after sign-in. |
391
419
  | `artium-axi falcon-axi detection list` | Run a Falcon read through the managed adapter. |
@@ -394,6 +422,9 @@ See [npm client releases](docs/runbook.md#npm-client-releases) for automated pub
394
422
  | `artium-axi ldap-axi user list --limit 1` | Run a bounded directory read through the managed adapter. |
395
423
 
396
424
  Add `--help` to a local command to inspect its accepted flags.
425
+ Top-level help lists command purposes.
426
+ Unknown or unexpected local commands, arguments and flags are rejected before configuration, private-channel reads or network access, with valid choices for the relevant command.
427
+ Rejected tokens are named, except for `login` and `passwd` input, which is identified by position without printing its value because it may contain a password.
397
428
  Tool help has two boundaries:
398
429
 
399
430
  ```sh
@@ -430,7 +461,7 @@ Details read bundled manifests and stored health without fetching credentials or
430
461
  Discovery and administration show the server's bundled tool versions, as defined by the [API contract](src/shared/api.ts).
431
462
 
432
463
  Upstream calls preserve stdout, stderr and nonzero exit codes.
433
- For Falcon, Vectra, Azure, Graph and LDAP, recognized TOON or JSON root `help` suggestions, plain upstream help and bundled tool-detail help use `artium-axi <tool>` commands, including examples originally invoking `npx -y @knowttl/<tool>`.
464
+ For Falcon, Vectra, Azure, Graph, LDAP and Azure DevOps, recognized TOON or JSON root `help` suggestions, plain upstream help and bundled tool-detail help use `artium-axi <tool>` commands, including examples originally invoking `npx -y @knowttl/<tool>`.
434
465
  Recognized flag listings and command suggestions omit managed flags declared in each pinned [tool inventory](tools/inventories/)'s `unsafeOverrides`, including Graph profile, config and scopes selectors.
435
466
  LDAP home output lists hosted commands, and recognized connection and TLS recovery hints direct callers to an administrator to update the [stored LDAP credentials](#ldap).
436
467
  Unrelated content, literal argument values, unknown formats and truncated streams remain unchanged.
@@ -513,21 +544,29 @@ Archived users cannot be enabled through the UI or API; use Disable for temporar
513
544
  Credential editors pre-fill non-secret values and never return stored secrets.
514
545
  Vectra and Graph use schema-generated fields and validation from their published [AXI credential standard](docs/credential-standard.md) profile schemas.
515
546
  Enter secret values themselves, not SecretRefs; leave unused fields blank and enter object fields as advanced JSON and string lists one value per line.
516
- For Vectra, `origin` must be a canonical HTTPS origin, without a path, credentials or an explicit default port.
517
- Enter PEM contents in `caBundle`, not a server file path; Artium writes a private CA file for each call.
547
+ Profile-backed credential saves normalize safe differences only when the schema rejects the original value; already valid values, including secrets, remain byte for byte unchanged.
548
+ Rejected strings can have surrounding whitespace removed, including nested object and list values; secret interior whitespace is preserved.
549
+ For Vectra, `origin` accepts surrounding whitespace, a trailing slash, uppercase scheme or host and an explicit default port, saving a canonical HTTPS origin.
550
+ Paths, queries, fragments, embedded credentials and HTTP origins remain invalid.
551
+ Rejected profile input returns `INVALID_INPUT` with field names and failing schema constraints, including string lengths, array bounds, uniqueness and unsupported fields, without echoing submitted values.
552
+ When the authentication branch is identifiable, guidance reports its failures and conflicting field names without instructions from other branches; independent errors are reported together.
553
+ Ambiguous alternatives receive field-combination guidance.
554
+ See [Vectra credential setup](#vectra) for private CA input and shared trust.
518
555
  The form exposes the schema's full requirements, including conditional requirements for the chosen authentication kind.
519
556
  Azure uses guided source-identity fields because the host brokers resource tokens separately.
520
557
  Azure and Graph certificate editors accept one PEM file containing one certificate and its matching unencrypted private key and calculate the fingerprint automatically.
521
558
  See the [hosted contract](docs/credential-standard.md#9-hosted-contract-artium-axi) for profile injection.
522
559
  Falcon has guided fields even when its pinned package has no credential schema; its injection path stays unchanged.
523
560
  Browser saves keep native settings and retain blank stored secrets for the same identity.
524
- Changing mode, kind, authentication, tenant, client or origin requires new secrets.
561
+ Identity changes require new secrets as defined by the [credential-save contract](src/shared/api.ts) (`adminToolRoutes.save`).
525
562
  Select **Test after saving** to save and report a harmless credential check inline.
563
+ After saving, the page reports applied normalizations and reloads stored non-secret values; secret notices name only the field and change, never the value.
526
564
  See the [credential-save contract](src/shared/api.ts) (`adminToolRoutes.save`) for API inputs and complete replacement semantics.
527
565
  See [credential rotation](docs/runbook.md#roles-credentials-and-health).
528
566
  Native settings also replace the entire object; `{}` clears it.
529
567
  Credential changes clear cached health, and background checks run every 15 minutes for enabled configured tools.
530
568
  Use **Test credential** for a current fixed read before enabling a configured tool.
569
+ For failed tests, follow the [credential diagnostic guidance](docs/runbook.md#scripted-administrator-sessions) and the [error reference](docs/errors.md).
531
570
  Graph tests read at most one user through `entra user list --limit 1`.
532
571
  For a new installation, follow [Graph credential setup](#microsoft-graph) and obtain the required permission results and maintainer approval before enabling Graph on a running installation.
533
572
 
@@ -550,7 +589,7 @@ Multiple enabled providers appear on both the sign-in page and CLI approval page
550
589
  Assign generic-provider users direct artium roles or configure claim rules for tool access.
551
590
  Generic rules accept any exact top-level claim name, such as `groups` or `custom.claim`, and match a string or a string in an array against the case-sensitive rule value.
552
591
  Dots are literal claim-name characters, not nested paths; numbers, booleans and objects do not match.
553
- See [generic OIDC verification](docs/verification-p5a.md) for the approved scope split, fake-provider evidence and pending maintainer live acceptance.
592
+ See [generic OIDC verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p5a.md) for the approved scope split, fake-provider evidence and pending maintainer live acceptance.
554
593
 
555
594
  Provider credentials use the encrypted store; their secrets are never returned in pages, API metadata or audit records.
556
595
  Non-secret fields are pre-filled; leave secrets blank to keep them for the same tenant, client and authentication method.
@@ -572,13 +611,13 @@ The users table and signed-in header identify designated accounts.
572
611
  Removing designation revokes that account's browser and CLI sessions; demotion also clears designation, and claiming an SSO link removes it.
573
612
  When any SSO provider is enabled, only designated local administrators may use password sign-in, password confirmation or password changes, through either browser or bearer routes.
574
613
  Fresh installations designate no accounts automatically and keep providers disabled.
575
- See [break-glass verification](docs/verification-p3c2.md) for local-password policy evidence and [P3 activation verification](docs/verification-p3c2b.md) for activation and complete fake-provider browser acceptance.
614
+ See [break-glass verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p3c2.md) for local-password policy evidence and [P3 activation verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p3c2b.md) for activation and complete fake-provider browser acceptance.
576
615
  On an Entra provider page, add, edit or remove role rules mapping an exact, case-sensitive Entra `roles` claim value to an artium role.
577
616
  Generic provider pages offer the same rule editor with a claim-name field.
578
617
  Each rule's Who matches link opens the enabled, unarchived users whose last successful sign-in claims match that provider, issuer, claim name and value.
579
618
  Counts refresh on page reload and include matches for new rules before the next role sync.
580
619
  These saved claims are not a live directory query; users without recorded sign-in claims are unknown.
581
- See the [upgrade runbook](docs/runbook.md#backup-restore-and-upgrade-rollback) for existing-identity compatibility and [claim-rule verification](docs/verification-p5b.md) for local evidence and pending maintainer live acceptance.
620
+ See the [upgrade runbook](docs/runbook.md#backup-restore-and-upgrade-rollback) for existing-identity compatibility and [claim-rule verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p5b.md) for local evidence and pending maintainer live acceptance.
582
621
  The target role supplies tool access; rules never grant administrator capability.
583
622
  Create roles and grant their tools on **Roles** first.
584
623
  Every rule change requires the [confirmation described under browser administration](#browser-administration) and is audited atomically; stale edits require reloading the page.
@@ -600,7 +639,7 @@ Claiming atomically binds the immutable provider identity, consumes the invitati
600
639
  Linking preserves the existing user id, username, display name, administrator flag and history, removes the local password and revokes prior browser and CLI sessions.
601
640
  An existing identity or username is never automatically linked; expired, revoked, replaced or claimed links cannot grant access.
602
641
  Claim, link, role-sync and sign-in audit events commit with the account and session changes.
603
- See [browser SSO protocol verification](docs/verification-p3b.md) and [SSO reauthentication verification](docs/verification-p3c.md) and [P3 activation verification](docs/verification-p3c2b.md) for fake-provider evidence and pending maintainer live acceptance.
642
+ See [browser SSO protocol verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p3b.md) and [SSO reauthentication verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p3c.md) and [P3 activation verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p3c2b.md) for fake-provider evidence and pending maintainer live acceptance.
604
643
  For CLI SSO, set `ARTIUM_AXI_URL` to this server and run `artium-axi login --sso`.
605
644
  Open the displayed `/device` URL in any browser, enter the terminal code, choose an enabled provider and complete a fresh sign-in, then review the requesting IP and UTC time before choosing **Approve**.
606
645
  Approve only a request you started on a device you control, with a code that matches your terminal; never approve a code someone sends you.
@@ -614,7 +653,7 @@ Approve the returned code through `/device` after a fresh provider sign-in as th
614
653
  Poll `/v1/auth/reauth` with the same access token and JSON `{ "deviceCode": "<deviceCode>" }`, waiting the returned `intervalMs` milliseconds between polls, until it returns a recent-auth `ticket` and `expiresAt` instead of `status: pending`.
615
654
  Send the ticket in `x-artium-reauth-ticket` on administration requests; it authorizes only the initiating CLI family and cannot extend its lifetime.
616
655
  Denial, expiry or revocation prevents ticket issuance; approval codes are single use.
617
- See [CLI device sign-in verification](docs/verification-p4a.md) for recorded fake-provider evidence and bearer reauthentication coverage.
656
+ See [CLI device sign-in verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-p4a.md) for recorded fake-provider evidence and bearer reauthentication coverage.
618
657
 
619
658
  ### Audit screen and API
620
659
 
@@ -641,6 +680,7 @@ Device approval and refusal emit `device-approve` and `device-deny` events, with
641
680
  Each `run-terminal` record uses `action` to report `write` when the native tool journal contains valid JSON object records for that run, or `read` when a successful run leaves its supported journal absent or empty.
642
681
  This records journal activity, including mutation intents, rather than guaranteeing that a remote change succeeded.
643
682
  Pinned Falcon and LDAP runs report `read` from their inventories' read-only declarations, including normal runs and health checks.
683
+ ADO uses host classification: reads report `read`, successful write calls report `write`, and failed or interrupted writes report `unknown`.
644
684
  For tools with native journals, failures without journal records and malformed or unreadable evidence report `unknown`; recovered interrupted runs also report `unknown`.
645
685
  See the [API contract](src/shared/api.ts) and [retention and export runbook](docs/runbook.md#retention-and-export).
646
686
 
@@ -696,7 +736,7 @@ The optional fields `status: "authenticated"`, `accessExpiresAt` and `familyExpi
696
736
  The caller owns expiry policy, refresh serialization across processes and secure persistence.
697
737
  Managed mode supports `login`, the home view, `whoami`, `tools`, `tools show`, `doctor` and tool commands.
698
738
  `passwd`, `logout` and `setup` are refused before any network call; ordinary sign-in and its server-version warning remain unchanged without the flag.
699
- Help is available without private channels through `artium-axi --help`.
739
+ Help is available without private channels through `artium-axi --help`; use `artium-axi --managed-session --help` or `artium-axi login --help` for the pipe protocol.
700
740
 
701
741
  To obtain the first session, run `artium-axi --managed-session login --username <username> --password-stdin` with the password on protected inherited stdin, or `artium-axi --managed-session login --sso` for browser approval.
702
742
  Login does not read or require fd 3; it requires a writable private pipe or socket on fd 4 before contacting the server.
@@ -735,6 +775,7 @@ Missing or closed descriptors, invalid JSON and mismatched server bindings fail
735
775
  | `ARTIUM_AXI_DATABASE_FILE` | SQLite database path; default `/data/artium.db`. |
736
776
  | `ARTIUM_AXI_MASTER_KEY_FILE` | Initial or explicit master-key file containing exactly 32 raw bytes; takes precedence over other key sources. |
737
777
  | `ARTIUM_AXI_MASTER_KEY` | Alternative canonical base64 encoding of exactly 32 key bytes. |
778
+ | `ARTIUM_AXI_EXTRA_CA_FILE` | Optional readable PEM bundle of public CA certificates for upstream TLS, including TLS inspection; mounted read-only. Loaded at startup; see the [private CA runbook](docs/runbook.md#tls-inspection-and-private-upstream-cas). |
738
779
  | `ARTIUM_AXI_ADMIN_USERNAME` | First-start local administrator username. |
739
780
  | `ARTIUM_AXI_ADMIN_PASSWORD_FILE` | UTF-8 file containing the exact first-start password, without an added newline. |
740
781
  | `ARTIUM_AXI_TRUSTED_PROXIES` | Comma-separated verified proxy source IP addresses; default trusts none. |
@@ -762,7 +803,8 @@ Fake-service results do not establish live platform permissions or production re
762
803
  Never put tokens or keys in arguments, source files, images or logs.
763
804
  The server refuses the removed development-authentication settings `ARTIUM_AXI_DEV` and `ARTIUM_AXI_DEV_TOKEN_FILE`.
764
805
 
765
- Local passwords use Argon2id, require 15 to 128 code points and at most 512 UTF-8 bytes, preserve spaces and Unicode, and reject exact matches in the bundled common-password list.
806
+ Local passwords use Argon2id and accept any non-empty password of at most 512 UTF-8 bytes, preserving spaces and Unicode.
807
+ The byte cap bounds input to native hashing; there are no minimum-length, character-count or common-password rules.
766
808
  Access tokens last one hour within an 8-hour SSO CLI family or a 12-hour local CLI family; refresh-token reuse revokes the family.
767
809
  Password changes revoke existing CLI tokens and browser sessions.
768
810
  See [browser administration](#browser-administration) for session management and user archival.
@@ -784,12 +826,14 @@ The runner uses argument arrays without a shell, a restricted child environment,
784
826
  Known injected secrets are scanned in raw, JSON-escaped, base64, base64url and URL-encoded output, including beyond capture limits; a match discards both streams.
785
827
  Exact-value scanning cannot identify unknown tokens minted upstream.
786
828
  Heap and address-space limits are not complete process isolation: descendants starting a new session escape the runner's process group.
787
- See [runner verification and limitations](docs/verification-s09-10.md) and [secret-scanner evidence](docs/verification-s07.md).
829
+ See [runner verification and limitations](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s09-10.md) and [secret-scanner evidence](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s07.md).
788
830
 
789
831
  ## Development & Testing
790
832
 
833
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for local no-mistakes delivery, container acceptance and the alias deprecation policy.
834
+
791
835
  Use Linux with the [source toolchain](#build-from-source), OpenSSL, Python 3, curl and sha256sum.
792
- Container acceptance additionally requires Docker and the BuildKit prerequisites described in the [container evidence](docs/verification-s20-21.md).
836
+ Container acceptance additionally requires Docker and the BuildKit prerequisites described in the [container evidence](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s20-21.md).
793
837
  `pnpm test:containers` starts a private BuildKit worker with `--privileged`; hosts that forbid privileged containers cannot run this check and must record container acceptance as unverified.
794
838
 
795
839
  ```sh
@@ -799,21 +843,26 @@ pnpm test:containers
799
843
  ```
800
844
 
801
845
  `pnpm check` verifies generated error-reference freshness, strict type checking, parser/schema inventory freshness, the Vitest suite, compilation and the AXI/distribution checklist.
802
- See [checklist verification](docs/verification-s46.md) for the fake-only download, authentication, setup and first-call checks.
846
+ See [checklist verification](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/verification-s46.md) for the fake-only download, authentication, setup and first-call checks.
803
847
  It refuses unverified host platforms.
804
848
 
849
+ The [Vitest configuration](vitest.config.ts) separates unit and integration projects.
850
+ Only the integration project loads the [reduced-cost password hashing setup](test/fixtures/integration-setup.ts); local authentication unit tests and the native smoke retain production hashing costs, as does the dummy hash used for missing accounts.
851
+
805
852
  | Command | Scope |
806
853
  | --- | --- |
807
854
  | `pnpm lint` | Static TypeScript checking. |
808
855
  | `pnpm test` | Inventory/schema freshness checks and the full Vitest suite. |
809
856
  | `pnpm build` | Server compilation and standalone client bundle. |
810
857
  | `pnpm test:security` | Tests whose names contain `security`. |
811
- | `pnpm test:containers` | Mandatory fake-only runner, walking-skeleton, Graph headless and fake-service container acceptance. |
858
+ | `pnpm test:containers` | Fake-only runner, walking-skeleton, Graph headless and fake-service container acceptance. |
812
859
  | `pnpm test:browser` | Real admin pages in an isolated Chrome session through `chrome-devtools-axi`, against the local fake browser harness. |
813
860
  | `pnpm test:containers --measure-cache` | The container block plus an identical-input warm runner build measurement. |
814
861
  | `pnpm errors:generate` | Regenerate the error reference after changing the catalogue. |
815
862
 
816
- The container block builds before probing, emits head/input/output evidence and timings, and removes its uniquely owned test images and private BuildKit cache.
863
+ The container block builds before running independent acceptance phases concurrently, emits head/input/output evidence and timings, and waits for every phase before removing its uniquely owned test images and private BuildKit cache.
864
+ The [gate configuration](.no-mistakes.yaml) owns the paths that require container acceptance and the CLI, documentation, workflow and skill-only exemptions.
865
+ Every release requires container acceptance under the [release prerequisites](docs/runbook.md#npm-client-releases).
817
866
  Do not touch shared Docker resources or use real service credentials.
818
867
  Changed relevant inputs invalidate earlier container evidence.
819
868
  Upstream pins and integrity records live in [tools/package.json](tools/package.json), [tools/integrity.json](tools/integrity.json) and [tools/falcon-source.json](tools/falcon-source.json).
@@ -827,7 +876,7 @@ Before publishing a candidate, commit and build it, then set `ARTIUM_AXI_HYGIENE
827
876
  pnpm hygiene:check
828
877
  ```
829
878
 
830
- The UTF-8 list contains one literal term per line, matched case-insensitively after trimming whitespace; blanks and duplicates are ignored.
879
+ The UTF-8 list contains one literal term per line, matched after trimming whitespace using context-independent Unicode simple case folding; blanks and case-equivalent duplicates are ignored.
831
880
  Unset, unreadable, empty or in-tree lists fail.
832
881
  Never copy real terms or the list into this repository.
833
882
  Record only its revision or SHA-256, candidate commit and pass/fail result.
@@ -835,7 +884,7 @@ Record only its revision or SHA-256, candidate commit and pass/fail result.
835
884
  The check scans tracked, untracked and ignored files, generated output and every commit message reachable from `HEAD`, excluding only `.git` metadata and installed `node_modules` directories.
836
885
  Supply intended release assets outside the checkout as additional `pnpm hygiene:check` arguments, keeping the list outside those directories too.
837
886
  Symlinks, unreadable files and BOM-marked UTF-16/UTF-32 assets fail rather than reducing coverage; convert unsupported encodings to UTF-8.
838
- Diagnostics report location and normalized entry number without secret excerpts, and redact labels whose paths match a term.
887
+ Diagnostics report location (with one-based columns in the original text's UTF-16 code units) and normalized entry number without secret excerpts, and redact labels whose paths match a term using the same folding rule.
839
888
  The scan cannot guarantee absence of unknown sensitive values and does not approve publication.
840
889
 
841
- Further operational guidance lives in the [runbook](docs/runbook.md); local implementation and deferred live acceptance are tracked in the [evidence ledger](docs/evidence-ledger.md).
890
+ Further operational guidance lives in the [runbook](docs/runbook.md); local implementation and deferred live acceptance are tracked in the [evidence ledger](https://github.com/knowttl/artium-axi/blob/archive/internal-docs/docs/evidence-ledger.md).