Skip to content

compass(design): metrics push and refresh are daemon timers on simulated time; fix two stale doc-01 statements - #584

Merged
jgong5 merged 2 commits into
feature/atomcompass_newfrom
compass/issue-535-577-docs
Oct 3, 2026
Merged

jgong5 merged 2 commits into
feature/atomcompass_newfrom
compass/issue-535-577-docs

Conversation

@jgong5

@jgong5 jgong5 commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Closes #535. Closes #577. Ready for review. No blocking issues.

The execution and time model, the metrics doc, the design README and the sync inventory now agree that the metrics push, refresh and scrape are daemon timers on simulated time (owner ruling 2026-10-02), and the time model no longer describes two Atomesh timeouts as constants or names a deleted test.

Dev record

Named result

None: documentation and a data file (#535, #577).

Gates

branch @ 9ac55a06c (tree 5c7ead12c), scripts/compass/gate_cpu.sh on node 18: 5811 passed, 155 skipped, 3 xfailed, 0 failed, GATE_CPU_RC=0. No Python file changed, so ruff has nothing to check.

Evidence

Generated with Claude Code

…ted time; fix two stale doc-01 statements

Doc 11 D72 now says the metrics push and refresh run on the LP clock as
daemon timers, and lists why each reason of its first version no longer
holds; its transport diagram and decision-log rows follow. The design
README's summary of doc 11 says the same.

sync_sites.json moves the refresh sleep and both push anchors from
ignore to C2 (mechanism K7 unchanged), and its history field and the
audit README name that one reclassification.

Doc 01: the daemon-deadline list adds uvicorn's server tick and
keep-alive, which are outside atom/ and so outside the audit; the
Atomesh open issue names only the compiled-in
DEFAULT_WORKER_HTTP_TIMEOUT_SECS; the blob table no longer names the
deleted test_kv_blob_doc_table.py.

Closes #535. Closes #577.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment thread atom/compass/audit/sync_sites.json Outdated
"K9": "outside the model: outside the simulated window, inside code the simulator replaces, or cannot park"
},
"history": "category and why are the first classification, kept as written; rows added since carry none. mechanism and mechanism_why are what a simulated run does at the site: mechanism_why is empty only where the mechanism is the one the row's category named (A K1, B K5, C1 K8, C2 K7, ignore K9) and why already says it.",
"history": "category and why are the first classification, kept as written except the metrics cadences, which an owner ruling moved from ignore to C2; rows added since carry none. mechanism and mechanism_why are what a simulated run does at the site: mechanism_why is empty only where the mechanism is the one the row's category named (A K1, B K5, C1 K8, C2 K7, ignore K9) and why already says it.",

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Finding 3. The ruling changes what a simulated run does at these sites, which mechanism (K7) already said before this PR; moving category to C2 adds the file's only exception to its own history rule and overwrites the first classification's why. Keep category: ignore and the original why on the three rows, put the daemon wording in mechanism_why, and drop this clause. That form passes tests/compass/test_sync_inventory.py (31 passed at this head).

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 pushed 9ac55a06c: the three rows keep category: ignore and their original why; mechanism_why now says the cadence is a daemon timer on simulated time, and the history exception is gone. tests/compass/test_sync_inventory.py: 31 passed.

Comment thread atom/compass/audit/README.md Outdated
since carry no category. Each category named one mechanism — A K1, B K5, C1
K8, C2 K7, `ignore` K9 — and wherever a row's mechanism is a different one,
sets a cadence), `ignore` and `undecided`. They are history, except the
metrics push and refresh cadences, which an owner ruling moved from `ignore` to

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Finding 3: the same exception as the history field in sync_sites.json. Drop it with that change.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Round 2 pushed 9ac55a06c: the exception is dropped; atom/compass/audit/README.md is byte-identical to the tip again.

@jgong5

jgong5 commented Oct 3, 2026

Copy link
Copy Markdown
Owner Author

Review round 1. Verdict: CHANGES NEEDED at head cb6cf3225dba358462031a8ff601cb2ab7bfb459. REQUEST CHANGES: 3 required.

  1. The metrics doc's transport diagram, which compass(design): metrics cadence on simulated time, and the all-waiting state is the finish #535 names, still labels the /metrics read "wall scrape"; the revised decision scrapes on simulated time. Relabel it.
  2. Its timestamp class calls _last_refresh "a wall-clock instant"; the revised decision stamps simulated time. Drop it from the examples or mark it simulated.
  3. Keep category and why as written on the three metrics rows of sync_sites.json (inline). mechanism K7 already carries the ruling: put "daemon" in mechanism_why and drop the exception from history and the audit README (principle 3).

Accepted with reservation: the docs state the engine push and the scrape as daemon ahead of #460 and #472; a decision is the spec, and both issues carry it.

Checked: every code claim, at the tip (details). The base is the tip, so the developer's gate stands.

Watch next: #533 lists the Anthropic ping and the silence warning as daemon; DAEMON_TIMERS names neither.

Filed: #585, line citations left in the other design docs.

ponytail-review: sync_sites.json, audit/README.md: delete: the category move and its exception clause (finding 3). net: -1 lines possible.

Evidence
  • Code claims at cb6cf3225: EngineCore.busy_loop and DPEngineCoreProc.busy_loop read clock.now(time.monotonic) before the push gate; AtomMetricsExporter.update stamps clock.now(time.time); _metrics_refresh_loop sleeps _METRICS_REFRESH_INTERVAL_SECONDS (5.0); DAEMON_TIMERS in atom/utils/compass_loop.py names _metrics_refresh_loop, Server.main_loop and both keep-alive handlers; CompassEventLoop.time is the LP clock; uvicorn 0.52.4 Server.main_loop sleeps 0.1; worker_manager.rs::DEFAULT_WORKER_REQUEST_TIMEOUT_SECS is the clap default of --worker-request-timeout-secs, which the time model's bounds table sets large; tests/compass/test_kv_blob_site.py asserts one assignment site per backend and reads only connector source; test_kv_blob_doc_table.py is absent; 92f1fdafe is an ancestor of the head. Cross-references to the time model's detector (3), D5.1 and D9 item 13 resolve. compass(engine): TAR and NER in the step loops, engine timers on the virtual clock, and the I2 lock guard #460 declares the push as t_daemon; compass: the vertical slice on the PDES runtime — one request end to end at TP1, three LPs, co-hosted CA #472 passes the scrape to next_event.
  • No other design text still says the metrics clocks stay real. The time model's decision log row for D5 still reads "revising 11 D72"; true as dated history, optional reword.
  • tests/compass/test_sync_inventory.py at the head: 31 passed. Developer's revert-red reproduced (push anchor at engine_core.py line 320 back to ignore, mechanism_why empty): 1 failed, 30 passed, test_every_mechanism_agrees_with_the_rest_of_its_row. Finding 3's form (all three rows ignore, non-empty mechanism_why): 31 passed. Two first attempts did not apply (patch-script assertion on a whitespace mismatch) and were discarded, then re-run.
  • No design-doc identifier in sync_sites.json; no Python changed.
  • Gate: developer's run at cb6cf3225, 5811 passed, 0 failed, GATE_CPU_RC=0. The base d2929f8df is the tip of feature/atomcompass_new, so the merged tree is this tree; not re-run.

Generated with Claude Code

… and stamp on simulated time

Review round 1 of #584. The three metrics rows of sync_sites.json keep
category ignore and their original why; the daemon wording moves to
mechanism_why, where K7 already carried the ruling, and the history
exception and its audit README twin are dropped. In the metrics doc the
transport diagram labels the /metrics read as the traffic LP's scrape on
simulated time, and the timestamp class marks _last_refresh as simulated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@jgong5

jgong5 commented Oct 3, 2026

Copy link
Copy Markdown
Owner Author

Developer round 2. Round 2 pushed 9ac55a06c; all three findings addressed.

  1. Transport diagram: /metrics is the traffic LP's daemon scrape on simulated time.
  2. Timestamp class: _last_refresh marked as stamping simulated time.
  3. sync_sites.json: category: ignore and the original why kept; daemon wording in mechanism_why; both exceptions dropped.

branch @ 9ac55a06c: 5811 passed, 155 skipped, 3 xfailed, 0 failed, GATE_CPU_RC=0. No Python changed.

Evidence
  • tests/compass/test_sync_inventory.py at 9ac55a06c: 31 passed.
  • atom/compass/audit/README.md is byte-identical to the tip.
  • Revert-red for finding 3: the engine_core.py push anchor's mechanism_why emptied fails test_every_mechanism_agrees_with_the_rest_of_its_row with atom/model_engine/engine_core.py:320: the mechanism is not the one its category named; say why. Findings 1 and 2 are prose and carry no pin.

Generated with Claude Code

@jgong5

jgong5 commented Oct 3, 2026

Copy link
Copy Markdown
Owner Author

Review round 2. Verdict: APPROVE at head 9ac55a06c17340945f4e9782a71ea0aacbcbef90. APPROVE.

All three round-1 findings are fixed: the transport diagram scrapes on simulated time, the timestamp class marks _last_refresh as simulated, and the three metrics rows of sync_sites.json keep category: ignore and their first why, with the daemon wording in mechanism_why. history and atom/compass/audit/README.md match the tip again.

Checked: the round-2 delta cb6cf3225..9ac55a06c and the whole PR against the tip b64553752. #558 touches only atom/compass/clock/ and tests/compass/clock/, which no test reading this PR's files covers; the merge is clean.

Accepted with reservation: #535's table asked for C2 on the three rows; the PR keeps ignore per round-1 finding 3, and K7 carries the ruling.

Watch next: when #460 and #472 land, the engine push and the traffic-LP scrape join DAEMON_TIMERS as this PR states.

ponytail-review: the delta removes a line and adds no structure. Lean already. Ship.

Evidence
  • tests/compass/test_sync_inventory.py at the head: 31 passed. On the merged tree 89a8d0c57 (git merge-tree of the tip and the head, rc 0): 31 passed.
  • Revert-red reproduced: the engine_core.py push anchor at line 320 with mechanism_why emptied, line count unchanged: 1 failed, 30 passed, test_every_mechanism_agrees_with_the_rest_of_its_row, atom/model_engine/engine_core.py:320: the mechanism is not the one its category named.
  • The refresh sleep site's mechanism_why emptied: 2 failed, 29 passed, the same test plus test_a_seeded_inconsistent_row_is_refused[K7-change2-a virtual timer needs], whose fixture row is that site.
  • Full diff against the tip in sync_sites.json: three mechanism_why strings only. atom/compass/audit/README.md: no diff.
  • Diagram box borders stay in columns 4 and 50 on every row.
  • No Python changed, and the tip moved only in files no inventory test reads, so the developer's gate at 9ac55a06c (5811 passed, 0 failed, GATE_CPU_RC=0) stands for the merged tree; not re-run.

Generated with Claude Code

@jgong5
jgong5 marked this pull request as ready for review October 3, 2026 12:27
@jgong5
jgong5 merged commit 67e8685 into feature/atomcompass_new Oct 3, 2026
@jgong5 jgong5 added module: compass-audit atom/compass/audit/ and its tests module: compass-design atom/compass/design/ and its tests labels Oct 10, 2026
jgong5 added a commit that referenced this pull request Oct 10, 2026
Resolved 11_metrics_support.md and README.md to the base side in every
conflicted hunk: #584 landed the owner's 2026-10-02 ruling on D72 (push and
refresh as daemon timers on simulated time, end of run by #533's essential
horizon), which supersedes this branch's D72 text and its end_workload
ending. Kept from this branch: the D74 note that the per-step series
coexists with the scrape series, and the emission-cost row naming K1.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
jgong5 added a commit that referenced this pull request Oct 10, 2026
…time (#444)

compass(design): doc 11 describes the /metrics observer on simulated time

The metrics push and refresh were already daemon timers on simulated time
(#584). This describes the /metrics observer that the time model says the
metrics document carries: its channels, its snapshot source and its
staleness reading. A scrape's GET and response are registered arrivals that
raise the essential horizon, so a scrape at H extends it by one round trip.
The emission-cost row now names the time model's mechanisms. The 1P1D scrape
waits on the owner ruling in #522.

Part of #443.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

module: compass-audit atom/compass/audit/ and its tests module: compass-design atom/compass/design/ and its tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant