The owner asked (2026-10-13) that the assistant use and create bulk load
profiles. This adds the spec #1171 section 3.4 tools, all through the
/qqq/v1 UI API with the user's own session:
- bulk_profiles_list / bulk_profile_describe: the user's and shared
profiles, read through the savedBulkLoadProfile table (record locks).
- bulk_file_attach: an upload the panel already made (pageContext
attachments, refs only), with its masked column profiles.
- bulk_mapping_suggest: core's suggester. The model then refines the
profile from the headers and the permitted samples.
- bulk_load_dry_run: the table's real bulk-insert validation (SAMPLE or
FULL), with nothing stored. Error groups come with row numbers, so the
model can fix the profile and run again.
- bulk_profile_save (write): storeSavedBulkLoadProfile, plus
insertSharedRecord for each share. It runs only after the user confirms
the pending action, and only as far as the user may share.
- bulk_load_run (write): goes through a BulkLoadRunner seam after
confirmation. The default runner is the durable jobs launch, where core
creates assistant jobs AWAITING_CONFIRMATION. Until that ships, it
answers that the launch is not available yet (STAND-IN).
PHI: the X-QQQ-AI-Route header (hipaa|standard) comes from the turn's
provider HIPAA eligibility, never the model. The server masks samples and
values. Tool-call logs drop sampleValues, example bullets and value
mappings. Data access READ_WRITE is required to propose and to confirm
writes.
Supporting changes, all additive:
- UiApiCall: form params and headers.
- LoopbackUiApiGateway: multipart bodies.
- UiApiToolbox.Outcome.of.
- One dispatch branch each in ContextBuilder, TurnEngine and
AssistantApi.confirmAction.
- ToolLabels entries.
- The config seam.
The core operations are QRun-IO/qqq#1179 (STAND-IN until an RC). Until
then the tools say the server does not offer them.
Tests: BulkLoadToolsTest (6), including the golden eval. It uploads a CSV
with messy headers. The assistant proposes a profile, the dry run finds
the missing required field, the assistant defaults it, the dry run
passes, it saves and shares the profile after confirmation, and in a
second turn runs the load after confirmation. Full ./mvnw verify is green.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>