@groupby/ai-dev 0.5.13 → 0.5.14

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.
@@ -0,0 +1,127 @@
1
+ # Code Review Checklist - fhr-apache-hop
2
+
3
+ This file owns review criteria. It operationalizes `.ai/coding-guidelines.md`,
4
+ `.ai/architecture.md`, and the relevant module `CLAUDE.md`.
5
+
6
+ ---
7
+
8
+ ## Severity
9
+
10
+ - **BLOCK** - must be fixed before merge; violates safety, architecture, or hard repository
11
+ rules.
12
+ - **WARN** - should be fixed; convention drift or maintainability risk.
13
+ - **NOTE** - optional suggestion or observation.
14
+
15
+ Every finding should include severity, location, impact, and a concise recommendation.
16
+
17
+ ---
18
+
19
+ ## Universal BLOCK Checks
20
+
21
+ - Secrets, credentials, environment-specific URLs, or local paths are committed.
22
+ - Existing Flyway migrations are modified.
23
+ - New dependencies, frameworks, modules, or infrastructure scope appear without approval.
24
+ - Placeholders, `TODO`, `FIXME`, or commented-out code remain.
25
+ - Tests are missing for new or changed behaviour.
26
+ - Code contradicts documented architecture for the target module.
27
+ - Error handling hides failures or creates silent data loss.
28
+ - Security or authorization checks are bypassed.
29
+
30
+ ---
31
+
32
+ ## Universal WARN Checks
33
+
34
+ - Code does not match local naming, formatting, or structure conventions.
35
+ - Duplicated logic or literals that should be extracted or reused.
36
+ - Comments explain obvious code instead of non-obvious constraints.
37
+ - Public contracts changed without updating consumers or documenting impact.
38
+ - Build, test, or verification evidence is missing.
39
+ - New code is broader than the task scope.
40
+ - `split()` with magic numeric indices used instead of constants, regex, or `pathlib`.
41
+ - Unused imports, dead methods, or unreachable branches left after refactoring.
42
+
43
+ ---
44
+
45
+ ## Java Review Checks
46
+
47
+ - Lombok is used for boilerplate; no manually written getters, setters, or constructors.
48
+ **BLOCK** if absent.
49
+ - Spring beans use constructor injection (`@RequiredArgsConstructor`). **BLOCK** if
50
+ `@Autowired` field injection is used.
51
+ - Logging uses `@Slf4j` and `log.*`; no `System.out.println`. **BLOCK** if violated.
52
+ - Domain exceptions and centralized HTTP error mapping used where appropriate.
53
+ - Database integration tests use real Testcontainers, not in-memory substitutes. **BLOCK** if
54
+ violated.
55
+
56
+ ### data-quality (reactive)
57
+
58
+ - All service and repository methods return `Mono<T>` or `Flux<T>`. **BLOCK** if synchronous
59
+ return types are introduced.
60
+ - No `.block()` calls anywhere in production or test code. **BLOCK**.
61
+ - Reactive tests use `StepVerifier`. **BLOCK** if `.block()` is used in tests instead.
62
+
63
+ ### hop-dev-platform (synchronous)
64
+
65
+ - No `Mono`, `Flux`, or WebFlux patterns introduced. **BLOCK** if reactive types appear in
66
+ production code.
67
+
68
+ ### fhr-custom-transforms (Hop plugins)
69
+
70
+ - Every new transform has both a `Meta` class and a `Data` class. **BLOCK** if either is
71
+ missing.
72
+ - `Meta` class is annotated with `@Transform(...)`. **BLOCK** if annotation is absent.
73
+ - Dialog/UI code uses SWT only; no Swing or JavaFX. **BLOCK** if violated.
74
+ - No SWT display-dependent code outside dialog classes (breaks headless CI). **BLOCK**.
75
+
76
+ ---
77
+
78
+ ## Python Review Checks
79
+
80
+ - Function signatures are typed. **WARN** if absent.
81
+ - Scripts use `logger_config.py` for logging; no `print()` in production code. **BLOCK**.
82
+ - Scripts use `arg_utils.py` for argument parsing; no raw `argparse` or `sys.argv`. **BLOCK**.
83
+ - Fatal errors are logged with context (`exc_info=True`) and exit non-zero.
84
+ - No bare `except:` — specific exceptions only. **BLOCK**.
85
+ - External systems (S3, Kafka, Kubernetes, PostgreSQL) are mocked in unit tests.
86
+ - New scripts follow the mandatory structure: imports → logger → constants → helpers →
87
+ `main()` → `if __name__ == "__main__"`.
88
+
89
+ ---
90
+
91
+ ## Angular Review Checks
92
+
93
+ - UI components use PrimeNG only; no other UI libraries. **BLOCK**.
94
+ - HTTP calls are kept in services; `HttpClient` never called directly in components. **BLOCK**.
95
+ - Observable subscriptions include cleanup (`takeUntilDestroyed` or `async` pipe). **BLOCK**
96
+ if a `.subscribe()` call has no cleanup.
97
+ - API responses have reusable typed interfaces; `any` is avoided.
98
+ - Component and service specs cover changed behaviour.
99
+
100
+ ---
101
+
102
+ ## Database and Migration Checks
103
+
104
+ - Schema changes are represented by new migrations only; existing migrations are untouched.
105
+ - Migration names follow the Flyway convention (`V<major>_<minor>__<description>.sql`) with a
106
+ sequential version number — inspect existing migrations before choosing the next number.
107
+ - Persistence model changes and API contracts stay aligned.
108
+ - Migrations are backward-compatible where practical.
109
+
110
+ ---
111
+
112
+ ## Cross-Module Impact Checks
113
+
114
+ Flag when a change affects:
115
+
116
+ - backend API consumers;
117
+ - workflow step inputs, outputs, or environment contracts;
118
+ - frontend API models;
119
+ - database schema used outside one module;
120
+ - infrastructure or workflow definitions outside this repo.
121
+
122
+ When the `data-quality` REST API contract changes (endpoint paths, request or response fields),
123
+ explicitly check whether `dq_execution.py`, `dq_custom_checks.py`, and `populate_dashboard.py`
124
+ in `workflow-scripts` need to be updated in the same PR.
125
+
126
+ Do not require same-PR fixes for every impact, but require the impact to be explicit and
127
+ tracked.
@@ -0,0 +1,139 @@
1
+ # Coding Guidelines - fhr-apache-hop
2
+
3
+ This file owns implementation conventions. It should define stable coding rules, not
4
+ architecture, workflow process, or module inventories.
5
+
6
+ ---
7
+
8
+ ## 1. How to Apply These Guidelines
9
+
10
+ Apply rules in this order:
11
+
12
+ 1. Safety and workflow rules in `.ai/ai-instructions.md`.
13
+ 2. Architecture and module ownership from `.ai/architecture.md` and module-level `CLAUDE.md` files.
14
+ 3. Existing local patterns in the target module.
15
+ 4. Language and framework conventions in this file.
16
+ 5. General clean-code judgement.
17
+
18
+ If local code conflicts with this file, follow the local pattern and mention the conflict in the
19
+ review note.
20
+
21
+ ---
22
+
23
+ ## 2. Repository-Wide Hard Rules
24
+
25
+ - Do not introduce dependencies, frameworks, tools, or modules without explicit approval.
26
+ - Do not hardcode secrets, credentials, connection strings, customer-specific URLs, or local
27
+ paths.
28
+ - Do not leave `TODO`, `FIXME`, placeholder comments, or commented-out code.
29
+ - Match existing naming, formatting, structure, and test style in the target module.
30
+ - Generate tests for new or changed behaviour.
31
+ - Prefer small, focused changes over broad rewrites.
32
+ - Fail fast with clear, specific errors when required input or configuration is missing.
33
+ - Avoid duplication; before writing new code check whether the logic already exists somewhere
34
+ it logically belongs, and extend or reuse it.
35
+ - Use constants for repeated string literals and magic values; never use `split()` with magic
36
+ numeric indices — use named regex groups, string templates, or `pathlib` so the structure is
37
+ readable and resilient.
38
+ - Comments explain only the non-obvious *why* — a hidden constraint, a workaround, or a
39
+ non-obvious invariant. Never comment what the code already says.
40
+ - After removing or moving code, remove unused imports, dead methods, unreachable branches, and
41
+ tests that no longer cover live behaviour.
42
+
43
+ ---
44
+
45
+ ## 3. Module Decision Table
46
+
47
+ | Module | Must do | Must not do |
48
+ |---|---|---|
49
+ | `data-quality` (reactive) | Stay non-blocking; compose reactive flows; test with `StepVerifier` | Call `.block()`; introduce synchronous persistence |
50
+ | `hop-dev-platform` (synchronous) | Use normal MVC/service/repository flow | Introduce `Mono`, `Flux`, or WebFlux patterns |
51
+ | `fhr-custom-transforms` (Hop plugins) | Follow existing Hop plugin lifecycle and metadata patterns | Treat plugins like Spring services |
52
+ | `workflow-scripts` (Python) | Keep scripts typed, logged, env-driven, and single-purpose | Use production `print()`, bare exceptions, or direct argument parsing |
53
+ | `hop-dev-platform-frontend`, `data-quality-frontend` (Angular) | Typed models, services for HTTP, PrimeNG UI, safe subscription cleanup | Call HTTP directly in components; introduce other UI libraries |
54
+
55
+ ---
56
+
57
+ ## 4. Java Guidelines
58
+
59
+ - Use Lombok for boilerplate in DTOs, entities, configuration objects, and Spring beans. Do not
60
+ manually write getters, setters, constructors, or equality methods.
61
+ - Use constructor injection for Spring beans (`@RequiredArgsConstructor`).
62
+ - Use structured logging (`@Slf4j` and `log.*`); never print to stdout.
63
+ - Keep validation at boundaries and throw meaningful domain exceptions.
64
+ - Keep mapping, persistence, transport, and business logic separated.
65
+ - Put transactions at the service boundary in synchronous persistence modules.
66
+ - For reactive modules, return reactive types from service and repository flows and never block.
67
+ - Java package roots: `com.fredhopper.*` for plugin and HDSys code; `com.data_quality.*` for
68
+ DQSys code.
69
+
70
+ ### Java Tests
71
+
72
+ - Unit tests: JUnit 5 with `@ExtendWith(MockitoExtension.class)`.
73
+ - Integration tests: Spock/Groovy in `src/integration-test/groovy/`.
74
+ - Database integration tests: Testcontainers (real PostgreSQL containers, never in-memory
75
+ substitutes).
76
+ - Reactive tests: `StepVerifier` — never `.block()` in test assertions.
77
+
78
+ ---
79
+
80
+ ## 5. Python Guidelines
81
+
82
+ - Follow PEP 8 and annotate all function signatures with types.
83
+ - Keep scripts single-purpose and structured consistently: imports → logger → constants →
84
+ helpers → `main()` → `if __name__ == "__main__"`.
85
+ - Use `logger_config.py` for logging; never use production `print()`.
86
+ - Use `arg_utils.py` for argument parsing; never parse raw command-line arguments directly.
87
+ - Read configuration from environment variables with sensible defaults; required variables must
88
+ fail fast with a clear error naming the missing variable.
89
+ - Catch specific exceptions, log with exception context (`exc_info=True`), and exit non-zero on
90
+ fatal workflow-step errors.
91
+ - Unit tests live in `src/test/python/test_<script_name>.py`; mock all external systems
92
+ (S3, Kafka, Kubernetes, PostgreSQL).
93
+
94
+ ---
95
+
96
+ ## 6. Angular Guidelines
97
+
98
+ - Use standalone components unless existing local code requires otherwise.
99
+ - Use PrimeNG only for UI components.
100
+ - One component per file; follow Angular naming conventions.
101
+ - Keep HTTP calls in services, never directly in components.
102
+ - Prefer `async` pipe for rendered observable state.
103
+ - Use manual subscriptions only for imperative side effects and always clean them up
104
+ (e.g. `takeUntilDestroyed`).
105
+ - Define reusable interfaces for API responses; avoid `any`.
106
+ - Component and service specs live alongside the source file.
107
+
108
+ ---
109
+
110
+ ## 7. Database Guidelines
111
+
112
+ - Schema changes require new migrations; never modify existing migrations.
113
+ - Inspect current migrations before choosing a new migration name.
114
+ - Keep migrations backward-compatible where practical.
115
+ - Keep persistence models, migration changes, and API contracts aligned.
116
+
117
+ ---
118
+
119
+ ## 8. Docker Guidelines
120
+
121
+ - Use minimal images and multi-stage builds where useful.
122
+ - Copy only required files; avoid broad context copies.
123
+ - Do not bake secrets, local paths, or environment-specific values into images.
124
+ - Match existing image naming and registry conventions.
125
+
126
+ ---
127
+
128
+ ## 9. Final Code Cleanup Checklist
129
+
130
+ Before finishing any code change:
131
+
132
+ - No unused imports.
133
+ - No dead code or unreachable branches.
134
+ - No placeholder comments or commented-out code.
135
+ - No duplicated literals that should be constants.
136
+ - No `split()` with magic array indices.
137
+ - No direct logging or printing violations.
138
+ - No new unapproved dependencies.
139
+ - Tests cover changed behaviour and relevant error paths.
@@ -0,0 +1,125 @@
1
+ # Domain Context - fhr-apache-hop
2
+
3
+ This file owns business terminology and domain concepts. It should explain what the system means,
4
+ not how the code is structured.
5
+
6
+ ---
7
+
8
+ ## Fredhopper Context
9
+
10
+ Fredhopper powers product discovery for e-commerce, including search, navigation,
11
+ personalisation, recommendations, and catalogue indexing.
12
+
13
+ ETL 2.0 is the data pipeline platform that prepares customer catalogue data for Fredhopper
14
+ services. It replaces legacy ETL processes with a Kubernetes-native, event-driven model.
15
+
16
+ ---
17
+
18
+ ## ETL 2.0
19
+
20
+ ETL 2.0 processes customer catalogue data through extraction, transformation, quality checks,
21
+ and publication. It is designed around:
22
+
23
+ - Ephemeral runtime execution instead of long-lived per-customer process servers.
24
+ - Shared standard platform code with customer-specific configuration and customisation.
25
+ - Event-driven or scheduled execution.
26
+ - Observability and data-quality reporting as first-class outputs.
27
+
28
+ ---
29
+
30
+ ## Core Systems
31
+
32
+ ### HDSys
33
+
34
+ HDSys is the Hop Development System. It gives consultants browser-based workspaces for
35
+ developing, testing, and managing customer ETL customisations.
36
+
37
+ Key concepts:
38
+
39
+ - Workspace: an isolated browser-based ETL development environment.
40
+ - Standard package: shared ETL logic available to all customers.
41
+ - Customer customisation: customer-specific ETL changes managed through GitOps in `custom-etl`.
42
+ - Workspace lifecycle: creation, use, expiry, and cleanup of development environments.
43
+
44
+ ### DQSys
45
+
46
+ DQSys is the Data Quality System. It stores and presents quality and operational signals from
47
+ ETL runs.
48
+
49
+ Key concepts:
50
+
51
+ - DQ check: a SQL validation rule applied to ETL output in the ETL database.
52
+ - DQ report: the results of one or more checks for an ETL run.
53
+ - ETL Dashboard: operational view of run status, timing, input type, and log links.
54
+ - Accumulated reporting: quality history across incremental and repeated runs.
55
+
56
+ ---
57
+
58
+ ## ETL Run Lifecycle
59
+
60
+ 1. A customer catalogue change or schedule places a `trigger.json` file in S3.
61
+ 2. An Argo event sensor detects the file and submits an Argo workflow.
62
+ 3. Runtime context is prepared: input data is extracted, job configuration is assembled.
63
+ 4. ETL packages (standard + customer-specific) are deployed onto a PVC.
64
+ 5. Hop server runs the data transformation and writes results to the ETL database.
65
+ 6. FAS XML files are generated from the transformation output.
66
+ 7. Outputs and logs are published to S3; status signals are sent to Kafka.
67
+ 8. DQ checks run against the ETL database output; results are written to DQSys.
68
+ 9. ETL Dashboard data is populated in DQSys.
69
+ 10. FAS loads the XML files (reindex), then signals completion via Kafka to DQSys.
70
+
71
+ ---
72
+
73
+ ## Hop Project Names
74
+
75
+ The `hop_project_name` identifies the specific ETL pipeline to run. It is derived from
76
+ `service_type` and the input format by `extract_and_dispatch.py`:
77
+
78
+ | hop_project_name | service_type | Description |
79
+ |---|---|---|
80
+ | `load-data-file` | fas | Full run, batch ZIP input |
81
+ | `load-data-stream` | fas | Full run, streaming (CIDP) input |
82
+ | `load-data-file-incremental` | fas | Incremental run, batch ZIP |
83
+ | `load-data-stream-incremental` | fas | Incremental run, streaming |
84
+ | `xml-writer` | fas | XML generation phase (derived from full runs) |
85
+ | `xml-writer-incremental` | fas | Incremental XML generation |
86
+ | `hop-generate` | suggest | Suggestion index generation |
87
+ | `hop-finalize` | upload | Upload finalisation |
88
+
89
+ The XML phase projects are never triggered directly; they are derived from the data-phase project
90
+ name by `initialize_job.py`. Suggest and upload service types do not have an XML phase.
91
+
92
+ ---
93
+
94
+ ## Domain Terms
95
+
96
+ | Term | Meaning |
97
+ |---|---|
98
+ | Customer | Fredhopper client whose catalogue is processed |
99
+ | Instance | Environment or deployment context for a customer (e.g. `fas:live1`) |
100
+ | Service type | Top-level ETL variant: `fas`, `suggest`, or `upload` |
101
+ | Instance name | The environment part of the instance field (e.g. `live1` from `fas:live1`) |
102
+ | Catalogue | Product data provided by a customer |
103
+ | FAS | Fredhopper Asset Search, the core search and indexing service |
104
+ | FAS XML | XML output format consumed by FAS |
105
+ | Reindex | The process by which FAS loads and indexes the XML files produced by an ETL run |
106
+ | Full ETL | Run that processes the complete catalogue |
107
+ | Incremental ETL | Run that processes only changes since the last full run |
108
+ | Trigger ID | Stable identifier for a single ETL run; derived from `trigger.json` or the workflow timestamp; used as the primary key across DQ tables |
109
+ | Data ID | The trigger folder identifier (catalogue ID), as extracted from the S3 key |
110
+ | CIDP | Customer Integration Data Platform; the streaming input path (`load-data-stream`) |
111
+ | Argo | Workflow orchestration layer used by ETL 2.0 |
112
+ | Hop | Apache Hop runtime used for ETL transformation |
113
+ | Suggest | Search suggestion/typeahead data flow |
114
+ | Smart Suggest | Newer suggestion implementation |
115
+ | GitOps | Branch, pull request, and merge workflow for ETL customisations in `custom-etl` |
116
+ | TC/DC | Consultant roles that use HDSys for customer delivery |
117
+ | hop_job_config | The central per-run JSON contract produced by `initialize_job.py` and consumed by all downstream workflow steps |
118
+
119
+ ---
120
+
121
+ ## Guidance for AI Agents
122
+
123
+ Use this file to understand vocabulary and business intent. For module ownership and system
124
+ structure, use `.ai/architecture.md`. For coding rules, use `.ai/coding-guidelines.md`. For
125
+ workflow rules, use `.ai/ai-instructions.md`.
@@ -0,0 +1,55 @@
1
+ # Jira Ticket Template — ETL 2.0 AI-First Development
2
+
3
+ Paste the block below into the Jira ticket description. Fill in every section.
4
+ Hand the ticket URL (or paste the description) directly to the agent — it will read the harness and start.
5
+
6
+ ---
7
+
8
+ ---
9
+
10
+ ## Ticket
11
+
12
+ **Module**: `data-quality` | `hop-dev-platform` | `workflow-scripts` | `frontend` | `data-quality-frontend` | `fhr-custom-transforms`
13
+ **Agent**: *(from the module `CLAUDE.md` header — e.g. `Java Dev - data-quality`)*
14
+ **Cross-repo**: No | Yes — andromeda-argo-deployments also changes
15
+
16
+ ---
17
+
18
+ ## What to Build
19
+
20
+ *2–4 sentences. What the feature does and why it is needed. No implementation detail — just the goal.*
21
+
22
+ ---
23
+
24
+ ## Requirements
25
+
26
+ *Each line is one concrete behaviour. Use Given / When / Then. Be exact: field names, endpoint paths, status codes, env var names.*
27
+
28
+ - Given …, when …, then …
29
+ - Given …, when …, then …
30
+ - Given …, when …, then *(edge case / error path)*
31
+
32
+ ---
33
+
34
+ ## Do Not Touch
35
+
36
+ *Explicitly name files, classes, endpoints, or areas the agent must leave unchanged.*
37
+
38
+ - …
39
+
40
+ ---
41
+
42
+ ## Acceptance Criteria
43
+
44
+ *Verifiable by a reviewer who hasn't read the code. Tick these off before raising the PR.*
45
+
46
+ - [ ] …
47
+ - [ ] …
48
+ - [ ] All existing tests pass — no regressions.
49
+
50
+ ---
51
+
52
+ ## Extra Context
53
+
54
+ *Only fill this in if the requirement cannot be derived from the harness files.*
55
+ *Leave blank if everything the agent needs is already in `CLAUDE.md`, `architecture.md`, `coding-guidelines.md`, or the module `CLAUDE.md`.*
@@ -0,0 +1,57 @@
1
+ # CLAUDE.md - data-quality-frontend
2
+
3
+ **Agent type:** `Angular Dev - data-quality-frontend`
4
+
5
+ This file owns module-specific context for the DQSys frontend. Read it after the root harness
6
+ files. Inspect current source for exact routes, services, models, and component structure.
7
+
8
+ ---
9
+
10
+ ## What This Module Is
11
+
12
+ `data-quality-frontend` is the DQSys web UI. It presents data-quality reports and ETL Dashboard
13
+ views backed by the `data-quality` service.
14
+
15
+ It should remain a client of backend APIs and must not duplicate backend business rules.
16
+
17
+ ---
18
+
19
+ ## Architecture Constraints
20
+
21
+ - Use the module's existing Angular standalone-component pattern.
22
+ - Use PrimeNG for UI components only.
23
+ - Keep HTTP calls behind the module's existing API/service abstraction.
24
+ - Keep cross-cutting HTTP behaviour (auth headers, error handling) in the existing interceptor
25
+ pattern.
26
+ - Model API responses with typed interfaces; avoid `any`.
27
+ - Do not introduce parallel global state mechanisms when one already exists.
28
+
29
+ ---
30
+
31
+ ## Integration Boundaries
32
+
33
+ This frontend depends on the `data-quality` API contract. Any backend API change must be
34
+ reflected in models, services, and tests.
35
+
36
+ When adding views that depend on customer, instance, report, or dashboard context, inspect the
37
+ current state-management pattern before implementing new state.
38
+
39
+ ---
40
+
41
+ ## Testing Expectations
42
+
43
+ - Component and service tests use the module's existing Angular test setup (Karma/Jasmine).
44
+ - HTTP-facing tests mock backend calls through the service/API abstraction.
45
+ - Tests should cover loading, empty, error, and permission-relevant states where applicable.
46
+
47
+ ---
48
+
49
+ ## Context to Confirm When Needed
50
+
51
+ Stop and ask, or inspect current source, when a task depends on:
52
+
53
+ - exact backend API response fields;
54
+ - current runtime configuration mechanism;
55
+ - authentication/session handling;
56
+ - shared instance or report-selection state;
57
+ - route structure or navigation contracts.
@@ -0,0 +1,62 @@
1
+ # CLAUDE.md - data-quality
2
+
3
+ **Agent type:** `Java Dev - data-quality`
4
+
5
+ This file owns module-specific context for the DQSys backend. Read it after the root harness
6
+ files. Inspect current source for exact classes, fields, and paths.
7
+
8
+ ---
9
+
10
+ ## What This Module Is
11
+
12
+ `data-quality` is the DQSys backend. It receives data-quality and operational signals from ETL
13
+ workflow steps, persists report and dashboard data, and exposes APIs used by the DQSys frontend.
14
+
15
+ It is part of the reporting and control plane. It does not execute ETL transformations directly.
16
+
17
+ ---
18
+
19
+ ## Architecture Constraints
20
+
21
+ - This module is fully reactive (Spring WebFlux + R2DBC).
22
+ - No `.block()` calls anywhere — not in production code, not in tests.
23
+ - All service and repository methods must return `Mono<T>` or `Flux<T>`.
24
+ - Schema changes are managed through new Flyway migrations only; inspect existing migrations
25
+ before choosing the next version number.
26
+ - Authentication and customer scoping must not be bypassed. New endpoints must inject
27
+ `AccountContext` via `@AuthenticationPrincipal` and scope queries to the authenticated
28
+ customer.
29
+
30
+ ---
31
+
32
+ ## Integration Boundaries
33
+
34
+ This module is consumed by:
35
+
36
+ - DQSys frontend users through backend APIs.
37
+ - Workflow scripts that publish DQ and dashboard signals: `dq_execution.py`,
38
+ `dq_custom_checks.py`, and `populate_dashboard.py`.
39
+
40
+ When changing API or schema contracts, identify frontend and workflow-script impact explicitly.
41
+ See `.ai/code-review.md` for the cross-module caller checklist.
42
+
43
+ ---
44
+
45
+ ## Testing Expectations
46
+
47
+ - Unit tests: JUnit 5 with `StepVerifier` for reactive assertions; never `.block()`.
48
+ - Integration tests: Spock/Groovy in `src/integration-test/groovy/`.
49
+ - Database integration tests: real PostgreSQL via Testcontainers.
50
+ - Security and customer-scope behaviour must be tested when endpoint access changes.
51
+
52
+ ---
53
+
54
+ ## Context to Confirm When Needed
55
+
56
+ Stop and ask, or inspect current source, when a task depends on:
57
+
58
+ - exact API field names or response shapes;
59
+ - current migration state and next migration version number;
60
+ - customer/account scoping rules;
61
+ - check-template or custom-check configuration contracts;
62
+ - whether a workflow script consumes the changed contract.
@@ -0,0 +1,59 @@
1
+ # CLAUDE.md - fhr-custom-transforms
2
+
3
+ **Agent type:** `Java Dev - fhr-custom-transforms`
4
+
5
+ This file owns module-specific context for Fredhopper Apache Hop plugins. Read it after the
6
+ root harness files. Inspect current source for exact plugin names, metadata, and registration
7
+ patterns.
8
+
9
+ ---
10
+
11
+ ## What This Module Is
12
+
13
+ `fhr-custom-transforms` provides Fredhopper-specific Apache Hop transforms used by ETL
14
+ packages. The module is packaged for use by the Hop runtime.
15
+
16
+ It owns transformation behaviour, plugin metadata, and plugin-level tests. It does not own
17
+ runtime or workflow orchestration.
18
+
19
+ ---
20
+
21
+ ## Architecture Constraints
22
+
23
+ - Follow the existing Hop plugin lifecycle and base-class patterns.
24
+ - Keep configuration metadata separate from runtime processing state.
25
+ - Keep row-processing logic independent from UI/dialog code.
26
+ - Use Hop metadata APIs for row and field handling.
27
+ - Use existing factories and type abstractions instead of bypassing them.
28
+ - Dialog/UI code must use SWT only (no Swing or JavaFX) and must stay compatible with headless
29
+ test execution.
30
+
31
+ ---
32
+
33
+ ## Integration Boundaries
34
+
35
+ This module is consumed by standard ETL packages and the Hop runtime image assembly. Changes can
36
+ affect pipeline compatibility, serialized Hop metadata, and customer ETL behaviour.
37
+
38
+ When changing plugin metadata, row schema, or output shape, consider existing pipeline
39
+ definitions and downstream consumers.
40
+
41
+ ---
42
+
43
+ ## Testing Expectations
44
+
45
+ - Unit tests: JUnit 5; focus on transformation behaviour and metadata handling.
46
+ - Tests must avoid display-dependent SWT setup unless explicitly testing dialog-only code.
47
+ - Add regression tests for pipeline compatibility when changing serialized metadata or row
48
+ shape.
49
+
50
+ ---
51
+
52
+ ## Context to Confirm When Needed
53
+
54
+ Stop and ask, or inspect current source, when a task depends on:
55
+
56
+ - exact Hop annotation or registration requirements;
57
+ - serialized plugin metadata compatibility;
58
+ - supported attribute/value type semantics;
59
+ - whether a change affects packaged standard ETL definitions.
@@ -0,0 +1,60 @@
1
+ # CLAUDE.md - hop-dev-platform-frontend
2
+
3
+ **Agent type:** `Angular Dev - hop-dev-platform-frontend`
4
+
5
+ This file owns module-specific context for the HDSys frontend. Read it after the root harness
6
+ files. Inspect current source for exact routes, services, guards, models, and component
7
+ structure.
8
+
9
+ ---
10
+
11
+ ## What This Module Is
12
+
13
+ `hop-dev-platform-frontend` is the HDSys web UI. It lets consultants create and manage Hop
14
+ workspaces, provision customer data, and work through the GitOps flow for ETL customisations.
15
+
16
+ It should remain a client of `hop-dev-platform` APIs and must not duplicate backend workspace
17
+ or authorization rules.
18
+
19
+ ---
20
+
21
+ ## Architecture Constraints
22
+
23
+ - Use the module's existing standalone-component pattern.
24
+ - Use PrimeNG for UI components only.
25
+ - Keep HTTP calls in Angular services.
26
+ - Keep route protection aligned with the existing authentication guard pattern.
27
+ - Model API responses with typed interfaces; avoid `any`.
28
+ - Use the existing state-management approach instead of creating parallel state stores.
29
+ - Keep API URLs compatible with the current dev and deployment proxy approach.
30
+
31
+ ---
32
+
33
+ ## Integration Boundaries
34
+
35
+ This frontend depends on `hop-dev-platform` API, authentication, workspace lifecycle, and
36
+ GitOps contracts. Backend contract changes must be reflected in services, models, routes, and
37
+ tests.
38
+
39
+ When changing workspace or Git workflows, consider both user journey and backend authorization.
40
+
41
+ ---
42
+
43
+ ## Testing Expectations
44
+
45
+ - Component and service tests use the module's existing Angular test setup (Karma/Jasmine).
46
+ - HTTP-facing tests use request-mocking utilities.
47
+ - Tests should cover loading, empty, error, and permission-relevant states where applicable.
48
+ - Route/auth changes need guard or navigation coverage.
49
+
50
+ ---
51
+
52
+ ## Context to Confirm When Needed
53
+
54
+ Stop and ask, or inspect current source, when a task depends on:
55
+
56
+ - exact backend API response fields;
57
+ - current authentication and route-guard flow;
58
+ - workspace state-management behaviour;
59
+ - GitOps workflow states and actions;
60
+ - runtime configuration or API base-path handling.