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.
- checksums.yaml +4 -4
- data/.ai-assistance/.gitignore +2 -0
- data/.ai-assistance/bridge/.gitignore +10 -0
- data/.ai-assistance/bridge/CLAUDE.md +96 -0
- data/.ai-assistance/bridge/archive/.gitkeep +0 -0
- data/.ai-assistance/bridge/inbox/.gitkeep +0 -0
- data/.ai-assistance/bridge/outbox/.gitkeep +0 -0
- data/.ai-assistance/capabilities/assumptions-log.md +23 -0
- data/.ai-assistance/scripts/bridge-inbox-check.sh +119 -0
- data/.ai-assistance/scripts/bridge-init.sh +86 -0
- data/.ai-assistance/scripts/confine-to-subtree.sh +58 -0
- data/.ai-assistance/scripts/dirty-tree-guard.sh +96 -0
- data/.ai-assistance/scripts/distill_procedural.py +602 -0
- data/.ai-assistance/scripts/log-mcp-access.sh +24 -0
- data/.ai-assistance/scripts/log-skill-usage.sh +79 -0
- data/.ai-assistance/scripts/log_mcp_access.py +158 -0
- data/.ai-assistance/scripts/observe-session.sh +13 -0
- data/.ai-assistance/scripts/observe_session.py +287 -0
- data/.ai-assistance/scripts/protect-host-paths.sh +135 -0
- data/.ai-assistance/scripts/scrub.py +1149 -0
- data/.ai-assistance/scripts/scrub.py.sha256 +6 -0
- data/.ai-assistance/scripts/surface-procedural.sh +9 -0
- data/.ai-assistance/scripts/surface_procedural.py +101 -0
- data/.ai-assistance/skills/ep-ai-manager/SKILL.md +519 -0
- data/.ai-assistance/skills/project-self-docs/SKILL.md +259 -0
- data/.ai-assistance/skills/project-self-docs/scripts/self_docs_scan.py +378 -0
- data/.ai-assistance/standards-version.json +12 -0
- data/.ai-assistance/version.json +8 -0
- data/.claude/.gitignore +2 -0
- data/.claude/settings.json +128 -0
- data/CHANGELOG.md +8 -5
- data/CLAUDE.md +95 -71
- data/docs/self-docs/ARCHITECTURE.md +145 -0
- data/docs/self-docs/CHANGES.jsonl +7 -0
- data/docs/self-docs/COMPLIANCE.md +66 -0
- data/docs/self-docs/CONVENTIONS.md +74 -0
- data/docs/self-docs/INTEGRATIONS.md +62 -0
- data/docs/self-docs/OPERATIONS.md +64 -0
- data/docs/self-docs/OVERVIEW.md +61 -0
- data/docs/self-docs/STATUS.md +71 -0
- data/docs/self-docs/self-docs-index.json +51 -0
- data/docs/worklog.md +48 -0
- data/lib/ecoportal/api/common/client/with_retry.rb +6 -0
- data/lib/ecoportal/api/version.rb +1 -1
- 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
|
|
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.
|
|
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
|