ecoportal-api 0.10.16 → 0.10.17

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.

Potentially problematic release.


This version of ecoportal-api might be problematic. Click here for more details.

Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.ai-assistance/.gitignore +2 -0
  3. data/.ai-assistance/bridge/.gitignore +10 -0
  4. data/.ai-assistance/bridge/CLAUDE.md +96 -0
  5. data/.ai-assistance/bridge/archive/.gitkeep +0 -0
  6. data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
  7. data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
  8. data/.ai-assistance/capabilities/assumptions-log.md +23 -0
  9. data/.ai-assistance/scripts/bridge-inbox-check.sh +119 -0
  10. data/.ai-assistance/scripts/bridge-init.sh +86 -0
  11. data/.ai-assistance/scripts/confine-to-subtree.sh +58 -0
  12. data/.ai-assistance/scripts/dirty-tree-guard.sh +96 -0
  13. data/.ai-assistance/scripts/distill_procedural.py +602 -0
  14. data/.ai-assistance/scripts/log-mcp-access.sh +24 -0
  15. data/.ai-assistance/scripts/log-skill-usage.sh +79 -0
  16. data/.ai-assistance/scripts/log_mcp_access.py +158 -0
  17. data/.ai-assistance/scripts/observe-session.sh +13 -0
  18. data/.ai-assistance/scripts/observe_session.py +287 -0
  19. data/.ai-assistance/scripts/protect-host-paths.sh +135 -0
  20. data/.ai-assistance/scripts/scrub.py +1149 -0
  21. data/.ai-assistance/scripts/scrub.py.sha256 +6 -0
  22. data/.ai-assistance/scripts/surface-procedural.sh +9 -0
  23. data/.ai-assistance/scripts/surface_procedural.py +101 -0
  24. data/.ai-assistance/skills/ep-ai-manager/SKILL.md +519 -0
  25. data/.ai-assistance/skills/project-self-docs/SKILL.md +259 -0
  26. data/.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py +378 -0
  27. data/.ai-assistance/standards-version.json +12 -0
  28. data/.ai-assistance/version.json +8 -0
  29. data/.claude/.gitignore +2 -0
  30. data/.claude/settings.json +128 -0
  31. data/CHANGELOG.md +8 -5
  32. data/CLAUDE.md +95 -71
  33. data/docs/self-docs/ARCHITECTURE.md +145 -0
  34. data/docs/self-docs/CHANGES.jsonl +7 -0
  35. data/docs/self-docs/COMPLIANCE.md +66 -0
  36. data/docs/self-docs/CONVENTIONS.md +74 -0
  37. data/docs/self-docs/INTEGRATIONS.md +62 -0
  38. data/docs/self-docs/OPERATIONS.md +64 -0
  39. data/docs/self-docs/OVERVIEW.md +61 -0
  40. data/docs/self-docs/STATUS.md +71 -0
  41. data/docs/self-docs/self-docs-index.json +51 -0
  42. data/docs/worklog.md +48 -0
  43. data/lib/ecoportal/api/common/client/with_retry.rb +6 -0
  44. data/lib/ecoportal/api/version.rb +1 -1
  45. metadata +40 -1
@@ -0,0 +1,62 @@
1
+ ---
2
+ schema_version: "1.1"
3
+ repo: "ecoportal-api"
4
+ doc: integrations
5
+ last_generated: "2026-07-23"
6
+ source_head: "69bf8e3"
7
+ review_status: draft
8
+ ---
9
+
10
+ # Integrations -- ecoportal-api
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). It records, per tie,
14
+ the DATA that flows and the PERMISSIONS required -- feeding the compliance (vendor/PII) and the
15
+ cross-project-permissions questions. Detailed data-handling lives in `COMPLIANCE.md`.
16
+
17
+ ## External services
18
+
19
+ | Service | Purpose | Data sent (class + PII?) | Auth / permissions (scopes) |
20
+ |---|---|---|---|
21
+ | ecoPortal REST API (`live.ecoportal.com` default host, `Common::Client::DEFAULT_HOST`) | The actual product API this gem is a client for (internal + v1 resources: people, schema, permissions, jobs) | Whatever the consuming application sends -- can include customer/employee data (people records) depending on caller; class = customer/employee data, PII likely YES (person records) -- see `COMPLIANCE.md` | `api_key` param, sent as `X-ApiKey` header (evidence: `client.rb` docstring "the `api_key` will be automatically added as parameter `X-ApiKey`") |
22
+ | Elastic APM / Elastic Cloud (`https://<account_id>.apm.<region>.aws.cloud.es.io:<port>`, default region `ap-southeast-2`) | Optional error/transaction telemetry (`ElasticApmIntegration`, only reports `UnexpectedServerError`s, `transaction_sample_rate: 0.1`) | APM traces/error metadata -- unknown -- needs owner input on whether response bodies (which could carry customer data) are ever included in a reported error vs just status/class | `ELASTIC_APM_KEY`, `ELASTIC_APM_ACCOUNT_ID`, `ELASTIC_APM_REGION`, `ELASTIC_APM_PORT` env vars (`elastic_apm_integration.rb`); fails open (disables itself) on any `StandardError` at start, never crashes the host app |
23
+ | RubyGems.org | Package distribution for the published gem (`bundle exec rake release` per `README.md`) | Gem source code only, no runtime data | Publisher credentials (rubygems.org account); `rubygems_mfa_required: true` in the gemspec |
24
+
25
+ ## Upstream dependencies (repos we depend on)
26
+
27
+ None -- `ecoportal-api` is the foundational/first gem in the ecoPortal Ruby chain (`CLAUDE.md`:
28
+ "the foundational REST API gem"). It has no ecoPortal-owned upstream gem dependency; its runtime
29
+ dependencies (`dotenv`, `elastic-apm`, `http`, `rate_throttle_client`) are third-party gems from
30
+ the gemspec, not ecoPortal repos.
31
+
32
+ | Repo / package | What we use it for | Permission/scope required (if any) |
33
+ |---|---|---|
34
+ | `dotenv` (~> 3) | Loads `.env` into `ENV` on gem require (`lib/ecoportal/api.rb: require 'dotenv/load'`) | none |
35
+ | `elastic-apm` (>= 4.7, < 5) | Optional APM client, see External services above | `ELASTIC_APM_KEY` etc. |
36
+ | `http` (~> 5.1, < 6) | The actual HTTP client library `Common::Client` wraps | none |
37
+ | `rate_throttle_client` (~> 0.1) | Client-side rate throttling used by `Common::Client::RateThrottling` | none |
38
+
39
+ ## Downstream consumers (who depends on us)
40
+
41
+ Per `CLAUDE.md`'s documented chain: `ecoportal-api-v2` -> `ecoportal-api-graphql` -> `eco-helpers`
42
+ (each real repo, confirmed present in `.ai-assistance/local/paths.json` in the `ep-ai-standards`
43
+ fleet registry: aliases `ep-api-v2`, `ep-graphql`, `eco-helpers`). `ecoportal-api-v2` in particular
44
+ "extends [`Common::BaseModel`/`Common::BaseClass`] heavily" (`CLAUDE.md`). unknown -- needs owner
45
+ input on any consumer outside that four-repo chain (e.g. ad hoc scripts elsewhere in the
46
+ organisation that `gem install ecoportal-api` directly).
47
+
48
+ ## Key package dependencies
49
+
50
+ From `ecoportal-api.gemspec` (runtime, not the full `Gemfile.lock`):
51
+
52
+ - `dotenv` (~> 3)
53
+ - `elastic-apm` (>= 4.7, < 5)
54
+ - `http` (~> 5.1, < 6)
55
+ - `rate_throttle_client` (~> 0.1)
56
+
57
+ Development-only: `pry`, `rake`, `redcarpet`, `rspec`, `rubocop`, `rubocop-rake`, `yard`.
58
+
59
+ ## Feature-request-not-rebuild note
60
+
61
+ None identified this run -- no evidence in `docs/worklog.md` or recent commits of a feature that
62
+ duplicates another project's scope. unknown -- needs owner input if a specific case comes up later.
@@ -0,0 +1,64 @@
1
+ ---
2
+ schema_version: "1.1"
3
+ repo: "ecoportal-api"
4
+ doc: operations
5
+ last_generated: "2026-07-23"
6
+ source_head: "69bf8e3"
7
+ review_status: draft
8
+ ---
9
+
10
+ # Operations -- ecoportal-api
11
+
12
+ **Purpose:** the infrastructure / exposure / value surface for DevOps and Engineering. It lets ROVO answer
13
+ "what infrastructure is involved, is it behind Cloudflare, what governs its flows, and is it worth it?"
14
+ Same trust rule as COMPLIANCE.md: separate EVIDENCE from INTENT; audit answers use `reviewed` docs only.
15
+
16
+ ## Infrastructure inventory
17
+
18
+ | Component | Type (compute/store/queue/...) | Where hosted | Notes |
19
+ |---|---|---|---|
20
+ | `ecoportal-api` gem itself | Library (no compute of its own) | Distributed via RubyGems.org; runs inside WHATEVER process requires it (no dedicated compute in this repo) | Not a deployed service -- no `Dockerfile`/`cdk.json`/`docker-compose.yml`/Terraform found in this repo |
21
+ | ecoPortal REST API (`live.ecoportal.com`) | External compute the gem calls as a CLIENT | ecoPortal's own infrastructure -- not this repo's | This repo does not own or operate this API; it only calls it. unknown -- needs owner input on which repo documents that API's own infrastructure |
22
+ | Elastic APM / Elastic Cloud | External SaaS (observability) | Elastic Cloud, `ap-southeast-2` region by default (`elastic_apm_integration.rb`) | Optional, env-var gated, fails open |
23
+
24
+ ## Public exposure
25
+
26
+ This repo has no publicly reachable domain or endpoint of its own -- it is a Ruby library, not a
27
+ hosted service (no server/Lambda entry point found; see `ARCHITECTURE.md` "Entry points"). It
28
+ makes OUTBOUND calls (as a client) to `live.ecoportal.com` and, optionally, Elastic Cloud.
29
+
30
+ | Public domain / endpoint | Behind Cloudflare? | Security rules governing the flow |
31
+ |---|---|---|
32
+ | N/A -- no inbound public endpoint in this repo | N/A | N/A |
33
+
34
+ unknown -- needs owner input on whether `live.ecoportal.com` itself sits behind Cloudflare (that is
35
+ the ecoPortal product API's own infrastructure question, out of scope for this client-gem repo).
36
+
37
+ ## DevOps audit runbook
38
+
39
+ - Run tests: `bundle install && bundle exec rspec` (`CLAUDE.md`, `README.md`).
40
+ - Run lint: `bundle exec rubocop` (or `bundle exec rake rubocop`, per `Rakefile`).
41
+ - Default task (`rake`, no args): runs RuboCop then RSpec (`Rakefile`).
42
+ - Check installed AI-standards alignment: `.ai-assistance/standards-version.json` (currently
43
+ `ep-ai-standards-version: 1.9.1`, applied 2026-07-22, installed components
44
+ `skills/ep-ai-manager@2.5.0` and `skills/project-self-docs@0.4.0`).
45
+ - Check this self-docs set for staleness: compare `source_head` in each file's frontmatter against
46
+ `git rev-parse --short HEAD`, or read `docs/self-docs/self-docs-index.json` /
47
+ `docs/self-docs/CHANGES.jsonl` (written by
48
+ `.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py --write`).
49
+ - No CI dashboard / pipeline exists to check (see `ARCHITECTURE.md` Diagrams section) -- unknown --
50
+ needs owner input if one exists outside this working tree.
51
+ - Deeper runbook: none found beyond `CLAUDE.md` and `docs/worklog.md` -- unknown -- needs owner
52
+ input on whether a separate ops runbook exists elsewhere (e.g. a wiki/Confluence page).
53
+
54
+ ## Value & KPIs
55
+
56
+ | Metric | Value (measured/estimated) | Source / dashboard |
57
+ |---|---|---|
58
+ | Gem version | `0.10.17` (`lib/ecoportal/api/version.rb`) | measured |
59
+ | Downstream consumer repos | 3 (`ecoportal-api-v2`, `ecoportal-api-graphql`, `eco-helpers`) | measured (from `CLAUDE.md` dependency chain, cross-checked against `.ai-assistance/local/paths.json` fleet registry) |
60
+ | Usage / adoption outside the known fleet chain | unknown -- needs owner input | rubygems.org download stats were not checked in this run |
61
+ | Hours saved / delivery-speed impact | unknown -- needs owner input | No KPI telemetry specific to this gem was found in this repo (KPI tooling exists at the fleet level per `ep-ai-standards`, not evidenced as wired to this repo's own usage) |
62
+
63
+ This section intentionally leaves the ROI/usage questions as `unknown -- needs owner input` rather
64
+ than estimating a number with no evidentiary basis.
@@ -0,0 +1,61 @@
1
+ ---
2
+ schema_version: "1.1"
3
+ repo: "ecoportal-api"
4
+ doc: overview
5
+ last_generated: "2026-07-23"
6
+ source_head: "69bf8e3"
7
+ review_status: draft # draft | reviewed (only a human sets 'reviewed')
8
+ ---
9
+
10
+ # Overview -- ecoportal-api
11
+
12
+ ## What this project is
13
+
14
+ `ecoportal-api` is the foundational Ruby gem in the ecoPortal Ruby stack. It provides HTTP client
15
+ infrastructure (retry, rate throttling, timeouts, APM), a shared response/model layer
16
+ (`Ecoportal::API::Common`), and REST resources for the ecoPortal `internal` and `v1` APIs (people,
17
+ schema fields, permissions, jobs). Every other gem in the chain (`ecoportal-api-v2`,
18
+ `ecoportal-api-graphql`, `eco-helpers`) depends on this one, directly or transitively.
19
+ (Evidence: `CLAUDE.md`, `lib/ecoportal/api/` tree, `ecoportal-api.gemspec`.)
20
+
21
+ ## Who it serves
22
+
23
+ Internal: ecoPortal engineers who build the downstream gems (`ecoportal-api-v2`,
24
+ `ecoportal-api-graphql`, `eco-helpers`) and any script/integration that talks to the ecoPortal API
25
+ via those gems. It is a published RubyGem (`spec.homepage = "https://www.ecoportal.com"`,
26
+ `rubygems_mfa_required: true` in the gemspec) -- unknown -- needs owner input on whether any
27
+ external (non-ecoPortal-employee) consumer currently depends on it in production.
28
+
29
+ ## Current priority
30
+
31
+ unknown -- needs owner input. `docs/worklog.md` (added 2026-07-22) records only the AI-standards
32
+ alignment and session-handoff scaffold work; it does not state a current functional/feature
33
+ priority for the gem itself. The most recent commits on `master` are all `chore(ai)`/`fix` AI-tooling
34
+ work (alignment, settings hygiene), not feature development (evidence: `git log --oneline -20`).
35
+
36
+ ## At a glance
37
+
38
+ - Repo type: Ruby gem (`ecoportal-api.gemspec` present; `rails-app`/`aws-cdk`/browser-extension
39
+ signals absent)
40
+ - Primary language / runtime: Ruby, `required_ruby_version >= 3.2.2` (`ecoportal-api.gemspec`)
41
+ - Entry points: `lib/ecoportal/api.rb` (gem root, `require 'dotenv/load'`), consumed by requiring
42
+ gem-namespaced files (`require 'ecoportal/api'`); `bin/console` and `bin/setup` for local
43
+ development (evidence: `bin/`, `README.md`)
44
+
45
+ ## Discovery & access
46
+
47
+ The gem is distributed via the `Gemfile`/Bundler mechanism (`gem 'ecoportal-api'`, per `README.md`)
48
+ and, per the gemspec, is releasable to rubygems.org via `bundle exec rake release`. Within
49
+ ecoPortal, downstream teams discover it by being in the dependency chain documented in `CLAUDE.md`
50
+ (`ecoportal-api -> ecoportal-api-v2 -> ecoportal-api-graphql -> eco-helpers`). unknown -- needs
51
+ owner input on whether it is announced/listed anywhere beyond that chain (e.g. an internal
52
+ catalogue), and on who outside the immediate dependency chain has access to the GitLab repo.
53
+
54
+ ## Related self-docs
55
+
56
+ - Architecture: `ARCHITECTURE.md`
57
+ - Conventions: `CONVENTIONS.md`
58
+ - Integrations: `INTEGRATIONS.md`
59
+ - Status: `STATUS.md`
60
+ - Compliance: `COMPLIANCE.md`
61
+ - Operations: `OPERATIONS.md`
@@ -0,0 +1,71 @@
1
+ ---
2
+ schema_version: "1.1"
3
+ repo: "ecoportal-api"
4
+ doc: status
5
+ last_generated: "2026-07-23"
6
+ source_head: "69bf8e3"
7
+ review_status: draft
8
+ # self_docs_mode (OD-008): OPTIONAL. Omit for the default (committed). Set to
9
+ # gitignored-regenerate ONLY as an explicit declared opt-out (then document the regen path
10
+ # below and gitignore docs/self-docs/). Optional key with a documented default -- does NOT
11
+ # change schema_version.
12
+ self_docs_mode: committed
13
+ ---
14
+
15
+ # Status -- ecoportal-api
16
+
17
+ **Note:** this is the most time-sensitive self-doc. Refresh it at cycle-end and after structural
18
+ changes. Staleness is detectable via `source_head` vs the current git head.
19
+
20
+ ## Active work
21
+
22
+ From the scanner's `activity_clusters` (last 50 commits) and `docs/worklog.md`:
23
+
24
+ - AI tooling / standards alignment is the dominant recent activity: `.ai-assistance` (27 touches)
25
+ is nearly as hot as `lib` (28 touches) in the last 50 commits, and `CHANGELOG.md` (16 touches)
26
+ reflects the many small AI-alignment merges. Most recent work: deploying the
27
+ `project-self-docs` skill itself (`feat/deploy-project-self-docs`, MR !9, unmerged at the time
28
+ this doc was generated -- see below) and this self-docs generation run
29
+ (`feat/self-docs-generation`).
30
+ - `lib` remains the primary code activity cluster, but this run did not analyse WHICH gem features
31
+ are in flight there -- unknown -- needs owner input on current feature-level priorities inside
32
+ `lib/`.
33
+
34
+ ## Migration state (if any)
35
+
36
+ None found for the gem's own code. The AI-tooling side has an in-flight, not-yet-merged deploy:
37
+ `feat/deploy-project-self-docs` (MR !9) adds the `project-self-docs` skill itself and is not yet on
38
+ `master` as of this run (`git ls-tree origin/master` does not contain
39
+ `.ai-assistance/skills/project-self-docs/`). This self-docs generation branch
40
+ (`feat/self-docs-generation`) is based on that unmerged branch, so its MR should merge AFTER
41
+ !9, not before.
42
+
43
+ ## Known risks
44
+
45
+ - **AI-tooling churn vs code churn:** the AI-tooling directory (`.ai-assistance`) is nearly as
46
+ active as the actual gem source (`lib`) by commit-touch count over the last 50 commits. This is
47
+ not necessarily a problem, but it means a reader of `git log` alone could over-estimate recent
48
+ feature development. Flagging as observed, not judged.
49
+ - **Changes to `Common::*` are a public API** for three downstream gems (`ecoportal-api-v2`,
50
+ `ecoportal-api-graphql`, `eco-helpers` per `CLAUDE.md`) -- any breaking change here has fleet-wide
51
+ blast radius and needs cross-repo coordination, which this self-docs run cannot verify is
52
+ currently happening in practice (process exists on paper in `CLAUDE.md`; adherence in practice is
53
+ unknown -- needs owner input).
54
+ - No CI pipeline file exists in this repo (see `ARCHITECTURE.md` "Diagrams" section) -- unknown --
55
+ needs owner input on whether tests/lint run automatically anywhere before merge, or only locally
56
+ via `bundle exec rspec` / `bundle exec rubocop`.
57
+
58
+ ## Open questions
59
+
60
+ - Is there an external (non-ecoPortal, non-fleet) consumer of the published `ecoportal-api` gem on
61
+ rubygems.org? (See `OVERVIEW.md`, `INTEGRATIONS.md`.) unknown -- needs owner input.
62
+ - What is the actual current feature priority for the gem's own code (as opposed to AI-tooling
63
+ work)? `docs/worklog.md` does not currently record one. unknown -- needs owner input.
64
+ - Does CI run via an inherited/external GitLab CI template not present as a file in this working
65
+ tree? unknown -- needs owner input.
66
+
67
+ ## Recent changes
68
+
69
+ This is the first generation of this self-doc set (`docs/self-docs/` did not exist before this
70
+ run -- scanner reported all seven files as `exists: false`). The machine-readable delta is
71
+ recorded in `CHANGES.jsonl` in this same directory.
@@ -0,0 +1,51 @@
1
+ {
2
+ "schema_version": "1.1",
3
+ "generated_at": "2026-07-23T10:50:08Z",
4
+ "repo_name": "ecoportal-api",
5
+ "repo_type": "ruby-gem",
6
+ "head": "69bf8e3",
7
+ "docs": [
8
+ {
9
+ "file": "docs/self-docs/OVERVIEW.md",
10
+ "purpose": "What the project is, who it serves, current priority, discovery & access",
11
+ "exists": true,
12
+ "content_hash": "a819fa9d200c7ab7"
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": "49a7df216c5bdc07"
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": "f45075d3f3ca043c"
25
+ },
26
+ {
27
+ "file": "docs/self-docs/INTEGRATIONS.md",
28
+ "purpose": "External services + data + permissions, upstream/downstream repos",
29
+ "exists": true,
30
+ "content_hash": "b5cb184b9e829040"
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": "147657c19c13c34e"
37
+ },
38
+ {
39
+ "file": "docs/self-docs/COMPLIANCE.md",
40
+ "purpose": "ISO-27001/audit, data classes + PII, vendors, AI content, leak controls",
41
+ "exists": true,
42
+ "content_hash": "802e24afbd20f486"
43
+ },
44
+ {
45
+ "file": "docs/self-docs/OPERATIONS.md",
46
+ "purpose": "Infrastructure, public exposure + Cloudflare, DevOps audit, usage KPIs",
47
+ "exists": true,
48
+ "content_hash": "475c09e0348a9187"
49
+ }
50
+ ]
51
+ }
data/docs/worklog.md ADDED
@@ -0,0 +1,48 @@
1
+ # Worklog -- ecoportal-api
2
+
3
+ Session handoff log. Newest entry first -- read top-down at the start of every session.
4
+ Format: `standards/workflows/session-handoff.md` in `ep-ai-standards`.
5
+
6
+ ---
7
+
8
+ ## 2026-07-23 -- Self-docs set generated (first time)
9
+
10
+ generated by project-self-docs v0.4.0 per migration none, review_status: draft, run 2026-07-23
11
+
12
+ ### Done
13
+ - Ran `project-self-docs` for the first time in this repo: generated the full
14
+ `docs/self-docs/` set (`OVERVIEW.md`, `ARCHITECTURE.md`, `CONVENTIONS.md`, `INTEGRATIONS.md`,
15
+ `STATUS.md`, `COMPLIANCE.md`, `OPERATIONS.md`) plus `self-docs-index.json` and
16
+ `CHANGES.jsonl`. All docs carry `review_status: draft` -- pending human review before any
17
+ audit/hub use.
18
+ - Several facts were marked `unknown -- needs owner input` where no evidence existed in this
19
+ repo (see each doc): current feature priority, external gem-consumer footprint, CI existence
20
+ outside this working tree, spec coverage thresholds, and a few PII/logging edge cases in
21
+ `COMPLIANCE.md`.
22
+
23
+ ### Blocked / Pending
24
+ - Human review of the new self-docs set (`review_status: draft` on all seven files).
25
+ - Base branch `feat/deploy-project-self-docs` (MR !9, adds the `project-self-docs` skill itself)
26
+ is still unmerged -- this generation's MR should merge AFTER !9.
27
+
28
+ ### Open Questions
29
+ - See `docs/self-docs/STATUS.md` "Open questions" for the full list.
30
+
31
+ ---
32
+
33
+ ## 2026-07-22 -- AI standards alignment (session handoff scaffold)
34
+
35
+ ### Done
36
+ - **AI standards alignment** -- repo brought to `ep-ai-standards` v1.9.1 (see
37
+ `.ai-assistance/standards-version.json`). Foundation scaffold (`CLAUDE.md`,
38
+ `.claude/settings.json`, `.ai-assistance/`, `ep-ai-manager` skill) confirmed in place.
39
+ - **Session-handoff scaffold** -- created this `docs/worklog.md` and added the
40
+ "Read these first -- every session" pointer section to `CLAUDE.md`, closing the two
41
+ remaining `check-alignment.sh` residuals (`docs/worklog.md` missing, `CLAUDE.md` not
42
+ referencing it) that the earlier kit-only alignment pass deliberately left open.
43
+
44
+ ### Blocked / Pending
45
+ - None.
46
+
47
+ ### Open Questions
48
+ - None.
@@ -5,8 +5,14 @@ module Ecoportal
5
5
  module WithRetry
6
6
  DELAY_REQUEST_RETRY = 5
7
7
  RETRY_ATTEMPTS = 5
8
+ # HTTP::TimeoutError is a SIBLING of HTTP::ConnectionError in the http gem's
9
+ # hierarchy (ConnectTimeoutError < TimeoutError < Error), so it must be listed
10
+ # explicitly: without it a transient connect/read/write timeout is never retried
11
+ # and kills a whole batch mid-loop (live-confirmed on the Farmers native card,
12
+ # 2026-07-30 — see multi_org_api FARMERS_NATIVE_MIGRATION.md).
8
13
  HANDLED_CONNECTION_ERRORS = [
9
14
  HTTP::ConnectionError,
15
+ HTTP::TimeoutError,
10
16
  IOError
11
17
  ].freeze
12
18
 
@@ -1,5 +1,5 @@
1
1
  module Ecoportal
2
2
  module API
3
- VERSION = '0.10.16'.freeze
3
+ VERSION = '0.10.17'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ecoportal-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.16
4
+ version: 0.10.17
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tapio Saarinen
@@ -200,6 +200,35 @@ executables: []
200
200
  extensions: []
201
201
  extra_rdoc_files: []
202
202
  files:
203
+ - ".ai-assistance/.gitignore"
204
+ - ".ai-assistance/bridge/.gitignore"
205
+ - ".ai-assistance/bridge/CLAUDE.md"
206
+ - ".ai-assistance/bridge/archive/.gitkeep"
207
+ - ".ai-assistance/bridge/inbox/.gitkeep"
208
+ - ".ai-assistance/bridge/outbox/.gitkeep"
209
+ - ".ai-assistance/capabilities/assumptions-log.md"
210
+ - ".ai-assistance/scripts/bridge-inbox-check.sh"
211
+ - ".ai-assistance/scripts/bridge-init.sh"
212
+ - ".ai-assistance/scripts/confine-to-subtree.sh"
213
+ - ".ai-assistance/scripts/dirty-tree-guard.sh"
214
+ - ".ai-assistance/scripts/distill_procedural.py"
215
+ - ".ai-assistance/scripts/log-mcp-access.sh"
216
+ - ".ai-assistance/scripts/log-skill-usage.sh"
217
+ - ".ai-assistance/scripts/log_mcp_access.py"
218
+ - ".ai-assistance/scripts/observe-session.sh"
219
+ - ".ai-assistance/scripts/observe_session.py"
220
+ - ".ai-assistance/scripts/protect-host-paths.sh"
221
+ - ".ai-assistance/scripts/scrub.py"
222
+ - ".ai-assistance/scripts/scrub.py.sha256"
223
+ - ".ai-assistance/scripts/surface-procedural.sh"
224
+ - ".ai-assistance/scripts/surface_procedural.py"
225
+ - ".ai-assistance/skills/ep-ai-manager/SKILL.md"
226
+ - ".ai-assistance/skills/project-self-docs/SKILL.md"
227
+ - ".ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py"
228
+ - ".ai-assistance/standards-version.json"
229
+ - ".ai-assistance/version.json"
230
+ - ".claude/.gitignore"
231
+ - ".claude/settings.json"
203
232
  - ".gitignore"
204
233
  - ".markdownlint.json"
205
234
  - ".rspec"
@@ -214,6 +243,16 @@ files:
214
243
  - Rakefile
215
244
  - bin/console
216
245
  - bin/setup
246
+ - docs/self-docs/ARCHITECTURE.md
247
+ - docs/self-docs/CHANGES.jsonl
248
+ - docs/self-docs/COMPLIANCE.md
249
+ - docs/self-docs/CONVENTIONS.md
250
+ - docs/self-docs/INTEGRATIONS.md
251
+ - docs/self-docs/OPERATIONS.md
252
+ - docs/self-docs/OVERVIEW.md
253
+ - docs/self-docs/STATUS.md
254
+ - docs/self-docs/self-docs-index.json
255
+ - docs/worklog.md
217
256
  - ecoportal-api.gemspec
218
257
  - lib/ecoportal/api.rb
219
258
  - lib/ecoportal/api/common.rb