Story: Entity classification and drift baseline: ores.analytics

Table of Contents

This page documents a story in Sprint 25. It captures the goal, current status, acceptance criteria, and the tasks that compose it.

1. Goal

Bring ores.analytics to the state the compass-codegen-fix-drift skill defines: every codegen-eligible entity bound to a profile or recorded as a genuine no-match, zero-diff regeneration verified, and any real gap the check surfaces fixed rather than skipped. Once trusted, analytics-cpp joins the known-drift-free registry that the drift gate checks.

2. Status

Field Value
State DONE
Parent sprint Sprint 25
Now Nothing.
Waiting on Nothing.
Next Nothing.
Last touched 2026-09-23

3. Acceptance

  • Every ores.analytics entity is bound to a matching Variability Profile, or recorded as a genuine no-match with a documented reason.
  • Every rebound entity is regenerated and diffed against its pre-rebind checked-in output; zero diff is the pass condition, and any non-zero diff is fixed, not worked around.
  • Full local build clean, schema drift current per compass db status, full ctest suite green after regeneration.
  • analytics-cpp joins the KNOWN_DRIFT_FREE registry in check_component_drift.py (skill step 8), and the compass-pr-raise skill's local codegen-drift check runs --all over the registry, so future PRs touching ores.analytics fail on any regeneration drift.
  • The ad hoc task 'Apply safe drift to analytics-cpp' is reconciled with this story. Amended 2026-09-17: it stays DONE, not ABANDONED. It completed through PR #1893 and delivered the profile assignment and the service flags this story inherited, so an ABANDONED stamp would misdescribe it. The reconciliation is recorded in both records instead.
  • The known starting-point wrinkles already recorded (service_find_by_uuid on pricing_model_config/pricing_model_product/pricing_model_product_parameter, service_find_by_code on pricing_model_config, service_find_prefix on pricing_engine_type) are resolved as part of reaching zero drift.
  • Done shape (2026-09-07 program decision): the bind task closes at the drift gate. The story closes only after the post-merge live system test: recreate the database, provision a tenant, and exercise this component's flows. Defects the test surfaces get follow-up tasks on this story. The compute/iam binds set this shape: their live system test caught a service-grant defect ctest cannot see.

4. Tasks

Task State Start End Description
Bind ores.analytics entities to profiles; verify zero-diff regen DONE 2026-09-17 2026-09-17 Implement profile binding for the analytics-cpp catalogue entry, rebind every matching entity, regenerate, and confirm byte-identical output, following the compass-codegen-fix-drift skill. Known starting point: set service_find_by_uuid on pricing_model_config, pricing_model_product, pricing_model_product_parameter; service_find_by_code on pricing_model_config; service_find_prefix on pricing_engine_type.

5. Decisions

  • 2026-09-17. The story was opened while its work was already on main. The analytics bind landed on 2026-09-11 under the codegen drift-clear task in a different environment, so this story and its bind task still read BACKLOG against a component that was already bound, already regenerating byte-identical, and already in the drift registry. Neither record was reconciled at the time. The lesson is that the registry and the backlog are two views of one fact, and joining the registry should close or amend the bind task in the same change.
  • 2026-09-17. The superseded-task acceptance line is amended rather than satisfied. It assumed the ad hoc task was still open. It was not: it had already completed through PR #1893, and marking a delivered task ABANDONED would have put a false statement in the record to satisfy a true-sounding one. The reconciliation is a cross-reference in both documents.
  • 2026-09-17. The remaining per-entity :has_tenant_id: was removed from all four entities. Both profiles already fix that feature to true, so the explicit line was redundant, and every other bound component carries the profile bind alone. The change is proven output-neutral by regeneration: no generated file moves.

6. Out of scope

7. Result

Closed at sprint 25 close. Every task is done.

Emacs 29.3 (Org mode 9.6.15)