Skip to content

docs(exercises): rewrite 00-baseline in house style, quality-pass 01-06 - #183

Merged
vovinacci merged 3 commits into
mainfrom
docs/exercises-quality
Jul 24, 2026
Merged

docs(exercises): rewrite 00-baseline in house style, quality-pass 01-06#183
vovinacci merged 3 commits into
mainfrom
docs/exercises-quality

Conversation

@vovinacci

@vovinacci vovinacci commented Jul 24, 2026

Copy link
Copy Markdown
Owner

Bring the exercises to one consistent, reality-first standard.

  • 00-baseline: replace the 1192-line app-dev tutorial (Level 1-4 tiers, ToC, evaluation criteria) with a ~200-line Phase-0 operability exercise matching 01-06: tour the whitebox layer that ships at baseline (D6 endpoints, the SLO recording rules, the provisioned dashboard), then add a description field and operate it end to end. The hand-built ItemOut is the load-bearing trap: a green build, applied migration, and persisted column can still hide an API that never returns the field -- "done means operable", not 200.
  • 01-06: correctness pass (every command, path, metric, alert window, panel title, port, and make target verified against the current tree; fixed a GC panel name and an unpinned Load panel), one shared section structure and command style across all six, and prose/step/discussion polish -- preserving each hard-won specific (the anomaly-aliasing formula, the GC sawtooth and D10 degradation, the event-stream break, the incident-to-inbox flow).

Summary by CodeRabbit

  • Documentation
    • Updated Phase 0–6 exercise guides with clearer objectives, step-by-step walkthroughs, and more precise expected observations.
    • Expanded verification guidance for health checks, monitoring layers, gRPC contract breakages, and event-stream behaviour.
    • Refined incident-to-inbox procedures, seeded anomaly discovery expectations, and JVM “GC sawtooth” degradation validation.

Bring the exercises to one consistent, reality-first standard.

- 00-baseline: replace the 1192-line app-dev tutorial (Level 1-4 tiers, ToC,
  evaluation criteria) with a ~200-line Phase-0 operability exercise matching
  01-06: tour the whitebox layer that ships at baseline (D6 endpoints, the SLO
  recording rules, the provisioned dashboard), then add a `description` field
  and *operate* it end to end. The hand-built ItemOut is the load-bearing
  trap: a green build, applied migration, and persisted column can still hide
  an API that never returns the field -- "done means operable", not 200.
- 01-06: correctness pass (every command, path, metric, alert window, panel
  title, port, and make target verified against the current tree; fixed a GC
  panel name and an unpinned Load panel), one shared section structure and
  command style across all six, and prose/step/discussion polish -- preserving
  each hard-won specific (the anomaly-aliasing formula, the GC sawtooth and
  D10 degradation, the event-stream break, the incident-to-inbox flow).
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@vovinacci, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 54 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: e579bb36-3852-42e6-8a5e-0b9860449f64

📥 Commits

Reviewing files that changed from the base of the PR and between 8922d19 and 5068aab.

📒 Files selected for processing (3)
  • docs/exercises/01-monitoring-layers.md
  • docs/exercises/03-break-the-event-stream.md
  • docs/exercises/04-incident-to-inbox.md

Walkthrough

The PR rewrites Phase 0–6 exercise documentation with current platform checks, monitoring signals, failure timing, event-stream recovery, alert notification behaviour, anomaly visibility calculations, and GC degradation verification.

Changes

DevOps exercise curriculum

Layer / File(s) Summary
Baseline operation and end-to-end change
docs/exercises/00-baseline.md
Defines startup checks, health and observability verification, and a full-stack Item.description exercise with migration, API, frontend, and validation steps.
Monitoring layers and gRPC contract
docs/exercises/01-monitoring-layers.md, docs/exercises/02-grpc-contract.md
Clarifies monitoring timing, alert windows, readiness behaviour, fallback stub generation, stream semantics, and protobuf compatibility checks.
Event-stream failure and incident notification
docs/exercises/03-break-the-event-stream.md, docs/exercises/04-incident-to-inbox.md
Updates outage options, snapshot reconciliation, non-backfilled events, alert routing, silence handling, and resolved notification timing.
Seeded anomalies and GC degradation
docs/exercises/05-find-the-seeded-anomalies.md, docs/exercises/06-watch-the-gc-sawtooth.md
Refines anomaly time-scaling guidance, dashboard observations, report failure polling, download responses, and graceful degradation expectations.

Estimated code review effort: 2 (Simple) | ~15 minutes

Possibly related PRs

Poem

I’m a rabbit with dashboards bright,
Hopping through alerts in the night.
Streams reconnect, anomalies show,
GC sawtooths ebb and flow—
These exercises now guide the way!

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main change: a rewrite of 00-baseline plus a consistency pass across exercises 01–06.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/exercises-quality

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/exercises/03-break-the-event-stream.md (1)

156-171: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Do not describe all four signals as firing in a strict order.

Option B keeps up{job="api"} and ProbeDown healthy, while canary_pipeline_check_total{result="skipped"} can appear before the five-minute AnalyticsStreamDown alert. Rewrite this as option-dependent observations rather than claiming that the canary is always the slowest signal.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/exercises/03-break-the-event-stream.md` around lines 156 - 171, The
signal comparison in the exercise incorrectly claims a strict firing order and
that the canary is always slowest. Rewrite the affected explanation to describe
option-dependent timing: under Option B, keep up{job="api"} and ProbeDown
healthy, and note that canary_pipeline_check_total{result="skipped"} may appear
before the five-minute AnalyticsStreamDown alert; preserve the distinction
between canary_journey_total and the pipeline check.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/exercises/00-baseline.md`:
- Around line 176-181: Update the explanation accompanying the docker compose
down -v command to explicitly warn that it deletes the Postgres volume and all
persisted database data, rather than only seeded rows or description-column
data.

In `@docs/exercises/01-monitoring-layers.md`:
- Around line 87-90: Update the CanaryJourneyFailing explanation to describe its
actual gauge-based condition: recent failures combined with elapsed time since
canary_journey_last_success_timestamp_seconds, followed by for: 5m. Remove the
incorrect rate(...) == 0 wording while preserving the comparison with ProbeDown
and the anti-flap tuning context.
- Around line 99-101: Reorder the cleanup verification in the exercise
instructions so the curl check for canary-prefixed items runs before make down
stops the backend. Keep make down as the final shutdown step after confirming no
canary items remain.

In `@docs/exercises/02-grpc-contract.md`:
- Around line 108-119: Update the examples and expected `buf breaking` result in
the “Run the same checks CI runs” section to describe failures under the
configured `FILE` policy, not wire incompatibility. Clarify that renaming
`GetItemStatsResponse.total_items` to `count` is a file-level change, and avoid
claiming the `Item.id` type change is wire-breaking; align the stated failure
behavior with `proto/buf.yaml`.

In `@docs/exercises/03-break-the-event-stream.md`:
- Around line 106-107: Make the outage-item count consistent in the exercise
instructions: either change the step to describe creating one item and keep the
single-item verification, or add a second POST and update the expected missing
aggregate count in the later verification. Apply the same correction to the
corresponding instructions around the later referenced section.

In `@docs/exercises/05-find-the-seeded-anomalies.md`:
- Around line 199-209: Qualify the scale-24 wording in the exercise discussion:
replace “no visible effect” with “may have no visible effect” and “structurally
unable” with “cannot reliably detect.” Preserve the explanation of non-zero
sampling probability and the existing distinction between gradual-degradation
and the short-lived traffic-spike or ingestion-outage anomalies.

In `@docs/exercises/06-watch-the-gc-sawtooth.md`:
- Around line 116-123: Update the report-ID extraction in the POST pipeline to
select the final path segment from the Location URL, yielding the actual report
ID rather than the host and port. Replace the single follow-up status request
with polling of the report endpoint until it reaches a terminal state before
reading status/error, while preserving the subsequent download-status check.

---

Outside diff comments:
In `@docs/exercises/03-break-the-event-stream.md`:
- Around line 156-171: The signal comparison in the exercise incorrectly claims
a strict firing order and that the canary is always slowest. Rewrite the
affected explanation to describe option-dependent timing: under Option B, keep
up{job="api"} and ProbeDown healthy, and note that
canary_pipeline_check_total{result="skipped"} may appear before the five-minute
AnalyticsStreamDown alert; preserve the distinction between canary_journey_total
and the pipeline check.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a5db21bf-901a-4e9a-9cc4-6ac4823a8940

📥 Commits

Reviewing files that changed from the base of the PR and between d51e52e and 86d38d1.

📒 Files selected for processing (7)
  • docs/exercises/00-baseline.md
  • docs/exercises/01-monitoring-layers.md
  • docs/exercises/02-grpc-contract.md
  • docs/exercises/03-break-the-event-stream.md
  • docs/exercises/04-incident-to-inbox.md
  • docs/exercises/05-find-the-seeded-anomalies.md
  • docs/exercises/06-watch-the-gc-sawtooth.md

Comment thread docs/exercises/00-baseline.md Outdated
Comment thread docs/exercises/01-monitoring-layers.md Outdated
Comment thread docs/exercises/01-monitoring-layers.md Outdated
Comment thread docs/exercises/02-grpc-contract.md Outdated
Comment thread docs/exercises/03-break-the-event-stream.md Outdated
Comment thread docs/exercises/05-find-the-seeded-anomalies.md Outdated
Comment thread docs/exercises/06-watch-the-gc-sawtooth.md Outdated
- 01: describe CanaryJourneyFailing's real condition (recent failures AND
  >60s since last success, a staleness gauge) instead of a nonexistent
  rate(...)==0; run the canary-item cleanup check while the stack is up,
  before make down stops the backend.
- 02: buf uses the FILE policy (buf.yaml), so frame the failures as
  source/generated-code breakage -- a field rename and int32->int64 are
  wire-compatible yet break the generated API the consumer compiled against.
- 03: create "one more item", matching the single-item outage verification.
- 05: soften "structurally unable" / "no visible effect" to "cannot reliably"
  / "usually no visible effect" -- the text itself gives a non-zero chance a
  sample lands in the window.
- 06: extract the report id as the Location's last path segment (robust to
  relative or absolute) and poll to a terminal state before asserting FAILED
  and the 409 download.
- 00: make the down -v warning explicit -- it deletes the whole Postgres
  volume, not a narrow reset.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/exercises/01-monitoring-layers.md`:
- Line 112: Update the shutdown command in the monitoring exercise documentation
to replace the literal “...” placeholder with the existing Docker Compose file
and project-directory arguments, producing a complete copy-pasteable command
while preserving the make down alternative.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 115f146e-cf23-49ab-820c-6756d87bc2ad

📥 Commits

Reviewing files that changed from the base of the PR and between 86d38d1 and 8922d19.

📒 Files selected for processing (6)
  • docs/exercises/00-baseline.md
  • docs/exercises/01-monitoring-layers.md
  • docs/exercises/02-grpc-contract.md
  • docs/exercises/03-break-the-event-stream.md
  • docs/exercises/05-find-the-seeded-anomalies.md
  • docs/exercises/06-watch-the-gc-sawtooth.md
🚧 Files skipped from review as they are similar to previous changes (5)
  • docs/exercises/00-baseline.md
  • docs/exercises/02-grpc-contract.md
  • docs/exercises/03-break-the-event-stream.md
  • docs/exercises/06-watch-the-gc-sawtooth.md
  • docs/exercises/05-find-the-seeded-anomalies.md

Comment thread docs/exercises/01-monitoring-layers.md Outdated
Replace the copy-unfriendly `docker compose ... --profile "*" down` shorthand
(literal ellipsis) with the full command in 01/03/04, matching the canonical
invocation used elsewhere (PR #183 review).
@vovinacci
vovinacci merged commit 7948b83 into main Jul 24, 2026
4 checks passed
@vovinacci
vovinacci deleted the docs/exercises-quality branch July 24, 2026 18:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant