ecoportal-api-graphql 1.3.10 → 1.3.12
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.
- checksums.yaml +4 -4
- data/.ai-assistance/code/diff_pairing_engine.md +243 -0
- data/.ai-assistance/code/filter_contract_matrix.md +177 -0
- data/.ai-assistance/code/graphql_domain_knowledge.md +20 -10
- data/.ai-assistance/code/template_diff_pairing_domain.md +175 -0
- data/.ai-assistance/code/workflow-command-guide.md +28 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/INVENTORY.md +136 -0
- data/.ai-assistance/projects/ooze-graphql-native-migration/TODO.md +6 -1
- data/.ai-assistance/projects/qa-services-delivery/DECISIONS.md +93 -0
- data/.ai-assistance/projects/qa-services-delivery/INTENT.md +76 -0
- data/.ai-assistance/projects/qa-services-delivery/PHASE3-SCOPE.md +115 -0
- data/.ai-assistance/projects/qa-services-delivery/ROADMAP.md +99 -0
- data/.ai-assistance/projects/qa-services-delivery/TODO.md +81 -0
- data/.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md +87 -0
- data/.ai-assistance/projects/template-automatic-build-maintenance/TODO.md +108 -0
- data/.ai-assistance/projects/template-diff-deploy/INTENT.md +12 -0
- data/.ai-assistance/projects/template-diff-deploy/TODO.md +9 -0
- data/.ai-assistance/projects/template-maintenance/PHASE0-FINDINGS.md +93 -0
- data/.ai-assistance/projects/template-maintenance/README.md +14 -0
- data/.ai-assistance/skills/procedural-memory/SKILL.md +319 -0
- data/.ai-assistance/standards-version.json +21 -20
- data/CHANGELOG.md +119 -0
- data/CLAUDE.md +10 -0
- data/docs/self-docs/ARCHITECTURE.md +88 -0
- data/docs/self-docs/CHANGES.jsonl +7 -0
- data/docs/self-docs/CONVENTIONS.md +74 -0
- data/docs/self-docs/INTEGRATIONS.md +63 -0
- data/docs/self-docs/OVERVIEW.md +51 -0
- data/docs/self-docs/STATUS.md +69 -0
- data/docs/self-docs/self-docs-index.json +39 -0
- data/docs/worklog.md +256 -0
- data/ecoportal-api-graphql.gemspec +1 -1
- data/lib/ecoportal/api/common/graphql/model/diffable.rb +54 -54
- data/lib/ecoportal/api/graphql/base/action.rb +43 -43
- data/lib/ecoportal/api/graphql/base/contractor_entity/member_changes.rb +67 -67
- data/lib/ecoportal/api/graphql/base/page/data_field/collection.rb +7 -0
- data/lib/ecoportal/api/graphql/base/page/data_field/contractor_entities.rb +28 -28
- data/lib/ecoportal/api/graphql/base/page/data_field/file_field.rb +25 -25
- data/lib/ecoportal/api/graphql/base/page/data_field/image_gallery.rb +24 -24
- data/lib/ecoportal/api/graphql/base/page/data_field.rb +1 -1
- data/lib/ecoportal/api/graphql/base/page/section_collection.rb +85 -79
- data/lib/ecoportal/api/graphql/base/preset_view.rb +17 -17
- data/lib/ecoportal/api/graphql/base/register.rb +18 -18
- data/lib/ecoportal/api/graphql/builder/template_builder.rb +174 -0
- data/lib/ecoportal/api/graphql/builder.rb +17 -16
- data/lib/ecoportal/api/graphql/compat/filter_translator.rb +63 -28
- data/lib/ecoportal/api/graphql/concerns/page_compat.rb +51 -51
- data/lib/ecoportal/api/graphql/concerns.rb +14 -14
- data/lib/ecoportal/api/graphql/diff/change.rb +59 -0
- data/lib/ecoportal/api/graphql/diff/command_synthesizer.rb +329 -0
- data/lib/ecoportal/api/graphql/diff/cross_object_diff.rb +165 -0
- data/lib/ecoportal/api/graphql/diff/deploy.rb +121 -0
- data/lib/ecoportal/api/graphql/diff/id_resolver.rb +64 -0
- data/lib/ecoportal/api/graphql/diff/pairing/candidate.rb +32 -0
- data/lib/ecoportal/api/graphql/diff/pairing/engine.rb +173 -0
- data/lib/ecoportal/api/graphql/diff/pairing/ledger.rb +119 -0
- data/lib/ecoportal/api/graphql/diff/pairing/signals.rb +104 -0
- data/lib/ecoportal/api/graphql/diff/strategy.rb +113 -0
- data/lib/ecoportal/api/graphql/diff/version_diff.rb +332 -0
- data/lib/ecoportal/api/graphql/diff.rb +34 -0
- data/lib/ecoportal/api/graphql/file_upload/client.rb +181 -181
- data/lib/ecoportal/api/graphql/fragment/page.rb +85 -85
- data/lib/ecoportal/api/graphql/fragment/pages/common_page_union.rb +1 -0
- data/lib/ecoportal/api/graphql/input/action/update.rb +14 -14
- data/lib/ecoportal/api/graphql/input/contractor_entity/update.rb +41 -41
- data/lib/ecoportal/api/graphql/input/location_structure/apply_commands.rb +47 -47
- data/lib/ecoportal/api/graphql/input/location_structure/draft/add_commands.rb +49 -49
- data/lib/ecoportal/api/graphql/input/location_structure/update_command.rb +27 -27
- data/lib/ecoportal/api/graphql/input/search_conf.rb +436 -367
- data/lib/ecoportal/api/graphql/input/workflow_command/add_field.rb +27 -18
- data/lib/ecoportal/api/graphql/interface/location_structure/command.rb +30 -30
- data/lib/ecoportal/api/graphql/logic/input.rb +26 -26
- data/lib/ecoportal/api/graphql/mutation/action/archive.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/action/create.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/action/update.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/contractor_entity/create.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/contractor_entity/destroy.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/contractor_entity/update.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/kickstand/fail_workflow.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/kickstand/start_workflow.rb +1 -1
- data/lib/ecoportal/api/graphql/mutation/kickstand/stop_workflow.rb +1 -1
- data/lib/ecoportal/api/graphql.rb +1 -0
- data/lib/ecoportal/api/graphql_version.rb +1 -1
- data/tests/dump_template_model.rb +90 -0
- data/tests/validate_queries.rb +31 -9
- metadata +40 -3
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: "1.0"
|
|
3
|
+
repo: "ecoportal-api-graphql"
|
|
4
|
+
doc: conventions
|
|
5
|
+
last_generated: "2026-07-06"
|
|
6
|
+
source_head: "2abd6fc"
|
|
7
|
+
review_status: draft
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Conventions -- ecoportal-api-graphql
|
|
11
|
+
|
|
12
|
+
**Source of truth:** `.rubocop.yml` (repo root) and `CLAUDE.md`. There is no `ai-discovery`
|
|
13
|
+
`conventions.md` in this repo; the below is composed from `.rubocop.yml`, `CLAUDE.md`, and observed
|
|
14
|
+
git history, not re-derived from code.
|
|
15
|
+
|
|
16
|
+
## Code style
|
|
17
|
+
|
|
18
|
+
- Indentation: 2 spaces (Ruby default; no override in `.rubocop.yml`).
|
|
19
|
+
- Quotes: not enforced -- `Style/StringLiterals` is disabled, so single and double quotes are both
|
|
20
|
+
accepted.
|
|
21
|
+
- Line length: unlimited -- `Layout/LineLength` is disabled.
|
|
22
|
+
- Frozen string literal comment: not required (`Style/FrozenStringLiteralComment` disabled).
|
|
23
|
+
- Hash alignment: table style for both colon and hash-rocket (`Layout/HashAlignment`).
|
|
24
|
+
- Dot position: trailing (`Layout/DotPosition`).
|
|
25
|
+
- Alias: prefer `alias_method` (`Style/Alias`).
|
|
26
|
+
- Notable relaxed metrics: `ClassLength` 350, `ModuleLength` 400, `MethodLength` 100,
|
|
27
|
+
`AbcSize` 30, `CyclomaticComplexity`/`PerceivedComplexity` 30, `ParameterLists` 5.
|
|
28
|
+
- Naming exceptions: camelCase method/variable names are allowed where they mirror GraphQL/Relay
|
|
29
|
+
schema fields verbatim (`Naming/MethodName` disabled; `clientMutationId` allow-listed). This is
|
|
30
|
+
intentional -- the client mirrors the schema.
|
|
31
|
+
- Rubocop compliance is required for all generated Ruby: run `bundle exec rubocop <file>` to verify.
|
|
32
|
+
|
|
33
|
+
## Branch naming
|
|
34
|
+
|
|
35
|
+
Type-prefixed, slash-separated. Observed prefixes in the branch list and history:
|
|
36
|
+
`feat/<slug>`, `fix/<slug>`, `docs/<slug>`, `chore/<slug>`, and longer-lived `feature/<slug>`
|
|
37
|
+
branches for multi-phase work. Note: `pages` is a long-running primary development branch that
|
|
38
|
+
predates the prefix convention.
|
|
39
|
+
|
|
40
|
+
## Commit message style
|
|
41
|
+
|
|
42
|
+
Conventional Commits: `type(scope): message`. Observed types include `feat`, `fix`, `docs`,
|
|
43
|
+
`chore`, and `merge`. Scopes are area-based, e.g. `feat(diff/builder):`, `docs(worklog):`,
|
|
44
|
+
`chore(release):`, `docs(template-automation):`. Release commits follow
|
|
45
|
+
`chore(release): vX.Y.Z ...`.
|
|
46
|
+
|
|
47
|
+
## Test conventions
|
|
48
|
+
|
|
49
|
+
- Runner: RSpec (`bundle exec rspec`).
|
|
50
|
+
- Placement: spec files mirror the `lib/` structure under `spec/` (e.g.
|
|
51
|
+
`spec/ecoportal/api/graphql/input/search_conf_spec.rb`).
|
|
52
|
+
- Live tests: tagged `--tag live`; `.env` is loaded via `dotenv` in `spec_helper.rb`
|
|
53
|
+
(needs `ANTHROPIC_API_KEY` for live AI tests).
|
|
54
|
+
- Manual integration scripts live under `tests/` (separate from the RSpec suite).
|
|
55
|
+
- Coverage is known to be sparse in subdirectories (see `.ai-assistance/code/spec_coverage.md`).
|
|
56
|
+
|
|
57
|
+
## Project-specific rules
|
|
58
|
+
|
|
59
|
+
From `CLAUDE.md`:
|
|
60
|
+
|
|
61
|
+
- Namespace: `Ecoportal::API::GraphQL` (capital G, Q, L); file paths use lowercase `graphql/`.
|
|
62
|
+
- File/class mirroring: file path mirrors the class namespace exactly.
|
|
63
|
+
- Code-spec docs: for every area analysed, a corresponding `.ai-assistance/code/<area>.md` should
|
|
64
|
+
exist or be created/updated.
|
|
65
|
+
- No silent breaking changes: any change to the gem's public interface must be noted in the active
|
|
66
|
+
project's DECISIONS log and confirmed with the developer. Backwards compatibility with
|
|
67
|
+
`eco-helpers` must be preserved unless explicitly broken.
|
|
68
|
+
- Gemini responses must be verified against actual code before applying.
|
|
69
|
+
- Commit authorship: developer only by default; do not add `Co-Authored-By: Claude ...` unless the
|
|
70
|
+
developer explicitly requests it.
|
|
71
|
+
- Verified Platform Knowledge: consult `.ai-assistance/code/ecoPortal_architecture/` before
|
|
72
|
+
implementing platform logic; record newly confirmed platform facts there with evidence (ADR-012).
|
|
73
|
+
- Working-tree safety: follow `.ai-assistance/conventions/code-working-tree-protocol.md` (bridge
|
|
74
|
+
LOCK, commit overlapping unstaged changes as `wip:` first) before modifying files.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: "1.0"
|
|
3
|
+
repo: "ecoportal-api-graphql"
|
|
4
|
+
doc: integrations
|
|
5
|
+
last_generated: "2026-07-06"
|
|
6
|
+
source_head: "2abd6fc"
|
|
7
|
+
review_status: draft
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Integrations -- ecoportal-api-graphql
|
|
11
|
+
|
|
12
|
+
**Purpose:** the ties this project has to other systems and repos. This is the section the central
|
|
13
|
+
hub uses to trace inter-project dependencies and surface reuse (ADR-015 Section 5).
|
|
14
|
+
|
|
15
|
+
## External services
|
|
16
|
+
|
|
17
|
+
| Service | Purpose | Notes |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| ecoPortal GraphQL API | The API this gem is a client for -- reads/writes pages, templates, location structures, contractor entities, actions, organizations. | Auth via `Common::GraphQL::AuthService` (OAuth), scoped by `org_id`; hosted per environment (e.g. live.ecoportal.com). `no_schema: true` -- no introspection. |
|
|
20
|
+
| ecoPortal REST API (v2) | Underlying REST infrastructure the GraphQL layer builds on and stays compatible with via the `Compat` layer. | Provided by the upstream `ecoportal-api-v2` gem. |
|
|
21
|
+
|
|
22
|
+
## Upstream dependencies (repos we depend on)
|
|
23
|
+
|
|
24
|
+
| Repo / package | What we use it for |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `ecoportal-api` | REST API base: auth, org context, base models, and the `Ecoportal::API::Common` namespace this gem extends. Team-managed. |
|
|
27
|
+
| `ecoportal-api-v2` | REST API v2 layer (Page, Register, etc.); required by the entry point. Team-managed. Being retired over time. |
|
|
28
|
+
| `graphlient` | Friendly GraphQL DSL/client wrapper; `Common::GraphQL::Client` inherits from `Graphlient::Client`. Active fork owned by the team (upstream: `ashkan18/graphlient`). |
|
|
29
|
+
| `graphql-client` | Low-level GraphQL HTTP + parsing, pulled in transitively via graphlient. Fork for upstream contribution only (upstream: `github-community-projects/graphql-client`); not team-maintained. |
|
|
30
|
+
| `graphql` (graphql-ruby) | Schema definition/execution engine (`rmosolgo/graphql-ruby`); external, read-only reference. Used server-side by ecoPortal; client-side usage here is indirect. |
|
|
31
|
+
|
|
32
|
+
## Downstream consumers (who depends on us)
|
|
33
|
+
|
|
34
|
+
- `eco-helpers` -- the primary consumer; an integration-script framework for the ecoPortal
|
|
35
|
+
Integrations Team. It requires this gem (`ecoportal-api-graphql ~> 1.3, >= 1.3.4`) and relies on
|
|
36
|
+
the `Compat` layer to treat `graphql` as a drop-in for the older `apiv2` interface. Backwards
|
|
37
|
+
compatibility with `eco-helpers` must be preserved unless explicitly broken.
|
|
38
|
+
- `ecoportal-qa` -- consumes the gem to verify template deploys (the "verify" step of the template
|
|
39
|
+
build-and-maintenance pipeline; a `DryRunClient` and `Publisher` were built there). The
|
|
40
|
+
template-automation project aims to tighten `ecoportal-qa` to consume the gem's page-model.
|
|
41
|
+
|
|
42
|
+
## Key package dependencies
|
|
43
|
+
|
|
44
|
+
From `ecoportal-api-graphql.gemspec` (runtime):
|
|
45
|
+
|
|
46
|
+
- `ecoportal-api` `~> 0.10, >= 0.10.16`
|
|
47
|
+
- `ecoportal-api-v2` `~> 3.3, >= 3.3.3`
|
|
48
|
+
- `graphlient` `>= 0.8.0, < 0.9`
|
|
49
|
+
|
|
50
|
+
Development: `rspec`, `rubocop` (+ `rubocop-rake`), `rake`, `pry`, `yard`, `redcarpet`.
|
|
51
|
+
Required Ruby: `>= 3.2.2`.
|
|
52
|
+
|
|
53
|
+
## Feature-request-not-rebuild note
|
|
54
|
+
|
|
55
|
+
- The template build-and-maintenance capability is developed here in the gem (mechanics: read
|
|
56
|
+
model, command vocabulary, BUILD emitter, diff, apply, pairing engine + ledger). Orchestration
|
|
57
|
+
(interactive assisted-resolution UX, session flows) belongs in `eco-helpers`, and verification in
|
|
58
|
+
`ecoportal-qa`. Before building template/diff/deploy mechanics elsewhere, raise a feature request
|
|
59
|
+
against this gem rather than duplicating the emission layer.
|
|
60
|
+
- The active template automation is a concrete consumer of the ep-ai-standards
|
|
61
|
+
`security/ai-service-account-scope` standard: it must authenticate as a dedicated per-org SERVICE
|
|
62
|
+
ACCOUNT scoped to templates/org-config only, with page records (customer data + PII) structurally
|
|
63
|
+
out of scope by credential grant. See `.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md`.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: "1.0"
|
|
3
|
+
repo: "ecoportal-api-graphql"
|
|
4
|
+
doc: overview
|
|
5
|
+
last_generated: "2026-07-06"
|
|
6
|
+
source_head: "2abd6fc"
|
|
7
|
+
review_status: draft # draft | reviewed (only a human sets 'reviewed')
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Overview -- ecoportal-api-graphql
|
|
11
|
+
|
|
12
|
+
## What this project is
|
|
13
|
+
|
|
14
|
+
`ecoportal-api-graphql` is a Ruby gem that provides a GraphQL client layer for the ecoPortal
|
|
15
|
+
GraphQL API. It wraps `graphlient` (which itself wraps `graphql-client`) and builds a structured
|
|
16
|
+
layer of models, queries, mutations, fragments, inputs, payloads, and builders on top of it. It
|
|
17
|
+
sits between the upstream ecoPortal REST API gems and downstream consumer code, exposing a
|
|
18
|
+
developer-facing facade for reading and writing ecoPortal domain objects (pages, templates,
|
|
19
|
+
location structures, contractor entities, actions, and organizations).
|
|
20
|
+
|
|
21
|
+
## Who it serves
|
|
22
|
+
|
|
23
|
+
Team members -- specifically the ecoPortal Integrations Team and internal script authors. The gem
|
|
24
|
+
is a developer-facing library, not a customer-facing product; its primary consumer is the
|
|
25
|
+
`eco-helpers` integration-script framework. Because it can read and write live customer data
|
|
26
|
+
(page records) through the API, AI caution levels are elevated: the active template-automation
|
|
27
|
+
work is deliberately scoped to a service account covering templates/org-config only, keeping page
|
|
28
|
+
records (customer data + PII) structurally out of scope.
|
|
29
|
+
|
|
30
|
+
## Current priority
|
|
31
|
+
|
|
32
|
+
Template Automatic Build and Maintenance (the #1-priority project). This merges the former
|
|
33
|
+
`template-diff-deploy` and `template-maintenance` efforts into one lifecycle: build/maintain 300+
|
|
34
|
+
templates programmatically (a CSV-to-templates pipeline, deadline approximately September 2026)
|
|
35
|
+
and make UAT-to-PROD change replication smooth via a diff/pairing/deploy/verify pipeline. Both
|
|
36
|
+
halves share one emission layer (an ordered `WorkflowCommand` batch with `placeholderId`
|
|
37
|
+
threading).
|
|
38
|
+
|
|
39
|
+
## At a glance
|
|
40
|
+
|
|
41
|
+
- Repo type: ruby-gem
|
|
42
|
+
- Primary language / runtime: Ruby (>= 3.2.2)
|
|
43
|
+
- Entry points: `require 'ecoportal/api-graphql'` -> `lib/ecoportal/api-graphql.rb` ->
|
|
44
|
+
`Ecoportal::API::GraphQL` (`lib/ecoportal/api/graphql.rb`)
|
|
45
|
+
|
|
46
|
+
## Related self-docs
|
|
47
|
+
|
|
48
|
+
- Architecture: `ARCHITECTURE.md`
|
|
49
|
+
- Conventions: `CONVENTIONS.md`
|
|
50
|
+
- Integrations: `INTEGRATIONS.md`
|
|
51
|
+
- Status: `STATUS.md`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema_version: "1.0"
|
|
3
|
+
repo: "ecoportal-api-graphql"
|
|
4
|
+
doc: status
|
|
5
|
+
last_generated: "2026-07-06"
|
|
6
|
+
source_head: "2abd6fc"
|
|
7
|
+
review_status: draft
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Status -- ecoportal-api-graphql
|
|
11
|
+
|
|
12
|
+
**Note:** this is the most time-sensitive self-doc. Refresh it at cycle-end and after structural
|
|
13
|
+
changes. Staleness is detectable via `source_head` vs the current git head.
|
|
14
|
+
|
|
15
|
+
## Active work
|
|
16
|
+
|
|
17
|
+
Hot paths from the scanner (`lib`, `.ai-assistance`, `spec`, `docs`) plus the active project
|
|
18
|
+
intent. The #1-priority project is Template Automatic Build and Maintenance (see
|
|
19
|
+
`.ai-assistance/projects/template-automatic-build-maintenance/INTENT.md`), which merges the former
|
|
20
|
+
`template-diff-deploy` and `template-maintenance` projects into one lifecycle sharing a single
|
|
21
|
+
`WorkflowCommand` emission layer:
|
|
22
|
+
|
|
23
|
+
- BUILD: build/maintain 300+ templates programmatically (CSV-to-templates pipeline, deadline
|
|
24
|
+
approximately September 2026) via a declarative spec -> `Builder::TemplateBuilder` -> ordered
|
|
25
|
+
command batch -> apply -> verify. Emitter is ready; live characterization is pending sandbox
|
|
26
|
+
service-account credentials.
|
|
27
|
+
- MAINTAIN / DIFF-DEPLOY: UAT-to-PROD change replication -- detect (diff) -> review -> deploy
|
|
28
|
+
(delta commands) -> verify -> monitor. Self-version diff, the pairing engine + ledger, diff
|
|
29
|
+
modalities/`Diff::Strategy`, the cross-object diff path, and `Change`-to-`WorkflowCommand`
|
|
30
|
+
synthesis are done; the interactive assisted-pairing UX (in `eco-helpers`) is pending.
|
|
31
|
+
- Recent fragment-convention work: Action/ContractorEntity mutations migrated to the spread
|
|
32
|
+
convention; the query validator now covers mutations.
|
|
33
|
+
|
|
34
|
+
## Migration state (if any)
|
|
35
|
+
|
|
36
|
+
- ooze/pages GraphQL-native migration and the api-v2-to-graphql migration are ongoing themes (see
|
|
37
|
+
`.ai-assistance/projects/ooze-graphql-native-migration/` and `.../api-v2-to-graphql-migration/`).
|
|
38
|
+
`ecoportal-api-v2` is being retired over time; the `Compat` layer preserves the v2 interface for
|
|
39
|
+
`eco-helpers` during the transition.
|
|
40
|
+
- Recent releases addressed stale-release drift: v1.3.11 raised the `ecoportal-api-v2` floor to
|
|
41
|
+
`>= 3.3.3` to fix a Ruby-3.x cascade after three live crashes were traced to version drift.
|
|
42
|
+
|
|
43
|
+
## Known risks
|
|
44
|
+
|
|
45
|
+
- Live customer data exposure: the gem can read/write page records (PII). The template automation
|
|
46
|
+
is the mitigation lever -- it MUST run under a service account scoped to templates/org-config
|
|
47
|
+
only, enforced by credential grant, not by instruction (ep-ai-standards
|
|
48
|
+
`security/ai-service-account-scope`). Provisioning that concrete grant is now this repo's work,
|
|
49
|
+
not a platform blocker.
|
|
50
|
+
- Backwards compatibility with `eco-helpers` is a hard constraint; public-interface changes must be
|
|
51
|
+
logged in the active project's DECISIONS log and confirmed with the developer.
|
|
52
|
+
- `no_schema: true` means queries are not validated against a schema at build time -- a query
|
|
53
|
+
validator (now covering mutations) is the compensating control.
|
|
54
|
+
- Spec coverage is sparse in subdirectories (`.ai-assistance/code/spec_coverage.md`).
|
|
55
|
+
|
|
56
|
+
## Open questions
|
|
57
|
+
|
|
58
|
+
- No CI config was detected at the repo root; whether CI runs elsewhere or is absent needs human
|
|
59
|
+
confirmation.
|
|
60
|
+
- The cross-object equivalence-matching (pairing) problem has no stable identity across independent
|
|
61
|
+
Mongo objects; it depends partly on Product's forthcoming template-entity-id, which this gem
|
|
62
|
+
bridges and feeds but does not own.
|
|
63
|
+
- Workflow-config-per-stage diff is out of scope until the `PagesWorkflow.stages` read model is
|
|
64
|
+
completed.
|
|
65
|
+
|
|
66
|
+
## Recent changes
|
|
67
|
+
|
|
68
|
+
First generation of the self-docs set (draft, for the EP Projects Register pilot). Generated at
|
|
69
|
+
git head `2abd6fc` on branch `main`. The machine-readable delta is in `CHANGES.jsonl`.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0",
|
|
3
|
+
"generated_at": "2026-07-06T11:15:00Z",
|
|
4
|
+
"repo_name": "ecoportal-api-graphql",
|
|
5
|
+
"repo_type": "ruby-gem",
|
|
6
|
+
"head": "2abd6fc",
|
|
7
|
+
"docs": [
|
|
8
|
+
{
|
|
9
|
+
"file": "docs/self-docs/OVERVIEW.md",
|
|
10
|
+
"purpose": "What the project is, who it serves, current priority",
|
|
11
|
+
"exists": true,
|
|
12
|
+
"content_hash": "391055c9a6a687b9"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"file": "docs/self-docs/ARCHITECTURE.md",
|
|
16
|
+
"purpose": "Top-level structure, key components, how they fit",
|
|
17
|
+
"exists": true,
|
|
18
|
+
"content_hash": "ad05f25b95b49c00"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"file": "docs/self-docs/CONVENTIONS.md",
|
|
22
|
+
"purpose": "Coding style, branch naming, commit style, test conventions",
|
|
23
|
+
"exists": true,
|
|
24
|
+
"content_hash": "1649159eb799a7b8"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"file": "docs/self-docs/INTEGRATIONS.md",
|
|
28
|
+
"purpose": "External services, upstream/downstream repos, dependencies",
|
|
29
|
+
"exists": true,
|
|
30
|
+
"content_hash": "bae9f91748e33af1"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"file": "docs/self-docs/STATUS.md",
|
|
34
|
+
"purpose": "Active work, migration state, known risks, open questions",
|
|
35
|
+
"exists": true,
|
|
36
|
+
"content_hash": "08841d1d45eea2d6"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
data/docs/worklog.md
CHANGED
|
@@ -8,6 +8,262 @@ This file tracks cross-project session state and the overall repo status.
|
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
## ▶ SESSION 2026-07-05 — 3 live act-gov crashes = ONE root cause (stale released gems); fixed-stack floors
|
|
12
|
+
|
|
13
|
+
Three live crashes on act-gov (`-toocs-coding` + org-structure sync), all the **same class**: the
|
|
14
|
+
server runs **stale RELEASED gems** while the fixes already exist in local/tagged code.
|
|
15
|
+
1. **v2 cascade `TypeError`** (`_cascaded_attributes_trace … is not a symbol nor a string`) via
|
|
16
|
+
`as_update`/`DiffService` on a `Phased` page — server `ecoportal-api-v2 3.3.2`; fix (Ruby-3.x
|
|
17
|
+
block-param swap) is commit `6a2b1b5`, released now as **v3.3.3**. See [[v2-cascade-blockparam-332-bug]].
|
|
18
|
+
2. **`updatedAt` "must have selections"** + 3. **`createdAt` "selections can't be made on scalars"** —
|
|
19
|
+
LocationStructure queries; server gem **1.3.9**; fixed in gem **1.3.10** (already tagged).
|
|
20
|
+
|
|
21
|
+
**Resolution (release-prepped; publish + server `bundle update` are Oscar's):**
|
|
22
|
+
- v2 **`v3.3.3`** tagged (`03561ed`): CHANGELOG + **cascade regression spec** (double_model_spec, 6 ex green).
|
|
23
|
+
- gem **`1.3.11`** re-tagged (`ad4f788`): gemspec now requires **`ecoportal-api-v2 >= 3.3.3`**.
|
|
24
|
+
- eco-helpers (`ecd5f03f`): gemspec requires **`ecoportal-api-graphql >= 1.3.11` + `ecoportal-api-v2 >= 3.3.3`**.
|
|
25
|
+
- **Systemic guard = raised dependency FLOORS** so `bundle` cannot resolve a broken version again;
|
|
26
|
+
plus the existing `tests/validate_queries.rb` (query class) + the new cascade regression spec.
|
|
27
|
+
- **LOCAL runs already bind the fixed clones** — `multi_org_api` (branch `api-deprecation`) Gemfile
|
|
28
|
+
`:local` group path-mounts gem `main` (1.3.11) + v2 `master` (3.3.3).
|
|
29
|
+
|
|
30
|
+
**Then Oscar ran `-tagtree-update` locally → the version-drift crashes were GONE** (loaded 14126 nodes,
|
|
31
|
+
created the draft), exposing the NEXT layer: **a dead-fragment-convention class.**
|
|
32
|
+
- `uninitialized constant …Fragment::LocationDraft (NameError)` at render — eco-helpers
|
|
33
|
+
`Helpers::Location::Command::EndPoints::Optimizations` still used the legacy `___Const__Fragment`
|
|
34
|
+
convention, which evals a `Fragment::<Name>` CONSTANT that no longer exists (fragments are a registry
|
|
35
|
+
now; `spread :Name`). Fixed → `spread :LocationDraft`/`:LocationsError` (eco-helpers `352a9657`).
|
|
36
|
+
- **Swept the whole class:** the gem's **Action + ContractorEntity MUTATIONS** had the same dead refs
|
|
37
|
+
(queries were migrated, mutations missed) → `spread :Action`/`:ContractorEntity` (gem `44a4288`).
|
|
38
|
+
- **Systemic guard:** `tests/validate_queries.rb` now renders **mutations** (was queries only) and
|
|
39
|
+
**hard-fails on render error** (dead fragment / unresolved constant). It immediately caught **3
|
|
40
|
+
`Kickstand::{Start,Stop,Fail}Workflow` bare-`DateTime`** bugs → fixed `{ dateTime timeZone }`.
|
|
41
|
+
Validator now **EXIT 0** (fragment + structural buckets clean); suite **635/0/2**, rubocop clean.
|
|
42
|
+
See [[fragment-spread-convention]]. Remaining validator "OTHER" findings (union/schema-dump-staleness)
|
|
43
|
+
are pre-existing → separate follow-up with a fresh schema dump.
|
|
44
|
+
- Gem `v1.3.11` re-tagged (`44a4288`); eco-helpers `3.2.17` (`352a9657`); both unpublished.
|
|
45
|
+
**NEXT: Oscar re-runs `-tagtree-update` + `-toocs-coding` locally to confirm, then publishes + deploys.**
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## ▶ SESSION 2026-07-04 (cont.) — v1.3.11 tag, addField schema-verified, learnings captured, live-script drafted
|
|
50
|
+
|
|
51
|
+
Post-round-4 follow-through on the #1 template project. **Gem `v1.3.11` tagged locally** (`fc45db7`,
|
|
52
|
+
unpublished — Oscar pushes/`gem push`); **eco-helpers bumped 3.2.17** (`243822b9`, unpublished).
|
|
53
|
+
- **addField (`5754d7f`, folded into v1.3.11):** schema-verified — `WorkflowAddFieldInput` has NO
|
|
54
|
+
`description`/`required`; `required` exists NOWHERE in the schema (read-only). `description` now via
|
|
55
|
+
follow-up `editFieldConfiguration`; added-field/section `stageId`/`sectionId` back-refs emitted. See
|
|
56
|
+
[[workflow-command-schema-realities]].
|
|
57
|
+
- **Learnings recorded (answering Oscar's "are these learnings?"):** cross-session memory
|
|
58
|
+
([[workflow-command-schema-realities]], [[register-membership-via-tags]]) + AI-readable code-spec
|
|
59
|
+
(`workflow-command-guide.md` "Schema realities" section, `2098415`) + CHANGELOG + this worklog. Prime
|
|
60
|
+
material for the [[project-graphql-agent-aws]] corpus (GAP_ANALYSIS flagged this exact gap class).
|
|
61
|
+
- **qa tag-superset SyncReadiness (merged, qa `c058782`):** `base_tags ⊆ compiled_tags` register-
|
|
62
|
+
membership check. **Surfaced a gem read-path gap:** gem has NO `compiledTags`; `baseTags` has an
|
|
63
|
+
accessor but the `corePageData` fragment fetches only `otherTags`. So live tag-membership `:skip`s
|
|
64
|
+
until (a) `baseTags` is added to the read fragment (genomeSignature-style one-liner) AND (b) Oscar
|
|
65
|
+
confirms "compiled tags" semantics (baseTags? base+other? backend-computed incl. inherited/forces?).
|
|
66
|
+
- **Live characterization script drafted (training `feature/template-live-characterization` `ab147f0`,
|
|
67
|
+
UNMERGED):** `-template-maintenance` case, dry-run default, `-commit` gates the only live write.
|
|
68
|
+
Offline smoke PASSED against local clones (6 well-formed commands, 0 unsupported, Applier dry-run,
|
|
69
|
+
DriftReport match?==true). Commands for Oscar in its README. 4 assumptions to confirm (template read
|
|
70
|
+
path; register-search signature; tag-superset membership; `graphql.page` executor accepts a template
|
|
71
|
+
workflow batch). Runs only in `ENVIRO_CONTEXT=local` (path-mounted clones) until v1.3.11 is published.
|
|
72
|
+
|
|
73
|
+
**OPEN for Oscar:** (1) publish gem v1.3.11 + repoint eco-helpers; (2) confirm "compiled tags" semantics
|
|
74
|
+
→ then the `baseTags` fragment fix; (3) set up the Mini test register + before/after template, then run
|
|
75
|
+
the live characterization (dry-run → commit); (4) decide whether the training case sits on `master` or
|
|
76
|
+
`api-deprecation`.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## ▶ SESSION 2026-07-04 (cont.) — Template build+maintenance made #1; increments #4 merged; gem v1.3.11 prepped
|
|
81
|
+
|
|
82
|
+
Oscar set **template automatic build & maintenance as #1 priority**. Ran the usual 3 parallel threads
|
|
83
|
+
(one per repo), all merged to mains, developer-only authorship. Suites **gem 627 (2 pending live-AI) /
|
|
84
|
+
eco-helpers 274 / qa 104 — 0 failures.** Mains: gem `a07f708`→release `70fd252`, eco-helpers `8dc89c45`,
|
|
85
|
+
qa `ac8077c`.
|
|
86
|
+
|
|
87
|
+
- **Gem (thread A):** `Diff::Strategy` (composable modalities: pairing × scope × move-sensitivity ×
|
|
88
|
+
intent; `.default` = prior behaviour) + `Diff::CrossObjectDiff` (two templates with NO shared ids →
|
|
89
|
+
`Pairing::Engine` builds the id map → same `Change` output → `CommandSynthesizer`/`Deploy`;
|
|
90
|
+
ambiguous held in `#unresolved`) + `Builder::TemplateBuilder` (declarative spec → build command
|
|
91
|
+
batch, shares the diff's placeholderId threading). Reconciled the two project-doc folders into
|
|
92
|
+
`.ai-assistance/projects/template-automatic-build-maintenance/` (★#1). +27 diff / +13 builder / +16
|
|
93
|
+
strategy specs.
|
|
94
|
+
- **eco-helpers (thread B):** native deploy→verify→monitor loop under `samples/pages/template/deploy/`
|
|
95
|
+
(`Applier` dry-run default / `commit:` + injected executor / refuses on `unsupported` unless
|
|
96
|
+
`allow_partial:`; `DriftReport` pre/post self-version diff vs intended on an id-free signature;
|
|
97
|
+
pluggable `Verifier`, `QaVerifier` soft-wires ecoportal-qa only if on load path, else `NullVerifier`;
|
|
98
|
+
`SyncReadiness` per-entry) + CSV→template build (`FormatMap`→`Parser`→`Builder` →
|
|
99
|
+
`Builder::Template#create`; format isolated in `FormatMap`). +31 specs.
|
|
100
|
+
- **qa (thread C):** deploy-verification + sync-readiness as new check-sets in the existing framework
|
|
101
|
+
(two `Runner` entrypoints → canonical `Result`); consumes the gem page-model. Intended-change
|
|
102
|
+
contract = `{meta, changes:[Change#to_h]}` (accepts wrapper or bare list, sym/str keys); needs a
|
|
103
|
+
`baseline_doc:` for no-unintended-change; richer gem `Diff::VersionDiff` injectable via
|
|
104
|
+
`Compiler.new(diff_class:)`. +30 specs.
|
|
105
|
+
|
|
106
|
+
**★ TWO INDEPENDENTLY-CONFIRMED SEAMS (B and C reached the same conclusions):**
|
|
107
|
+
1. The gem `Diff` module was **unreleased** (1.3.10 was the location hotfix). B/C bind to it via
|
|
108
|
+
injected/lazy seams so they run offline against released 1.3.9/1.3.10. **→ Prepped gem `v1.3.11`**
|
|
109
|
+
(`chore(release)` `70fd252`: version bump + full CHANGELOG for the Diff module + `TemplateBuilder`).
|
|
110
|
+
NOT yet tagged/published — Oscar to tag `v1.3.11` + publish, then repoint eco-helpers to it so the
|
|
111
|
+
deploy loop binds to the real `Diff` classes.
|
|
112
|
+
2. Gem **`addField` input drops `description`/`required`** → CSV/hidden-field identity token + `required`
|
|
113
|
+
readiness can't persist through `addField` (C `:skip`s `required`; B keeps only the hidden anchor).
|
|
114
|
+
Also diff-side `addField`/`addSection` lack `stageId`/`sectionId` back-refs.
|
|
115
|
+
**✅ RESOLVED (schema-verified, folded into v1.3.11 — merge `d42c528`, retag at `fc45db7`):**
|
|
116
|
+
introspection shows `WorkflowAddFieldInput` = `{placeholderId,fieldType,label,stageId,sectionId,
|
|
117
|
+
column}` — **no `description`**, and **`required` exists NOWHERE in the schema** (not on AddField,
|
|
118
|
+
not on any of the 12 byType edit sub-inputs). So: `description` now persists via a follow-up
|
|
119
|
+
`editFieldConfiguration(dataFieldId:, description:)` (TemplateBuilder + synthesizer); added-field
|
|
120
|
+
`addField` carries `sectionId`(parent_id)+`stageId`(new `Change#owner_id`), added-section emits
|
|
121
|
+
`addStageSection`, all `ref()`-threaded. **`required` is permanently read-only/out-of-band** (qa
|
|
122
|
+
`:skip` is correct-by-design, not a gap). Suite 635/0/2, rubocop clean.
|
|
123
|
+
|
|
124
|
+
**STATE OF #1 PROJECT:** full build+maintain engine exists **end-to-end offline** — build (CSV or
|
|
125
|
+
declarative → commands), diff (self-version + cross-object via pairing), deploy (apply + drift-check),
|
|
126
|
+
verify (qa), monitor (sync-readiness). Gap to "trusted" = **(a) publish v1.3.11** (tagged locally at
|
|
127
|
+
`fc45db7`, incl. the addField resolution; push + `gem push` are Oscar's) **+ repoint eco-helpers**
|
|
128
|
+
(bumped to 3.2.17, unpublished), and **(b) the sandbox live pass** (Mini site; a dedicated test
|
|
129
|
+
register + a template whose compiled tags ⊇ the register `base_tags` + a before/after version — see
|
|
130
|
+
[[register-membership-via-tags]]; script to be prepped; sandbox can't reach live.ecoportal.com so
|
|
131
|
+
Oscar runs it). Sync-readiness should also gain the **tag-superset** dimension (register membership =
|
|
132
|
+
`base_tags` ⊆ compiled tags), not just field presence.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## ▶ SESSION 2026-07-04 (cont.) — 3 parallel-thread increments #3 merged + strategic briefing captured
|
|
137
|
+
|
|
138
|
+
**Increments #3 (all merged to mains, green, developer-only authorship):** gem `main` `c607be9`,
|
|
139
|
+
eco-helpers `master` `5adb4a21`, qa `master` `41cb2e6`. Suites **gem 587 (2 pending live-AI) /
|
|
140
|
+
eco-helpers 243 / qa 74 — 0 failures.**
|
|
141
|
+
- **Templates (gem):** `VersionDiff` now **emits** gauge-stop (`add/remove/editGaugeFieldStop`, matched
|
|
142
|
+
by retained stop id) + typed `byType` field-config changes (`editFieldConfiguration(byType:)`,
|
|
143
|
+
conservative — only confirmed read-prop↔input-key 1:1: Gauge `max`; Select `dataType/multiple/flat/
|
|
144
|
+
other/otherDesc`; Date `showTime/pastOnly/todayButton`; shapes verified vs the live schema dump).
|
|
145
|
+
`CommandSynthesizer` maps them + **placeholderId threading** (Deploy default on): deterministic
|
|
146
|
+
client placeholders on added nodes, later same-batch refs rewritten via `ref()`. +26 specs.
|
|
147
|
+
UNSUPPORTED (honest): unconfirmed byType props (PlainText `multiline`/`required`, RichText/People/
|
|
148
|
+
Table/CrossReference bodies), gauge-stop reorder (no ordering field), structural back-refs in adds.
|
|
149
|
+
- **samples/pages (eco-helpers):** native `TypedFieldsPairing` (groups by GraphQL type string, 2-pass
|
|
150
|
+
label match, `EXCLUDED_TYPES` TagField/Chart/FrequencyRateChart) + `Copying#copy_field_content` +
|
|
151
|
+
`Register::MigrationCase < Register::Base`. Ports live FLAT at `graphql/helpers/pages/*` (not the
|
|
152
|
+
TODO's `.../migration/*`) for round-2 consistency. Deferred: v2 mapped-field hooks
|
|
153
|
+
(`copy_hooked_fields`/`field_maps`), live A/B parity run (creds). +27 specs.
|
|
154
|
+
- **QA (ecoportal-qa):** sub-phase **3c CLI wiring** (`--jira KEY` → DryRunClient default, offline
|
|
155
|
+
CI-preview; `--audit-log PATH` JSONL; report-only default) + **3b `RestClient` skeleton**
|
|
156
|
+
(config-parameterized transition-names/verdict-field, injected HTTP transport, stub-driven specs,
|
|
157
|
+
no real HTTP). No McpClient. +22 specs. Note: `PHASE3-SCOPE.md`/`ROADMAP.md` live on the gem branch
|
|
158
|
+
`feature/qa-services-delivery-project` under `.ai-assistance/projects/qa-services-delivery/`, NOT in
|
|
159
|
+
the qa repo — worklog wording earlier was ambiguous.
|
|
160
|
+
|
|
161
|
+
**★ STRATEGIC BRIEFING from Oscar (captured to memory — see the index).** The next arc is
|
|
162
|
+
**customer-facing agents/apps**, all governed by a management **no-support-dependency mandate**
|
|
163
|
+
([[principle-customer-facing-automation]]): self-documenting config, auto gap-detection, guide the
|
|
164
|
+
technician, CI/CD that blocks breaking changes + auto-generates self-tested migrations, pricing
|
|
165
|
+
transparency, extensive Confluence docs the AI can pull from. Four threads:
|
|
166
|
+
1. **GraphQL / "Integrations" agent → Claude-on-AWS (Client Services workspace)** — corpus already
|
|
167
|
+
staged externally (`C:\claude\Projects\Claude AWS Platform\tmp\corpus\staging\success\graphql\`,
|
|
168
|
+
18 docs), push deliberately held until repo learnings could enrich it. **NOW the moment.** Ships a
|
|
169
|
+
generic Postman/Insomnia collection + a new Confluence self-serve subsection ("Do it yourself"/
|
|
170
|
+
Training/Learning/Examples). `.ai-assistance/projects/graphql-agent/GAP_ANALYSIS.md` is the (stale,
|
|
171
|
+
2026-06-07) gap map — many gaps now filled by code-specs written since. See [[project-graphql-agent-aws]].
|
|
172
|
+
2. **SCIM agent = Entra ID gallery app** — driver: **APIv0 retires END-JUL 2026, FIRM.** Kill the
|
|
173
|
+
high-touch Entra SCIM enrollment (free Travis). Design gated on a **rich structured Travis
|
|
174
|
+
interview** + an **Oscar walkthrough of the Entra caveats** (both Oscar-requested, pending). Open:
|
|
175
|
+
Microsoft Partner vs unlisted-app, gallery upgrade/migration mechanism. See
|
|
176
|
+
[[project-azure-gallery-app]] + [[project-scim-users-apiv0-adapter]].
|
|
177
|
+
3. **Webhooks** — about to officially release; page payload sends only internal `page_id`. Oscar's
|
|
178
|
+
private (un-raised) view: should also send `externalId`. See [[project-webhooks-subscriptions]].
|
|
179
|
+
4. **Platform-agnostic integrations (Zapier as referent, not dependency)** — reusable, auto-detects
|
|
180
|
+
template-drift breakage; UAT-vs-PROD ideal; generic requirements interview with Oscar pending. See
|
|
181
|
+
[[project-integrations-platform-agnostic]].
|
|
182
|
+
|
|
183
|
+
**NEXT:** decide with Oscar whether to start the GraphQL-agent corpus enrichment now (in-repo work I
|
|
184
|
+
can do; the actual AWS push needs his creds/workspace). The 3 gem/helpers/qa threads can also continue
|
|
185
|
+
(#4 increments) in parallel as before.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## ▶ SESSION 2026-07-04 — 3 parallel-thread increments #2 (all merged to mains, green)
|
|
190
|
+
|
|
191
|
+
Same shape as the prior session: one background agent per repo, separate working trees, each on a
|
|
192
|
+
feature branch, then **all consolidated to their mains + branches deleted** (Oscar's call),
|
|
193
|
+
developer-only authorship. Suites: **gem 561 (2 pending live-AI, pre-existing) / eco-helpers 216 /
|
|
194
|
+
qa 52 — 0 failures.** Mains: gem `b16b5e5`, eco-helpers `c37847d5`, qa `ec4a507`.
|
|
195
|
+
|
|
196
|
+
- **Templates (gem) — `template-diff-deploy`:** edit-mode synthesis + deploy orchestration + pairing.
|
|
197
|
+
`Diff::Deploy.from_versions(before, after, target_doc:)` turns a diff into an ordered replayable
|
|
198
|
+
`WorkflowCommand` batch for `executeWorkflowCommands`; `execute!` refuses to run while `unsupported`
|
|
199
|
+
is non-empty unless `allow_partial:`; inert until an explicit executor is passed. Edit-mode moves
|
|
200
|
+
(`moveField`, section stage-reassign via `removeStageSection`+`addStageSection`) are gated on a new
|
|
201
|
+
`Diff::IdResolver` (`from_doc` indexes stage names + section headings → ids; duplicate keys → nil,
|
|
202
|
+
**never guesses**). `Diff::Pairing::{Engine,Ledger,Signals,Candidate}`: weighted fallible signals
|
|
203
|
+
(genome 0.5 + type 0.2 + label 0.2 + select-options 0.1, averaged over applicable), greedy 1:1,
|
|
204
|
+
auto-accept ≥0.85 / ambiguous 0.5–0.85 / unmatched <0.5; **genome mismatch scores 0 but does not
|
|
205
|
+
veto** → contradicting-genome/same-label fields are escalated, never auto-paired. `Ledger` is a
|
|
206
|
+
first-class JSON artifact of confirmed equivalences, consulted first. Code-spec:
|
|
207
|
+
`.ai-assistance/code/diff_pairing_engine.md`. +44 diff specs.
|
|
208
|
+
- **samples/pages (eco-helpers):** native `Helpers::Pages::OozeHandlers#merge_values` (dispatches on
|
|
209
|
+
GraphQL DataField **type string** via `TYPE_MAP`, not V2 Component classes), included into
|
|
210
|
+
`Register::Base` with `#merge_field_values`. `Compat::Parity::{RunResult,Comparison,Harness}` A/B
|
|
211
|
+
harness (canonical-KPI + normalised payload snapshot, `equivalent?` verdict) — **pure/offline;
|
|
212
|
+
running legacy-vs-native live needs a test org + creds.** Native `Register::TargetOozesUpdateCase`
|
|
213
|
+
(CSV target ids, id-batching, dup-detection preview, fetch-per-id, dedup, KPIs; org-scan `each_page`
|
|
214
|
+
disabled). Native-only: no case flipped, no shim change, no public-API rename. +38 specs.
|
|
215
|
+
- **QA repo — sub-phase 3a:** `Jira::{Client,DryRunClient,Publisher}`. Jira is *just another Result
|
|
216
|
+
consumer* (no runner/DSL/compiler/Result changes). DryRunClient writes nothing + records intended
|
|
217
|
+
posts; Publisher redacts-before-post (ON by default, reuses `Redactor`), per-ticket idempotency
|
|
218
|
+
marker, **report-only default (never transitions unless a human names one)**, audit trail per
|
|
219
|
+
action. No RestClient/McpClient (that's blocked 3b/3c). +21 specs.
|
|
220
|
+
|
|
221
|
+
**NEXT increments (parallel threads continue):**
|
|
222
|
+
- **Templates:** extend `VersionDiff` to *emit* gauge-stop + typed `byType` field-config changes — the
|
|
223
|
+
one part of edit-mode genuinely blocked upstream in the diff (synthesizer is ready to map them once
|
|
224
|
+
emitted). Then `placeholderId` threading for dependent intra-batch creates; interactive
|
|
225
|
+
assisted-resolution UX + `TypedFieldsPairing` as an extra pairing signal (eco-helpers layer).
|
|
226
|
+
- **samples/pages:** live A/B parity run (needs test org + creds); Phase-5 `TypedFieldsPairing` /
|
|
227
|
+
migration-case porting; later phases flip `OozeSamples::*` to native + shim removal (parity-gated).
|
|
228
|
+
- **QA:** 3b/3c **decision-blocked** on 4 open Qs for Oscar — (1) Jira project + exact transition
|
|
229
|
+
names, (2) REST service-account token vs MCP-only, (3) verdict field id vs comment-only, (4) where
|
|
230
|
+
check-sets live long-term. 3a is done and unblocks the offline/CI-preview path today.
|
|
231
|
+
- Standing: 1.3.11 union fixes + CI query-validation TODO (due **2026-07-17**); live capture of
|
|
232
|
+
template `6a3fa5b8…622b` (blocked on sandbox creds); FARMERS/Travis F1/F2 (`api-deprecation`).
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## ▶ SESSION 2026-07-03 (cont.) — Consolidation + 3 parallel-thread increments (all merged, green)
|
|
237
|
+
|
|
238
|
+
**Consolidated** all green foundation branches to their mains (Oscar's call), then built the next
|
|
239
|
+
increment of each of the 3 threads in parallel (one background agent per repo, separate working
|
|
240
|
+
trees). All merged to mains, branches deleted, developer-only authorship. Suites: **gem 515 (~live) /
|
|
241
|
+
eco-helpers 178 / qa 31 — 0 failures.**
|
|
242
|
+
|
|
243
|
+
- **Templates (gem):** `genomeSignature` now fetched on ALL data-field types (added once to the
|
|
244
|
+
`dataFieldInterface` fragment, `@skip(if: $only_content)`) + `passthrough :genomeSignature` on
|
|
245
|
+
`Base::Page::DataField` — unblocks field pairing for cross-template diffs. New
|
|
246
|
+
`Diff::CommandSynthesizer` turns a `VersionDiff` change-set into an ordered `WorkflowCommand` batch
|
|
247
|
+
(the replayable "commit"); correctly leaves UNSUPPORTED (never guesses) field type-change and
|
|
248
|
+
field/section moves (need a pairing map / target id). `Change` gained `parent_id` (stamped on option
|
|
249
|
+
changes).
|
|
250
|
+
- **samples/pages (eco-helpers):** native `Samples::Pages::Register::Base < Page::Base` reproducing
|
|
251
|
+
`RegisterUpdateCase` semantics (register-scoped batched cursor search, dedup-by-id, KPIs, dry-run,
|
|
252
|
+
process_page/process_ooze override) + native `Helpers::Pages::Creatable`. **Shim + OozeSamples names
|
|
253
|
+
untouched** (native-only). Deferred (TODO): `merge_values` typed-field pairing; v2 batch_queue dropped
|
|
254
|
+
(GraphQL is per-page). +17 specs.
|
|
255
|
+
- **QA repo:** dropped the hand-rolled `TemplateModel` (−62 net lines); `Source::{Fixture,Graphql}`
|
|
256
|
+
now yield the gem's page model (`Model::PageUnion.new(doc)`, parses offline); Compiler navigates gem
|
|
257
|
+
accessors with small adapters preserving skip-honest options/required/forces. Same toocs verdict (7/2/3).
|
|
258
|
+
|
|
259
|
+
**NEXT increments (parallel threads continue):** Templates — extend the emitter to *edit* mode +
|
|
260
|
+
wire diff→commands into a deploy flow; pairing engine (uses genomeSignature + type+label) + ledger.
|
|
261
|
+
samples/pages — native `merge_values`/typed-field pairing + A/B parity harness; native
|
|
262
|
+
`TargetOozesUpdateCase`. QA — Phase 3 Jira adapter (decision-blocked). Plus the standing 1.3.11 union
|
|
263
|
+
fixes + CI query-validation TODO (due 2026-07-17).
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
11
267
|
## ▶ SESSION 2026-07-03 (cont.) — Template self-version diff + genome finding + domain capture
|
|
12
268
|
|
|
13
269
|
**Built `Ecoportal::API::GraphQL::Diff::VersionDiff`** (gem branch `feature/template-version-diff`,
|
|
@@ -33,7 +33,7 @@ Gem::Specification.new do |spec|
|
|
|
33
33
|
spec.add_development_dependency 'yard', '>= 0.9.34', '< 1'
|
|
34
34
|
|
|
35
35
|
spec.add_dependency 'ecoportal-api', '~> 0.10', '>= 0.10.16'
|
|
36
|
-
spec.add_dependency 'ecoportal-api-v2', '~> 3.3', '>= 3.3.
|
|
36
|
+
spec.add_dependency 'ecoportal-api-v2', '~> 3.3', '>= 3.3.3'
|
|
37
37
|
spec.add_dependency 'graphlient', '>= 0.8.0', '< 0.9'
|
|
38
38
|
end
|
|
39
39
|
|