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>
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>
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>
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>
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>
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>
- 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>
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>
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>
- 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>
- 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>
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>
- 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>
- 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>
- 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>
- 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>
- 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>
- Durable edi_inbox with InboundSink intake, claimed scheduled worker,
backoff, stale-claim reclaim and dead letter.
- Routing by ISA identities and usage, duplicate handling, per-ST
transactions, validation errors, 997/999/TA1 queued as outbound
messages with allocated control numbers, inbound ack reconciliation
with QAlerts raise/resolve.
- Versioned data-driven maps (edi_map, rules, samples), EDI/QQQ paths,
transforms, and apply through Insert/UpdateAction as a host-supplied
service session with enforcement on.
- qbit-file-gateway consumer "edi" against a marked stand-in of the
agreed api; optional object-storage payload store (api package only).
- EDI app with Activity/Setup nav and a typed-widget home; record actions
(Reprocess, Preview Map, Assign/Ignore/Resolve, Create Partner
Override, Activate Guide, Activate Map) with standard Review/Result.
- Contingent partner-scoped possible-value filters with tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the application template's example sources with the EDI producer
and config, and add the standard files: qbit-build-parent 2.0.0 POM on
QQQ 4.1.0-RC.5 with Checkstyle and the JaCoCo gate, Maven wrapper,
CircleCI qqq-orb 0.6.8 workflows, the release-candidate workflow,
Dependabot, community pointer files, CHANGELOG, CLAUDE.md/AGENTS.md and a
DESIGN.md placeholder for the spec PR.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>