Repository navigation
Codex lane identity in the OTel pipeline: ecosystem.lane kept and promoted to a metric label, lane alerts, a Grafana row and a separate ntfy topic for lane warnings - #671
Conversation
…alerts, Grafana row, quiet ntfy route (A5) - collector.yaml: keep the resource attribute ecosystem.lane for logs and metrics, shape-checked like env (a short lowercase name, else deleted), and promote it to the ecosystem_lane metric label with the prometheus exporter's resource_constant_labels (replaces the deprecated resource_to_telemetry_conversion, opentelemetry-collector-contrib v0.161.0 exporter/prometheusexporter README L30-35, config.go L76-77). - codex-identity-launcher.sh.example: document OTEL_RESOURCE_ATTRIBUTES= ecosystem.lane=<lane> at a lane's launch; the entry loop already keeps it next to the fresh service.instance.id (comment only). - Prometheus rules: new group ecosystem-lanes with CodexLaneGoalBlocked and CodexLaneUsageLimited (for: 0m, keep_firing_for: 30m), CodexLaneToolErrorBurst and CodexLaneMcpErrorRatio, scope codex-lanes. - Grafana: a "Codex lanes" row grouped by ecosystem_lane (turns, tool-call failure share, MCP error share, goal events, compactions). - Alertmanager: codex-lanes warnings to a quiet ntfy topic, critical ones to the existing alert topic. - Tests: rule count 17 -> 21; promtool rule tests, amtool route tests and native otelcol-contrib 0.161.0 checks for the label and the shape check. Co-Authored-By: Claude Opus 5.5 <[email protected]>
… protocol) Taken from main (1f5a791) and re-registered with host_receipts.register_file: the collector config, the identity launcher, the Prometheus rules, the dashboard and Alertmanager templates, and the three observability test files. python3 scripts/validate.py: passed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 86b9bd2706
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Exact-head Codex source FINDINGS / HOLD on One introduced behavior mismatch needs correction: the receiver template promises low priority and adds The lane resource bridge has supporting source: Codex rust-v0.160.0 Custody: independently recomputed full Git blob/SHA256/byte bindings for all nine owned originals and the 32 captured non-null primary/source entries (41 checks including repeated owned entries; no mismatch). All eight payload registrations match. All nine prior #613 memberships remain unchanged across declared base Owner commands and synthetic checks remain owner reports. Live apply, lane relaunch and Grafana rendering remain UNRUN. This comment authorizes no service/configuration change or notification delivery and does not reopen #613. |
…oes not honour The Codex root's source read of 86b9bd2 (ntfy 2.28.0 at 10cb6506: server.go L1210, types.go L117, server_template.go L58 and L103) shows a query priority is ignored when template=alertmanager renders. Lane warnings keep their own ecosystem-lanes topic; the test now asserts no priority parameter is promised. Co-Authored-By: Claude Opus 5.5 <[email protected]>
…rity claim); re-register the corrected files (hot-file protocol, last commit) Co-Authored-By: Claude Opus 5.5 <[email protected]>
5b136fd to
cc59598
Compare
|
SOURCE ACCEPT WITH LIMITS at exact head The earlier low-priority finding is repaired. The template routes to a separate topic and removes Root read the complete old86b→cc595 literal/raw delta: exactly the template, test and registry. All six other owned bodies/OIDs are unchanged. Root verified 21 complete original bindings (nine old/new owned bodies and three reused pinned primary bodies), zero mismatches. Registry changes exactly the two payload bindings; all 9,539 unaffected full ordered rows and all non-file sections (193 receipts/29 convergence records) are exact. Small editorial note: the current PR body still says “a quiet ntfy route” in its opening, though its correction paragraph explicitly states separate topic/no priority. Align that phrase with the final behavior; it does not preserve the old priority promise. Live apply/relaunch/rendered OTel-label behavior remains unqualified by this review. Required current-head CI and owner acceptance remain separate. The raw branch's differences from main |
…et the ecosystem-lanes topic (#671 review) - ecosystem-alertmanager.yml.example: both codex-lanes routes set group_by [alertname, scope, ecosystem_lane]. A child route inherits the parent's group_by unless it sets one (Alertmanager v0.34.1 docs/configuration.md L193-194, L209-219; dispatch/route.go L74, L90-95), and the lane rules sum job away, so every lane of one alert shared one group and one notification status. - codex-identity-launcher.sh.example: ECOSYSTEM_LANE adds ecosystem.lane=<lane> to OTEL_RESOURCE_ATTRIBUTES. The value must match the Collector's ^[a-z][a-z0-9_-]{0,31}$ (listed characters, not a locale-dependent range); anything else is dropped with a stderr warning that does not repeat it, and codex still starts. An ecosystem.lane entry already present (a trimmed key with '=', as opentelemetry-rust v0.31.0 env.rs L45-58 reads it) wins. The marker line and the final exec line are unchanged. - observability/collector/README.md: a Codex lane label section with the per-lane launch recipe and the residuals (per-lane values come with the command center's relaunch scripts; the host launcher needs apply.sh --only codex-launcher). - observability/backends/README.md, observability/README.md: subscribe to and poll both ecosystem-alerts and ecosystem-lanes. - Tests: the structural route check; amtool routes for two lanes; the pinned Alertmanager 0.34.1 groups two lanes into two groups per route, and one group without the override (negative control; webhooks go to a refusing loopback socket, never the live ntfy); every receiver topic is in both READMEs' poll commands; launcher lane, malformed, explicit-entry and dash cases, and the pre-lane launcher (1f5a791 on main) sets no lane (negative control). Co-Authored-By: Claude Opus 5.5 <[email protected]>
…hot-file protocol, last commit) host_receipts.register_file for the seven files changed in fc3849a: observability/README.md, observability/backends/README.md, observability/backends/templates/ecosystem-alertmanager.yml.example, observability/collector/README.md, observability/collector/codex-identity-launcher.sh.example, tests/test_observability_backends_alerts.py and tests/test_observability_writer_identity.py. scripts/validate.py passed. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
SOURCE ACCEPT WITH LIMITS for #671 head Root independently verified 21 unique present body/Git bindings from the 12 current owned bodies and old/new/main delta map, all 24 named pinned primary bodies, 11 owned payload registry bindings, 10,231 foreign old Git memberships, 9,530 full ordered foreign registration rows and all non-files registry fields. The eight-path delta preserves the accepted foreign source. These comparisons concern old accepted head to this head; they do not assert a prospective merge against main The two lane routes now group by The documented residuals remain material: command-center per-lane assignment and relaunch, host launcher replacement/render readback, and native Grafana/Alertmanager application have not been independently performed here. An unset lane remains unattributed. This source verdict is no host installation, runtime emission, notification delivery, passwordless operation or role qualification acceptance. Prior unavailable named primary paths remain retained; no credential/auth store or active client configuration was read. No root source edits, test/fixture execution, host apply, merge or lane direction occurred. |
|
Actual landing verified — #671. GitHub records merge at 2026-10-04T00:03:27Z, reviewed head Root independently rehashed 134 captured bindings, rederived all four commit identities and complete Git trees, and checked all 11 landed payload mode/type/OIDs and complete registration rows against the reviewed head. All 10,265 ordered foreign Git tuples, 9,559 ordered full foreign evidence rows, 9,570 file positions and non-file metadata—including 193 receipts and 29 convergence records—are preserved exactly from B290. The integrated registry changes only the 11 reviewed owned rows. Native acquisition records retain all 40 exits0. The landed dashboard source is installed-on-main source evidence. It supplies no new destination application, service restart, schedule/GPU/provider acceptance or runtime qualification. Root performed no merge or CI retry. Frozen custody manifest: 80,408B / SHA256 |
Scope
ecosystem.lane(shape-checked) for logs and metrics, and the Prometheus exporter promotes it to theecosystem_lanelabel. A newecosystem-lanesrule group, a "Codex lanes" Grafana row and a quiet ntfy route use the label. This is fix A5 of the 2026-10-03 Codex lane review (section 3A item 5; section 4 "Lane identity", "Signals, thresholds and where each is shown", "Rule mechanics").1f5a791b02a230aced670c88bab3d3d0ebcf401a(origin/main at push time)lane:foundationobservability/collector/collector.yamlobservability/collector/codex-identity-launcher.sh.example(comment only)observability/backends/templates/ecosystem-prometheus-rules.yml.exampleobservability/backends/templates/ecosystem-dashboard.json.exampleobservability/backends/templates/ecosystem-alertmanager.yml.exampletests/test_observability_backends_alerts.py,tests/test_observability_tool_names.py,tests/test_observability_writer_identity.pymanifests/evidence.json(hot file; registry edit is the last commit, per the hot-file protocol indocs/lanes.md)Commits:
e1b4decc8(content),86b9bd270(registry, last).SOTA sources
v0.161.0); the binary is the installedotelcol-contrib0.161.0 thatobservability/collector/README.mdpins.exporter/prometheusexporter/README.mdL30-35:resource_constant_labels(includedpatterns), andresource_to_telemetry_conversionmarked deprecated ("useresource_constant_labelsinstead"). L91-100: other resource attributes stay ontarget_info.exporter/prometheusexporter/config.goL45-46 (the field), L76-77 (configuring both options is a validation error).exporter/prometheusexporter/factory.goL66-73: the exporter is wrapped withresource_constant_labelswhen that option is set.pkg/resourcetotelemetry/resource_to_telemetry.goL49-51 (IsEmpty: the removedenabled: falseblock was empty, i.e. the default) and L159-175 (WrapMetricsExporter).IsMatchanddelete_key(pkg/ottl/ottlfuncs/README.md), following the existingenvshape check intransform/privacy.sdk/src/resource/env.rs: Codex readsOTEL_RESOURCE_ATTRIBUTES(already cited by the launcher).rust-v0.160.0(commita956835; source for the metric choices):codex-rs/otel/src/metrics/names.rsL3 (codex.tool.call), L35 (codex.turn.e2e_duration_ms), L53-54 (codex.goal.usage_limited,codex.goal.blocked).codex-rs/core/src/tasks/mod.rsL71 (codex.task.compact), L404-406 (the turn timer starts for each task; the panel counts its records).codex-rs/core/src/session/handlers.rsL342-350:codex.conversation.turn.countis written once, at session shutdown, as the whole session's turn count, so it is not used as a turn rate.docs/configuration/alerting_rules.mdL42-45:keep_firing_for.docs/configuration/unit_testing_rules.mdL98-100:staleinput values.docs/feature_flags.mdL64-86:created-timestamp-zero-ingestioninjects the 0 sample that letsincrease()see a new event series.docs/configuration.mdroutematch/continue(L222-229), andamtool config routes test.v2.28.0):server/server.goL1200 and L1210:templateandpriorityare read throughreadParam.server/util.goL56-62:readParamfalls back to query parameters.template=alertmanager, ntfy 2.28.0 (10cb6506) renders in file-template mode without the query priority (server/server.goL1210,server/types.goL117,server/server_template.goL58 and L103; the built-intemplates/alertmanager.ymlhas no priority field). The lane route therefore sets no priority: lane warnings go to their ownecosystem-lanestopic, which the user can mute separately, and the test asserts nopriority=is promised.Evidence-class table
otelcol-contrib validate(0.161.0) on the README-recipe render: exit 0. Control: addingresource_to_telemetry_conversion: {enabled: true}exits 1 with "cannot configure both resource_to_telemetry_conversion and resource_constant_labels".ecosystem.lanebecomes theecosystem_lanelabel; a malformed value is dropped;service.versionis not promotedNativeCollectorTests.test_lane_name_becomes_a_label_and_a_malformed_one_is_droppedon otelcol-contrib 0.161.0. Controls: withoutresource_constant_labels, proc-1 has no label (fails); without the metric shape check,Trading Laneleaks through (fails).ecosystem.laneon the resource; a malformed value is droppedtest_observability_tool_namesNativeCollectorTests.test_lane_name_stays_on_the_resource_and_a_malformed_one_is_droppedpromtool check rules(3.15.0) on the configure.py render:SUCCESS: 21 rules foundCodexLaneRuleTests(promtool test rules). Control: withkeep_firing_forremoved, the 40m expectation fails.for: 15m)CodexLaneRuleTestslocal-ntfy-lanes, critical lane alerts tolocal-ntfy, other routes unchangedamtool config routes test --verify.receivers(0.34.1) inCodexLaneRouteTests. Control: a wrong receiver exits 1./api/v1/label/__name__/valuesand/api/v1/seriesat 127.0.0.1:19090 (Prometheus 3.15.0)increase(...[15m]) > 0catches itsum(increase(...[15m]))reads 1.01-1.10 from 08:04 to 08:18successfrom the live Prometheus; values group underunattributed, since no series carries the label yetservice.instance.id=<uuid>,ecosystem.lane=root; with an inherited id:parent-1/<uuid>,ecosystem.lane=tokenecosystem.laneLocal commands run
Decision record
None. This PR implements fix A5 as specified. The thresholds are starting values; the 7-day re-tune is due as a dated decision record.
Residuals and live apply (not done here)
collector.yamlwith the log and metric resource statements and the exporter block (the datedevidence/artifacts/telemetry-writer-identity-20260926/host/merge_collector.pycarries onlygroupbyattrs/sessionand the metric statements, not the log statements or the exporter), validate it, and restartecosystem-otelcol;OTEL_RESOURCE_ATTRIBUTES=ecosystem.lane=<lane>through the identity launcher, then confirm that one parent series and one child series carryecosystem_lane.unattributed, and the alerts carry an emptyecosystem_lane.ecosystem_codex_goal_usage_limited_totalis a known name here, but it had no series in the last 24 h, so CodexLaneUsageLimited has only synthetic coverage.[otel]exporters pointed at a reachable collector.created-timestamp-zero-ingestion(the host apply already requires it). Re-check them if the host moves tost-storageonly.match. Alertmanager 0.34.1 marks routematchdeprecated in favour ofmatchers. The new routes follow the existing route's form; migrating every route together is a separate change.Host evidence
Not applicable: no files under
evidence/hosts/changed.python3 scripts/host_receipts.py validatepasses for every new/changed receipt. (n/a)scripts/host_receipts.py review) or explicitly requested in this PR. (n/a)platform_statuschange is made from a host receipt alone; a platform status flip still needs the matrix rule indocs/component-evidence-matrix.md. (n/a)Checklist
version comment (no floating tags). (none changed)
permissions: contents: read(or a narrower, explicitly justified addition). (none changed)
added without a documented owner.
moved or overwritten).
🤖 Generated with Claude Code