Commit Graph
57 Commits
Author SHA1 Message Date
james.maesandCodex 18905b0067 ci: use the shared branch-aware CodeQL worker
Co-Authored-By: Codex <noreply@openai.com>
2026-10-21 10:02:17 -05:00
james.maesandCodex 9db6d4bb59 ci: adopt central orb 0.7.12 and stable gates (#31)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 08:58:18 -05:00
james.maesandCodex 9f581996d0 ci: centralize rc release completion in qqq orb (#30)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 02:30:33 -05:00
james.maesandCodex c9d324acd4 ci: adopt shared orb 0.7.11 (#29)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 01:01:51 -05:00
james.maes cd2128f78f Merge pull request #27 from QRun-IO/feature/central-ci
ci: adopt verified central QQQ orb 0.7.1
2026-10-20 18:53:02 -05:00
james.maesandCodex 3d336c3dfe ci: adopt verified central QQQ orb 0.7.2
Co-Authored-By: Codex <noreply@openai.com>
2026-10-20 18:42:43 -05:00
james.maes 73411423df Merge pull request #26 from QRun-IO/feature/edi-business-home
fix(app): business-only EDI home; system widgets for the Admin home
2026-10-16 10:19:39 -05:00
james.maesandClaude Opus 5.5 cccd0ac0ab fix(app): business-only EDI home; system widgets for the Admin home
Move System, Dead letters, Certificates expiring and Setup status off the
EDI home into EdiHome.ADMIN_WIDGET_NAMES, gated to edi.admin.hasAccess
(hidden when denied) and full width, for a host to place on its Admin
home. Every remaining home widget requires edi.hasAccess (hidden when
denied); none is NOT_PROTECTED.

Add "Inbound documents are delayed": an alert at the top of the home,
shown only when the oldest unprocessed inbound document is older than
inboundDelayedAfterMinutes (default 60), with its age and a link to the
filtered inbound documents.

Setup counts that fail show "Unavailable" and are logged, never -1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 09:28:46 -05:00
james.maes 2681447b07 Merge pull request #25 from QRun-IO/ci/release-rc-secrets-inherit
ci(release-rc): pass secrets so the shared workflow can sign the RC tag
2026-10-16 08:05:13 -05:00
james.maesandClaude Opus 5.5 55a28c7031 ci(release-rc): pass secrets to the shared workflow so it can sign the RC tag
QRun-IO/.github#2 adds a tag-and-release job that signs vX with the
QRUN_TAG_SIGNING_KEY secret after Maven Central confirms the artifact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:19:12 -05:00
james.maes 2491669f23 Merge pull request #24 from QRun-IO/feature/ui-api-1.6
feat(ui-api): extension for QQQ UI API 1.6.0 (operationIds, BasicErrorResponseV1, QQQ 4.1.0-RC.15)
2026-10-15 16:13:04 -05:00
james.maesandClaude Opus 5.5 36f1b939b4 chore: target QQQ 4.1.0-RC.15 (UI API 1.6.0)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 12:27:06 -05:00
james.maesandClaude Opus 5.5 77d63135af feat(ui-api): extension for QQQ UI API 1.6.0 (operationIds, BasicErrorResponseV1, QQQ 4.1.0-RC.14)
Regenerated against UI API 1.6.0: every operation has an operationId and
the standard error responses (BasicErrorResponseV1: error, code, message,
fieldErrors, traceId); the extension's own error schema is kept but
deprecated; hand-written error bodies go through QJavalinUtils so they carry
code/message/traceId. Extension MINOR bumped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:43:38 -05:00
james.maes 603e518a34 Merge pull request #23 from QRun-IO/fix/outbound-enqueue-table-cache
fix(outbound): record-change listener only costs queries for configured source tables
2026-10-15 07:38:22 -05:00
james.maesandClaude Opus 5.5 d1eb78c1df fix(outbound): the record-change listener only costs queries for configured source tables
OutboundEnqueue applied to every non-edi_ table, and per record opened a
system session and queried edi_agreement_document, so every insert and
update of audit, auditDetail, worm_audit_chain, jobs, alerts and the
rest paid for it (and UPDATEs fetched old records for it).

- OutboundSourceTables (per EdiRuntime) caches the source tables that
  have an active RECORD_CHANGE outbound document on an active agreement,
  loaded from committed data. appliesTo answers from it, so other tables
  do no work at all.
- Changes to edi_agreement / edi_agreement_document invalidate it, and
  again after their transaction commits (a reload that raced the change
  is discarded); until then the changing transaction bypasses the cache
  and sees its own definitions. A 60s TTL covers other processes.
- onRecordsChanged resolves definitions (documents + active agreements)
  once per event, not once per record. MANUAL and ESB_EVENT enqueue keep
  their semantics.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 07:24:33 -05:00
james.maes 2810e00e9c Merge pull request #22 from QRun-IO/fix/producer-version-from-build
fix: qbit metadata version comes from the build
2026-10-15 01:42:56 -05:00
james.maesandClaude Opus 5.5 89a95737a5 fix: the qbit metadata version comes from the build, not a hardcoded constant
The producer read a literal version, so released artifacts reported a stale
or -SNAPSHOT version. qbit-edi.properties (version=${project.version}) is
Maven-filtered and the producer loads it; tests assert producer == bundle ==
artifact version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:29:54 -05:00
james.maes 86b8dbf13d Merge pull request #21 from QRun-IO/fix/help-bundle-version-test
test(help): bundle version test compares with the artifact version
2026-10-14 23:18:42 -05:00
james.maesandClaude Opus 5.5 4471a13e78 test(help): compare the help bundle version with the artifact version, not a hardcoded SNAPSHOT
The bundle version is now Maven-filtered, so a literal SNAPSHOT in the test
fails every release build. Surefire passes the artifact version in
qbit.artifactVersion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:07:33 -05:00
james.maes c39d78901c Merge pull request #20 from QRun-IO/fix/help-bundle-version
fix(help): help bundle version comes from the build, not a hardcoded SNAPSHOT
2026-10-14 22:37:20 -05:00
james.maesandClaude Opus 5.5 1e25fe54d2 fix(help): the help bundle carries the artifact version (Maven-filtered) instead of a hardcoded SNAPSHOT
On release branches the bundle's version and the producer's differed, so the
bundle test that asserts they match failed, and released bundles recorded
SNAPSHOT as their provenance. help/*.yaml is now filtered:
version: ${project.version}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:09:48 -05:00
james.maes 0fe99db48d Merge pull request #19 from QRun-IO/feature/help-bundle
feat(help): qbit-edi help bundle via QQQ help bundles, with coverage gate
2026-10-14 20:45:30 -05:00
james.maesandClaude Opus 5.5 b08057180b feat(help): ship the qbit-edi help bundle through QQQ help bundles, with coverage gate
Host-neutral help (deployment-specific facts removed), registered with
HelpBundles, gated by HelpBundleAssertions. QQQ 4.1.0-RC.7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:27:22 -05:00
james.maes 79b85a163d Merge pull request #18 from QRun-IO/feature/tables-populated-defaults
feat: every edi table explains itself; Setup status; Install sample maps
2026-10-14 17:42:45 -05:00
james.maesandClaude Opus 5.5 4e32aebc00 fix: X12 routing honors identity isActive; tests for draft maps and host help
- X12 inbound routing and outbound building ignore inactive identities, as
  EDIFACT does (UPGRADE note).
- Test that a draft map bound to an outbound document is never used (it
  already was not) and that inactive identities stop sending.
- hostHelpIsKept test; drop the unfounded concurrency claim on Install
  sample maps; plain wording in the help bundle header.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:32:54 -05:00
james.maesandClaude Opus 5.5 7bafab62cc docs: upgrade note wording
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:17:54 -05:00
james.maesandClaude Opus 5.5 a1914f7553 feat: table help, Setup status, Install sample maps, tables guardrail
Every edi_* table and the app get help bundle text saying how rows get
created and the setup order. The home gets a Setup status section. A new
Install sample maps table action adds the bundled synthetic maps as
inactive, unbound drafts (insert-only by name).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:17:41 -05:00
james.maes 51a5eaef74 Merge pull request #17 from QRun-IO/fix/repeat-schedule-time-zone
fix: no cron time zone on repeat-seconds worker schedules
2026-10-14 15:10:02 -05:00
james.maesandClaude Opus 5.5 47c3aac1b2 fix: no cron time zone on repeat-seconds worker schedules
OutboundProcesses.process set cronTimeZoneId("UTC") on every schedule.
Core instance validation refuses a time zone on a non-cron schedule, so a
host that configures a scheduler (kof22) failed validation at start. Only
cron schedules get UTC now; OutboundTest covers both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:59:12 -05:00
james.maes bf8f40959a Merge pull request #16 from QRun-IO/feature/orb-0.6.9
ci: qqq-orb 0.6.9 (refresh SNAPSHOT dependencies)
2026-10-14 10:57:01 -05:00
james.maesandClaude Opus 5.5 f7c031b793 ci: qqq-orb 0.6.9 (refresh SNAPSHOT dependencies)
Moves qqq-orb@0.6.8 to qqq-orb@0.6.9, which passes --update-snapshots so cached SNAPSHOT dependencies are re-checked on every build (QRun-IO/qqq-orb#22).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:06:51 -05:00
james.maes cd9423e966 Merge pull request #15 from QRun-IO/feature/phase-f-mapper-api
feat: phase f1 - spec'd UI API extension for the EDI mapper and sandbox
2026-10-14 09:58:48 -05:00
james.maes d97418447b Merge develop into feature/phase-f-mapper-api 2026-10-14 09:49:11 -05:00
james.maesandClaude Opus 5.5 c15872a373 feat: phase f1 - spec'd UI API extension for the EDI mapper
- MiddlewareSpecExtension "edi" 1.0.0 under /qqq/v1/qbit/edi:
  GET guides/{guideId}/tree, GET maps/{mapId}/target,
  POST sandbox/preview (unsaved rule overrides, base64 uploads up to
  5 MB, PHI suppression) and POST maps/{mapId}/validate.
- MapPreviewService shared by the Preview Map action and the endpoint;
  MapRuleValidator for paths, transforms and arguments.
- Committed fragment src/main/resources/openapi/qqq-v1/edi.yaml with a
  contract test; HTTP tests in strict raw-route mode.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:48:59 -05:00
james.maes fc800b8124 Merge pull request #14 from QRun-IO/feature/qqq-rc6
build: move to QQQ 4.1.0-RC.6 and remove RC.5 stand-ins
2026-10-14 09:26:57 -05:00
james.maesandClaude Opus 5.5 30ac598952 build: move to QQQ 4.1.0-RC.6 and remove RC.5 stand-ins
- qqq-bom 4.1.0-RC.6 (guardrail G7).
- Replace the EdiClassifications stand-in with core DataClassification
  on edi_ tables and fields and on the healthcare sample tables.
- Value-free QAlerts.notify notifications for exception assignment and
  partner exceptions.
- Fix the shared-transport possible-value filter grouping.
- PhiLogScope kept (RC.6 has no query-log redaction), now marked for
  core #1147 by RC.7; file-gateway stand-ins kept until that api ships.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:17:37 -05:00
james.maes 21b0e61cbb Merge pull request #13 from QRun-IO/feature/phase-g-edifact
feat: phase g - EDIFACT
2026-10-14 08:59:26 -05:00
james.maesandClaude Opus 5.5 5afeefb1c2 Merge develop into feature/phase-g-edifact
Resolve guide loader, validator, demo and docs conflicts with phases c and e;
HealthcareValidation now takes the standard-neutral EdiDocument.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:50:06 -05:00
james.maes b9ea954e1f Merge pull request #11 from QRun-IO/feature/phase-e-healthcare
feat: phase e - HIPAA healthcare documents, SNIP 3-5, PHI handling, canary tests
2026-10-14 08:46:36 -05:00
james.maesandClaude Opus 5.5 ea4c48ad66 feat: phase e - HIPAA healthcare documents, SNIP 3-5, PHI handling
- In-house 005010 baseline guides for 837P, 837I, 835, 270/271, 276/277
  and 834; 999 for HIPAA documents with IK3/IK4/CTX/IK5.
- SNIP 3 balancing (837 claim vs line charges, 835 payment vs claims and
  PLB, CAS adjustments), SNIP 4 situational rules, SNIP 5 format checks
  (ICD-10 shape, NPI check digit, ZIP) and an ExternalCodeSetProvider SPI.
- PHI classification via the RC.5 stand-in; healthcare keys go to
  phiBusinessKey; no element values in errors, events, alerts, logs or
  acks for PHI documents; audited Download Raw Document action.
- Healthcare sample maps, canary PHI egress tests, demo clearinghouse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:38:24 -05:00
james.maes 09b77ec122 Merge pull request #10 from QRun-IO/feature/phase-c-as2
feat: phase c - AS2 transport
2026-10-14 08:27:25 -05:00
james.maesandClaude Opus 5.5 4f8916246a feat: phase g - EDIFACT
- EDIFACT envelope reader and writer (UNA, UNB/UNZ, UNG/UNE, UNH/UNT,
  release-character escaping, syntax 3 and 4) with envelope findings.
- Routing by UNB identities, EDIFACT control references and duplicate
  detection; mixed X12 and EDIFACT inbox processing.
- In-house baseline guides (D96A, D01B) for ORDERS, ORDRSP, DESADV,
  INVOIC and CONTRL; CONTRL generation and inbound reconciliation.
- Sample maps (ORDERS in; ORDRSP, DESADV, INVOIC out) and demo partner
  Lindqvist Retail AB.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:26:05 -05:00
james.maesandClaude Opus 5.5 a4dca9046b feat: phase c - AS2 transport
- AS2 send and receive with signing, encryption, compression, MIC, sync
  and async MDN (as2-lib algorithms and MIC types, BouncyCastle S/MIME
  and MDN handling in memory; no temp files or keystores).
- /qqq/hooks/edi/as2/{transport} receiver and /mdn async receipt route;
  retransmits get the original MDN; failure MDNs for decryption,
  authentication and integrity errors; async MDN delivery queue.
- edi_as2_mdn table; certificate parsing on save, keys from env vars,
  ACTIVE/NEXT rollover with Promote Certificate and Export Public
  Certificate; NEXT expiry and edi.mdn.overdue alerts; VAN over AS2.
- Demo partner Pacific Wholesale over AS2 against an in-process peer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 08:09:55 -05:00
james.maes 2122fafed5 Merge pull request #9 from QRun-IO/feature/phase-d-logistics
feat: phase d - logistics documents 940, 945, 214, 204
2026-10-14 07:47:12 -05:00
james.maesandClaude Opus 5.5 0a98f34c5e feat: phase d - logistics documents 940, 945, 214, 204
- In-house baseline guides for 940, 945, 214 and 204 (004010, 005010)
  with control-total, stop and status situational rules.
- Sample maps: 940 in, 945 out and in, 214 in, 204 in and out; DATEPART
  and TIMEPART outbound transforms and "+" joined inbound paths.
- Fix: InboundApplier no longer fails on tables without associations.
- Logistics tests (round trips, invalid documents, routing) and demo
  partners Harbor Logistics (940/945) and Ridgeline Freight (204/214).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 07:41:41 -05:00
james.maes 00b91243a6 Merge pull request #7 from QRun-IO/feature/phase-b-retail-outbound
feat: phase b - retail documents, outbound pipeline, transports, ack monitor, demo
2026-10-14 07:09:35 -05:00
james.maes 0d5d24392e Merge pull request #6 from QRun-IO/feature/phase-a2-inbound
feat: phase a2 - inbound vertical slice (inbox, routing, maps, apply, gateway intake, app home)
2026-10-14 07:09:21 -05:00
james.maes 88c6c8e278 Merge pull request #5 from QRun-IO/feature/phase-a1-x12-core
feat: phase a1 - EDI data model, X12 parsing, guide validation, TA1/997/999
2026-10-14 07:09:09 -05:00
james.maesandClaude Opus 5.5 fece01d7df fix: widget serialization, labels and a readable app home
- Keep runtime services (clock, resolvers, suppliers, stores) out of
  EdiQBitConfig JSON: every child-record-list widget returned 500 because
  the qbit config was serialized into widget responses.
- Title Case table labels, plural child-list labels, acronym-correct
  field labels, PVS on every edi_ foreign key, meaningful record labels
  (no PHI), operator-first field order, newest-first activity lists.
- Home: six focused statistics; exception queue, overdue acks and recent
  errors as narrow tables with partner names and humanized ages; volume
  by partner and named document with totals; one compact System table.
  No inner horizontal scroll at 390 px.
- Tests for config serialization, every widget over core rendering and
  HTTP, labels, ordering and home formatting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:08:09 -05:00
james.maesandClaude Opus 5.5 2915f47740 feat: phase b - retail documents, outbound pipeline, transports, ack monitor
- Baseline guides and sample maps for 855, 856, 810, 846, 860 (004010
  and 005010); outbound map engine with SEQUENCE and HL numbering.
- Outbound triggers (record-change transactional outbox, ESB enqueue
  process, opt-in Send As EDI), outbound worker (map, validate, batch,
  envelope, store) and send worker with retry, backoff and dead letter.
- Transport plugin SPI and registry; SFTP push and poll (streamed, host
  key pinned), file-gateway OUTBOX through the agreed facade stand-in,
  HTTPS out (basic, bearer, HMAC) and the /qqq/hooks/edi/https receiver.
- Overdue-ack and certificate-expiry monitor via QAlerts; Resend, Resend
  As New and Cancel actions; outbound queue statistics on the home.
- Test-scope demo server with a realistic synthetic seed (docs/DEMO.md).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 22:14:08 -05:00