Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/agent/feature-map.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ This file maps consumer-visible capabilities to implementation anchors, executab
| Direct service-call control/evidence | `ServiceCallControl.java`; `ServiceCallEvidence.java`; `BoundedJsonEvidence.java`; `ServiceCallSteps.java`; `ModularScenarios.java`; `RestAssuredUtil.java`; bridge `/v1/services/call`; Workbench `workbench_service_call` | `@control-bridge`; existing service-call features | `docs/dynamic-control-api.md`; `docs/pickleball-workbench.md`; `docs/service-call-scenarios.md` |
| Semantic breakpoints | `ControlBridgeCoordinator.java`; `ControlBridgeBreakpoint.java`; `ControlHook.java`; bridge `/v1/breakpoints*`; Workbench `workbench_breakpoint_*` | `@control-bridge`; Workbench UI/MCP tests and `live-check` | `docs/dynamic-control-api.md`; `docs/pickleball-workbench.md` |
| Dynamic steps/expression execution | `DynamicSteps.java`; `DynamicExecution.java`; `StepExtension.java`; tree-parsing classes | `dynamic-steps.feature`; `forms-dynamic-steps.feature` | `docs/dynamic-steps.md` |
| Selenium navigation and interaction | `BrowserSteps.java`; `NavigationSteps.java`; `ElementWrapper.java`; `HumanInteractions.java`; `SeleniumUtils.java` | `navigation.feature`; `forms-dynamic-steps.feature`; `dialogs.feature`; browser test-site pages | `docs/dynamic-steps.md`; `docs/custom-element-definitions.md` |
| Selenium navigation and interaction | `BrowserSteps.java`; `NavigationSteps.java`; `ElementWrapper.java`; `HumanInteractions.java`; `SeleniumUtils.java`; `DriverConstruction.java`; bundled `META-INF/pickleball/configs/CHROME_HEADLESS.yaml`; `ParsingMap.initializeConfigs` fallback | `navigation.feature`; `forms-dynamic-steps.feature`; `dialogs.feature`; `ChromeHeadlessConfigChecks.java`; browser test-site pages | `docs/dynamic-steps.md`; `docs/custom-element-definitions.md`; `docs/configuration.md`; `docs/config-files-and-resource-mapping.md` |
| Custom element definitions/catalog context | `ExecutionDictionary.java`; `ElementMatch.java`; consumer `PickleballTests.java`; search `category(`, `inheritsFrom` | `catalog-context.feature`; `forms-dynamic-steps.feature`; `site/catalog.html` | `docs/custom-element-definitions.md`; `docs/config-files-and-resource-mapping.md` |
| Mapping, ParsingMap/NodeMap, templates/directives | `MappingSteps.java`; `FileAndDataParsing.java`; `MappingProcessor.java`; `QuoteParser.java`; `NodeMap.java`; `ParsingMap.java`; `ValueFormatting.java`; `common/dataelements` | `mapping-and-resources.feature`; `mapping-value-type-preservation.feature`; `scenario-data-references.feature`; Data Element features; `QuoteParserChecks.java`; internal Java checks | `docs/mapping-and-templating.md`; `docs/data-values-and-elements.md`; `docs/data-element-query-runtime.md`; `docs/config-files-and-resource-mapping.md` |
| Configuration/profiles/RunVars | `PKB_props.java`; `PickleballProfiles.java`; `PkbPropertyValueNormalizer.java`; runner/config classes; search `pkb_profile`, `pkb_runvars`, `pkb_run_profile`, `pkb_configpath` | `configuration-system-properties.feature`; `ProfileConfigurationChecks.java`; consumer properties/profile examples | `docs/configuration.md`; `docs/getting-started.md`; `docs/ai-run-configuration.md`; `docs/consumer-project.md` |
| Configuration/profiles/RunVars | `PKB_props.java`; `PickleballProfiles.java`; `PkbPropertyValueNormalizer.java`; `ParallelCountEstimator.java`; runner/config classes; search `pkb_profile`, `pkb_runvars`, `pkb_run_profile`, `pkb_configpath`, `pkb_parallel=auto` | `configuration-system-properties.feature`; `ProfileConfigurationChecks.java`; `ParallelCountEstimatorChecks.java`; consumer properties/profile examples | `docs/configuration.md`; `docs/getting-started.md`; `docs/ai-run-configuration.md`; `docs/consumer-project.md` |
| Consumer guidance export/reference snapshot | `DiagnosticCli.java`; `gradle/consumer-guidance.gradle`; `scripts/sync_consumer_guidance.py`; `maven-consumer-project/AGENTS.md`; `maven-consumer-project/.github/copilot-instructions.md`; search `export-guidance`, `discover-hint`, `GUIDANCE-MANIFEST.json`, `.pickleball/investigations` | `PickleballGuidanceChecks.java`; consumer guidance contract checks | `docs/consumer-agent-guide.md`; `docs/consumer-project.md` |
| Consumer AI-agent pointer-eval harness | `maven-consumer-project/src/test/resources/features/agent-pointer-eval.feature`; tag `@agent-pointer-eval` (optional `@agent-pointer-eval-pass` / `@agent-pointer-eval-fail`) | opt-in mixed pass/fail; must not carry `@all`, `@regression`, or other Maven suite-profile tags; `scripts/verify_agent_contract.py` | `docs/consumer-agent-guide.md` |
| Diagnostic reporting and controlled reruns | `src/main/java/tools/dscode/common/reporting/diagnostic`; `InvestigationHandoff`; diagnostic aspects; `DiagnosticCli.java`; `emit-investigation`; `VisualFingerprintComparator.java`; `DiagnosticRunComparator.java` | `DiagnosticReportingChecks.java`; `Diagnostic213CompletionChecks.java`; `InvestigationHandoffChecks.java`; diagnostic features | `docs/diagnostic-reporting.md`; `docs/ai-diagnostic-reporting-plan.md`; `docs/ai-run-configuration.md`; root `AGENTS.md` |
| Diagnostic reporting and controlled reruns | `src/main/java/tools/dscode/common/reporting/diagnostic`; `InvestigationHandoff`; diagnostic aspects; `DiagnosticCli.java`; `emit-investigation`; `VisualFingerprintComparator.java`; `DiagnosticRunComparator.java`; catalog/summary `runProfile` | `DiagnosticReportingChecks.java`; `Diagnostic213CompletionChecks.java`; `InvestigationHandoffChecks.java`; diagnostic features | `docs/diagnostic-reporting.md`; `docs/ai-diagnostic-reporting-plan.md`; `docs/ai-run-configuration.md`; root `AGENTS.md` |
| Nested steps/block conditionals | search `Nested`, `Conditional`, `Block`, `Condition` in core implementation | `nested-and-block-conditionals.feature` | `docs/nested-steps.md`; `docs/block-conditionals.md` |
| Component scenarios/reusable RUN/selectors/markers | `ModularScenarios.java`; `ScenarioStep.java`; `ScenarioStepData.java`; `StepBase.java`; `StepExtension.java`; `CurrentScenarioState.java`; `CucumberScanUtil.java`; search `finalizerSteps`, `RunSelection` | `component-scenarios.feature`; `reusable-scenario-selection.feature`; `run-step-parameter-variations.feature`; marker features | `docs/component-scenarios.md`; `docs/service-call-scenarios.md`; `docs/data-values-and-elements.md` |
| Service-call definitions/execution | `ServiceCallSteps.java`; `ModularScenarios.java`; `StepExtension.java`; `CurrentScenarioState.java`; `RestAssuredUtil.java`; mapping classes; `maven-consumer-project/src/test/resources/calls` | `service-call-execution.feature`; `run-step-parameter-variations.feature`; reusable selection/parameter features; local server support | `docs/service-call-scenarios.md`; `docs/component-scenarios.md`; `docs/mapping-and-templating.md` |
Expand Down
5 changes: 5 additions & 0 deletions docs/agent/repository-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,7 @@ This inventory helps coding agents discover relevant files. It does not replace
- `src/main/java/tools/dscode/cucumberextended/utilities/StringUtilities.java`
- `src/main/java/tools/dscode/launcher/PickleballWorkbenchLauncher.java`
- `src/main/java/tools/dscode/misc/DummySteps.java`
- `src/main/java/tools/dscode/parallelutilities/ParallelCountEstimator.java`
- `src/main/java/tools/dscode/parallelutilities/Stagger.java`
- `src/main/java/tools/dscode/pickleruntime/CucumberOptionResolver.java`
- `src/main/java/tools/dscode/registry/GlobalRegistry.java`
Expand All @@ -382,13 +383,15 @@ This inventory helps coding agents discover relevant files. It does not replace
- `src/main/java/tools/dscode/testengine/PkbPropertyValueNormalizer.java`
- `src/main/java/tools/dscode/testengine/SensitiveConfiguration.java`
- `src/main/java/tools/dscode/testengine/WorkbenchWorkerMain.java`
- `src/main/resources/META-INF/pickleball/configs/CHROME_HEADLESS.yaml`
- `src/main/resources/META-INF/services/org.junit.platform.engine.TestEngine`
- `src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener`

## Framework tests

- `src/test/java/tools/dscode/control/override/StepOverrideCompilerTest.java`
- `src/test/java/tools/dscode/launcher/PickleballWorkbenchLauncherTest.java`
- `src/test/java/tools/dscode/parallelutilities/ParallelCountEstimatorTest.java`
- `src/test/java/tools/dscode/testengine/DynamicSuiteBootstrapWorkbenchRootTest.java`

## Control API module
Expand Down Expand Up @@ -589,6 +592,7 @@ This inventory helps coding agents discover relevant files. It does not replace
- `maven-consumer-project/src/test/java/tools/dscode/common/dataelements/DataElementPhaseOneChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/dataelements/DataElementPhaseThreeChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/dataelements/DataElementPhaseTwoChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/driver/ChromeHeadlessConfigChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/mappings/MappingDataRefactorChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/mappings/QuoteParserChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/common/reporting/diagnostic/Diagnostic213CompletionChecks.java`
Expand All @@ -599,6 +603,7 @@ This inventory helps coding agents discover relevant files. It does not replace
- `maven-consumer-project/src/test/java/tools/dscode/common/util/datetime/BusinessTimePostModifierChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/coredefinitions/DataTableConversionChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/coredefinitions/ModularScenariosChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/parallelutilities/ParallelCountEstimatorChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/testengine/PkbPropertyValueNormalizerChecks.java`
- `maven-consumer-project/src/test/java/tools/dscode/testengine/ProfileConfigurationChecks.java`

Expand Down
22 changes: 20 additions & 2 deletions docs/ai-run-configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -243,10 +243,10 @@ Example compact rerun:
-Dpkb_changed_variables=pkb_browser
```

For an agent's bounded confirmation `mvn test` (not `PickleballTests` human defaults of `pretty` / `@all`), include diagnostic evidence controls and keep selection narrow:
For an agent's bounded confirmation `mvn test` (not `PickleballTests` human defaults of `pretty` / `@all`), include diagnostic evidence controls, headless Chrome, and high parallelism when more than one scenario will run:

```text
-Dpkb_runvars="pkb_tags=@the-failing-tag, pkb_name=The failing scenario, pkb_browser=CHROME_HEADLESS, pkb_reportingmode=diagnostic, pkb_loglevel=warn, pkb_reportretention=failed"
-Dpkb_runvars="pkb_tags=@the-failing-tag, pkb_name=The failing scenario, pkb_browser=CHROME_HEADLESS, pkb_parallel=auto, pkb_reportingmode=diagnostic, pkb_loglevel=warn, pkb_reportretention=failed"
```

Lineage metadata is not execution configuration:
Expand Down Expand Up @@ -320,3 +320,21 @@ When operating in a consumer project:
- never expose protected values;
- keep diagnostic lineage outside the RunVar set;
- prefer the retained run profile over manually reconstructing configuration from many source layers.

## AI agents

Set a **complete** Discover `pkb_runvars` rather than a partial overlay:

```text
pkb_browser=CHROME_HEADLESS
pkb_parallel=<conservative JVM estimate or auto>
pkb_reportingmode=diagnostic
pkb_loglevel=warn
pkb_reportretention=failed
```

plus the narrowest useful `pkb_tags` / `pkb_name`. `DiagnosticCli discover-hint` prints the estimated integer parallel count for the current JVM. Multi-scenario Discover/Confirm must use headless Chrome and high parallelism. Isolate / live Workbench stays one paused scenario.

After the run, inspect `pkb_run_profile` from `run-catalog.json`, `run-index.json`, or `summary.json`. That output is the complete resolved RunVar list after inheritance (glue/features/data/call/component/configpath) and after `pkb_parallel=auto` is stamped as an integer. Do not assume omitted `pkb_runvars` keys equal project `pickleball.properties` — optional keys such as headed Chrome, `pretty`, and `pkb_tags=@all` do not leak into a controlled run, which is why agents must set the Discover keys explicitly.

Never supply `pkb_run_profile` as input. Workbench MCP `workbench_diagnostic_catalog`, `workbench_diagnostic_run`, and `workbench_diagnostic_summary` return the same retained `runProfile` when present. The consumer worker resolves the same snapshot internally through `PickleballRunner`; it does not accept `pkb_run_profile` as input.
4 changes: 4 additions & 0 deletions docs/config-files-and-resource-mapping.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,10 @@ run: pkb_runvars=pkb_configpath=,pkb_browser=firefox

The controlled run uses the default `configs` resource root because the blank value intentionally suppresses the project path.

## Bundled browser configs

Named browser yaml files under the configured config path remain the local override, including headed `CHROME.yaml`. When `CHROME_HEADLESS` is absent from that mapping, Pickleball fills it from the JAR resource `META-INF/pickleball/configs/CHROME_HEADLESS.yaml` so agents can set `pkb_browser=CHROME_HEADLESS` without copying yaml. See [Execution Configuration](configuration.md).

## Initialization order

Run configuration is resolved before the final config source is bound:
Expand Down
27 changes: 25 additions & 2 deletions docs/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,12 +329,12 @@ The existing path semantics for `pkb_features`, `pkb_datapath`, `pkb_callpath`,
| `pkb_tags` | `@smoke and not @slow` | Cucumber tag expression |
| `pkb_name` | `Checkout.*` | scenario-name expression |
| `pkb_environment` | `QA` | project environment label |
| `pkb_browser` | `chrome` | browser configuration |
| `pkb_browser` | `chrome` | browser configuration name looked up under the `configs` mapping (`CHROME_HEADLESS` uses the consumer yaml when present, otherwise Pickleball's bundled headless Chrome) |
| `pkb_profile` | `qa,browser_firefox` | selected named profile(s) |
| `pkb_runvars` | `pkb_tags=@smoke, pkb_browser=chrome` | compact controlled RunVar input |
| `pkb_runvars.<pkb_var>` | `pkb_runvars.pkb_browser=chrome` | expanded controlled RunVar member |
| `pkb_run_profile` | generated assignment string | canonical resolved RunVar output; external input rejected |
| `pkb_parallel` | `4` | parallel scenario count |
| `pkb_parallel` | `4`, `auto` | parallel scenario count; `auto` resolves at run start to a conservative JVM estimate and stamps the integer into `pkb_run_profile` |
| `pkb_loglevel` | `debug` | console log level |
| `pkb_reportingmode` | `diagnostic` | diagnostic evidence pipeline |
| `pkb_reportretention` | `all`, `failed`, `none` | automatic evidence/report retention |
Expand All @@ -344,6 +344,29 @@ The existing path semantics for `pkb_features`, `pkb_datapath`, `pkb_callpath`,

Other existing `pkb_*` RunVars retain their previous behavior unless specifically documented otherwise.

## Conservative `pkb_parallel`

`pkb_parallel` is an explicit positive integer unless the value is `auto`.

`auto` is resolved at run start from JVM-visible resources only (`Runtime.availableProcessors()` and `Runtime.maxMemory()`). No OS-specific native calls. The conservative estimate is:

```text
max(2, min(availableProcessors, floor(maxMemoryMB / 512), 24))
```

Chrome workers are RAM-heavy, so a 32-core / 64GiB box does not blindly pick 32 workers; the hard cap is 24, and heap can cap lower. Tiny heaps resolve to 2. An explicit numeric `pkb_parallel` is never overwritten. Omitting `pkb_parallel` does not enable parallel execution.

The resolved integer is stamped into the final RunVars and `pkb_run_profile`. `DiagnosticCli discover-hint` prints that estimated number in the recommended Discover `pkb_runvars` command.

## Bundled `CHROME_HEADLESS`

`pkb_browser` names a configuration object under the loaded `configs` mapping. Resolution for `CHROME_HEADLESS`:

1. If the consumer `pkb_configpath` / configs mapping already contains `CHROME_HEADLESS` (or a case-insensitive named browser yaml such as `CHROME_HEADLESS.yaml`), that local override wins, including headed chrome.yaml-style configs.
2. Otherwise Pickleball injects a framework-bundled `CHROME_HEADLESS` resource from `META-INF/pickleball/configs/CHROME_HEADLESS.yaml` inside the Pickleball JAR.

The bundled headless config uses `--headless=new`, a fixed `--window-size=1920,1080`, no `MAXIMIZE`, and `QUIT_LOCAL_DRIVER`. Consumer `CHROME`, `EDGE`, `GRID`, and `SAUCE` yaml files are unchanged. Agents can set `pkb_browser=CHROME_HEADLESS` without copying yaml into the project.

## Cucumber aliases

Pickleball synchronizes its main selection aliases with Cucumber properties, including:
Expand Down
Loading
Loading