Skip to content

test(claude-ops): cover morning-brief telemetry any=0 and rec-maxlen=0; harden usage()#844

Merged
kyle-sexton merged 4 commits into
mainfrom
fix/579-claude-ops-morning-brief-test-nits
Jul 21, 2026
Merged

test(claude-ops): cover morning-brief telemetry any=0 and rec-maxlen=0; harden usage()#844
kyle-sexton merged 4 commits into
mainfrom
fix/579-claude-ops-morning-brief-test-nits

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Summary

Closes the three non-blocking test-coverage/maintenance nits deferred from the claude[bot] review on PR #569 (the morning-brief dashboard skill).

Fix

  • Added a regression test for the any=0 telemetry path: a non-empty telemetry-comments array where none carry a lane: field (only scope-note comments) — previously only the null/no-issue-found case and the populated-with-lanes case were covered.
  • Added a regression test for --rec-maxlen 0 (full, untruncated RECOMMENDED preview) — previously the 0 = full semantics were only exercised implicitly via the != "0" source check, with no assertion that a long recommendation tail survives untruncated.
  • Hardened usage()'s header self-extraction: replaced the hardcoded sed -n '2,35p' line range with a sentinel-based awk extraction (shebang line skipped, then every comment line printed up to the first non-comment/blank line). The header comment can now grow or shrink without silently truncating or over-running --help output.
  • Bumped plugins/claude-ops/.claude-plugin/plugin.json to 0.17.2 (patch — test/maintenance only, no behavior change) and added a matching CHANGELOG.md entry.

Verification

Ran the plugin's own test suite locally (bash + jq, both GNU-date and BSD-date-stub paths):

$ bash plugins/claude-ops/skills/morning-brief/morning-brief.test.sh
...
PASS: [28] rec-maxlen 0 keeps the full tail untruncated
PASS: [29] rec-maxlen 0 never inserts an ellipsis
PASS: [30] telemetry with no lane-tagged comments reports none found
...
morning-brief.test.sh: all 47 cases passed

All 47 cases pass (44 pre-existing + 3 new: rec-maxlen=0 truncation-skip, rec-maxlen=0 no-ellipsis, and the any=0 no-lane-comments case). Also manually diffed --help output before/after the usage() change — byte-identical.

Closes #579

Related

Note on serialization

PR #841 (fix/812-jq-guard) is currently open and also touches plugins/claude-ops/ (a different skill, lanes). Opening this as draft with do-not-merge per the repo's serialization convention for concurrent claude-ops changes; this PR's version bump (0.17.10.17.2) may need to be re-based once #841 lands.

…0; harden usage()

Adds the two missing regression tests (no lane-tagged telemetry comments,
--rec-maxlen 0 full-preview mode) and replaces usage()'s hardcoded sed line
range with a sentinel-based header extraction, closing out the three
non-blocking nits deferred from the PR #569 review.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
@kyle-sexton kyle-sexton added do-not-merge Hard merge gate: do not merge while applied. automated Opened by automation. labels Jul 21, 2026
@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 44s —— View job


PR Review

  • Gather context and read changed files
  • Review morning-brief.sh changes (usage() hardening)
  • Review morning-brief.test.sh additions
  • Review plugin.json version bump
  • Review CHANGELOG.md entry
  • Post final review findings

Summary: Clean, targeted patch. All three deferred nits from #569 are addressed correctly, the new tests exercise the right code paths, and the usage() rewrite is a genuine improvement. No bugs or security issues found.


morning-brief.shusage() hardening

The awk sentinel approach is correct and an improvement over the hardcoded sed -n '2,35p'.

NR == 1 { next }          # skip shebang
/^#/ { sub(/^# ?/, ""); print; next }  # strip prefix, print comment
{ exit }                  # stop at first non-comment line (blank or code)

The sub(/^# ?/, "") pattern is semantically identical to the old sed 's/^# \{0,1\}//' — both strip # or # from the line start. The stop sentinel ({ exit } on the first non-# line) correctly terminates at line 36's blank separator before set -uo pipefail. The extraction is now size-independent.

One constraint to be aware of: Blank lines within the header comment block would prematurely terminate extraction since they don't match /^#/. Currently no blank lines exist in the header, and # comment lines (which awk does match) would render as blank help output — so the convention is already correct. Not a bug, but an implicit invariant.

Permalink: morning-brief.sh L58–68


morning-brief.test.sh — New test cases

any=0 telemetry path (lines 103–110, 176–182):

The fixture correctly contains only non-lane comments (no lane: field on any body), which causes any to remain 0 throughout the loop, triggering:

((any)) || echo "  (no per-lane comments found on the telemetry issue)"

at morning-brief.sh:454. The assertion string matches exactly. Well-targeted.

--rec-maxlen 0 (lines 167–174):

The source condition at line 370:

if [[ "$REC_MAXLEN" != "0" && -n "$rec" && "${#rec}" -gt "$REC_MAXLEN" ]]; then

…means REC_MAXLEN="0" short-circuits the entire truncation block. The tests verify both the survival of the tail text ("omicron pi") and the absence of the ellipsis character (). The ellipsis check against a full render is sound — with --rec-maxlen 0, no decision can produce a , so no false pass risk.

Permalink: morning-brief.test.sh L167–182


Minor observations (non-blocking)

  1. CHANGELOG dates: The [0.17.2] header omits a date, but this is consistent with all prior entries in this file ([0.17.1], [0.17.0], [0.16.0], etc.). Not a defect given the project's established convention.

  2. telemetry-no-lanes.json fixture placement: The fixture is created at line 103 (before $TMP/empty.json's first use block) and consumed at line 177. Ordering is correct. No issue.

  3. Version bump note: PR body correctly flags that 0.17.1 → 0.17.2 may need a rebase once fix(claude-ops): use type -P for jq prereq check to avoid wrapper shadowing #841 lands. Nothing to address here until that merge.


Verdict: Approved as-is. The changes are correct, the tests are well-scoped, and the usage() rewrite removes a real fragility. Ready to merge once #841 serialization is resolved.

@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 14s —— View job


Security Review — PR #844

  • Gather PR diff and changed files
  • Review morning-brief.sh for injection surfaces and unsafe shell patterns
  • Review morning-brief.test.sh for unsafe test patterns
  • Review plugin.json and CHANGELOG.md for supply-chain / config risks
  • Post security findings

No security issues found. This PR's changes are limited to three areas; none introduce new attack surfaces or worsen existing ones.

usage() awk replacement (morning-brief.sh lines 62–66)

The old sed -n '2,35p' "${BASH_SOURCE[0]}" and the new sentinel-based awk block both read the script's own source file via ${BASH_SOURCE[0]}. No user input flows into the awk program string or into the path operand — ${BASH_SOURCE[0]} is set by the shell from the filesystem, not from an argument. The sub(/^# ?/, "") substitution operates on the literal content of the script's header comment, not on any user-supplied string. Confidence: high. No finding.

Test fixture additions (morning-brief.test.sh lines 103–110, 167–186)

Both new fixture blocks use single-quoted heredocs (<<'EOF'), so no variable expansion occurs during fixture construction. The fixture JSON is written to paths under $TMP (the test's mktemp -d scratch directory) and consumed only within the same test run. No user-controlled data reaches jq or the shell through this path. Confidence: high. No finding.

plugin.json version bump and CHANGELOG.md

The version field changes from 0.17.1 to 0.17.2 — a semver patch bump with no new permissions, no new MCP servers, no new userConfig keys, and no change to the plugin's trust boundary. No supply-chain or privilege-escalation risk. Confidence: high. No finding.


@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Post-green review classification (work lane):

Finding Source Classification Disposition
Everything PR review + security review "Approved as-is" / "No security issues found" No action needed
Blank-line-in-header implicit invariant (usage() awk sentinel) PR review Non-blocking observation, not currently exploitable (no blank lines exist in the header) Left alone
Version-rebase-once-#841-lands note PR review Already tracked in PR body/do-not-merge serialization No new action

No DEFER-FORBIDDEN class applies. No inline threads to resolve (PR-level comments only).

Leaving do-not-merge in place — this PR is correctly serialized behind sibling #841 (same plugin, different skill) per rule 6d. Not flipping to ready yet; will rebase + re-bump past #841 once it merges, then flip.

kyle-sexton added a commit that referenced this pull request Jul 21, 2026
…de-ops, work-items

Re-checked open PRs touching these plugins' plugin.json right before the version-bump
collision protocol requires it: source-control carries #839 (0.15.8) and #840 (0.15.9),
claude-ops carries #844 (0.17.2), work-items carries #826 (0.18.2) — all still open.
Bumps this PR's claims one past each plugin's current highest open-PR claim
(source-control 0.15.10, claude-ops 0.17.3, work-items 0.18.3) so this PR does not
collide at merge time regardless of which sibling lands first.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
Resolves conflicts on source-control and work-items plugin.json/CHANGELOG.md:
main advanced source-control to 0.15.8 (#839, merged) and work-items to 0.18.2
(#826, merged) since this branch was last rebased. Also re-checked live open
PRs at merge time and found work-items now carries a new open claim, #857 at
0.19.0 (Jira adapter) — re-bumped this branch's work-items claim from 0.18.3
to 0.19.1 to stay ahead of it. source-control's 0.15.10 and claude-ops's
0.17.3 remain valid (still one past #840/#860's 0.15.9 and #844/#860's 0.17.2
open claims, respectively).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
Resolves the claude-ops CHANGELOG.md conflict by keeping #860's
0.17.2 entry as-is and moving this PR's fix under a new 0.17.4
heading. Re-bumps plugin.json past both main's 0.17.2 (landed via
#860) and PR #853's pending 0.17.3 claim.
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
Re-syncs onto main after #860 (fleet-wide `shell: bash` declaration sweep)
merged, which bumped source-control to 0.15.9, claude-ops to 0.17.2, and
repo-hygiene to 0.4.5. Resolved conflicts on those three plugins' plugin.json
and CHANGELOG.md; re-derived each held version against the new main plus a
fresh live-open-PR check rather than assuming the prior numbers still held:

- source-control 0.15.10: still one past main's 0.15.9 and #840's live 0.15.9
  claim.
- claude-ops 0.17.3: still one past main's 0.17.2 and #844's live 0.17.2
  claim.
- repo-hygiene 0.4.6: still one past main's new 0.4.5 (#860, now merged); no
  open-PR collision remains for this plugin.
- work-items 0.19.1 and guardrails 0.9.6 were untouched by this merge (no
  conflict) and remain correct against #857/#861 (both still 0.19.0, open)
  and no open collision, respectively.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
#857 (Jira Cloud adapter) merged into main since this branch's last rebase,
bumping work-items to 0.19.0. Resolved the resulting conflict, keeping this
branch's 0.19.1 (already one past both the new main and #861's still-open
0.19.0 claim, so no further bump needed). Re-verified all 5 plugins fresh
against current main and every live open PR (#840 0.15.10, #844 0.17.2, #861
0.19.0): source-control 0.15.11, claude-ops 0.17.3, repo-hygiene 0.4.6, and
guardrails 0.9.6 all remain correct with no change required.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
An unrelated claude-ops docs PR (#877, closing #864) merged since this
branch's last rebase and landed at exactly 0.17.3 — the same version this
branch was claiming. Re-bumped claude-ops to 0.17.4 to clear the exact
collision (plugin.json auto-merged to an identical-looking "0.17.3" string
without flagging a conflict, since both sides happened to write the same
literal text for unrelated reasons; caught by diffing main's version history
directly, not by trusting a clean auto-merge). CHANGELOG.md split into two
sections (0.17.3 for #877's actual change, 0.17.4 for this PR's).

Also swept for new open PRs against all 5 plugins post-merge: #870
(feat/800-audit-instructions) newly touches repo-hygiene (claims 0.4.5) and
claude-ops (claims 0.17.2) — both below this branch's current claims
(0.4.6 / 0.17.4), no collision. source-control (0.15.11), work-items
(0.19.1), and guardrails (0.9.6) re-confirmed against current main and every
live open PR (#840 0.15.10, #844 0.17.2, #861 0.19.0) — unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
Resolves plugin.json/CHANGELOG.md conflicts: keeps this PR's 0.17.4
bump (past main's 0.17.3, landed via #877) and preserves the 0.17.3
changelog entry as-is.
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
claude-ops: #844 rebased and re-derived its claim from 0.17.2 to 0.17.4,
colliding exactly with this branch's prior 0.17.4. Bump to 0.17.5.

source-control: a new PR, #882 (fix/511-babysit-self-identity-decouple),
claims 0.16.0 — a minor bump above this branch's prior 0.15.11 and above
#840's 0.15.10. Bump to 0.16.1 to stay ahead of both.

repo-hygiene (0.4.6), guardrails (0.9.6), and work-items (0.19.1) were
re-verified fresh against current main and every live open PR
(main: repo-hygiene 0.4.5, guardrails 0.9.5, work-items 0.19.0; #861 0.19.0)
and remain correct, no change needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 11s —— View job


PR Review — #844

  • Gather context and read changed files
  • Review morning-brief.sh changes (usage() hardening)
  • Review morning-brief.test.sh additions
  • Review plugin.json version bump
  • Review CHANGELOG.md entry
  • Post final review findings

Summary: Clean, well-targeted patch. All three deferred nits from #569 are addressed correctly. No bugs, no security issues, no CLAUDE.md violations.


morning-brief.shusage() awk sentinel (L58–68)

The sentinel-based extraction is correct and a genuine improvement. The script's header runs lines 2–35 (all ^#-prefixed); line 36 is the blank separator before set -uo pipefail. The awk { exit } fires on that blank line, extracting exactly the right range without depending on a hardcoded count.

35  #   4  prerequisite missing (gh or jq), or repo could not be resolved
36  <blank>   ← awk exit fires here
37  set -uo pipefail

sub(/^# ?/, "") is semantically identical to the old sed 's/^# \{0,1\}//'. Behavior is preserved and the extraction is now size-independent.

Minor nit (non-blocking): The inline comment says "shebang to first blank line" — more precisely it's "shebang skipped, then every ^# line until the first non-^# line (which happens to be a blank)". The existing constraint (noted by the prior review) that blank lines within the header would prematurely terminate is real but the current file has none, and the # convention is established.


morning-brief.test.sh — New test cases (L103–110, L167–182)

--rec-maxlen 0 (lines 167–174): Uses the existing decisions.json fixture which includes the long-rec item #104 (RECOMMENDED: alpha beta gamma … omicron pi.). With REC_MAXLEN="0", the condition at L370 short-circuits ("$REC_MAXLEN" != "0" is false), so the substitution never runs. Both assertions are correct:

  • assert_contains … "omicron pi" — tail survives untruncated
  • assert_not_contains … "…" — no ellipsis in the full render

any=0 telemetry path (lines 176–182): The telemetry-no-lanes.json fixture has two comments with no lane: field, so any stays 0 through the loop and L454 emits (no per-lane comments found on the telemetry issue). The assertion string matches exactly.

Both fixtures use single-quoted heredocs (<<'EOF'), no variable expansion risk, and are written under $TMP (the mktemp -d scratch dir). No issues.


plugin.json version bump (L4)

0.17.3 → 0.17.4. The PR body anticipated a re-base from 0.17.2 once #841 landed; the branch has correctly been rebased past that and 0.17.3, incrementing to 0.17.4. Patch bump is appropriate — no behavior change, test/maintenance only. No new permissions, MCP servers, or userConfig keys.


CHANGELOG.md (L6–17)

The [0.17.4] entry accurately describes all three changes. "Fixed" category is appropriate. Consistent with the repo's convention of omitting dates from version headers.


Verdict: Approved. Ready to merge once the do-not-merge serialization constraint is cleared.

@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 1s —— View job


Security Review — PR #844

  • Fetch PR diff and read changed files
  • Review morning-brief.sh changes
  • Review morning-brief.test.sh changes
  • Review plugin.json and CHANGELOG.md
  • Post findings

No security issues found. The four changed files introduce no new attack surfaces and do not worsen any existing ones.

morning-brief.shusage() awk rewrite (lines 62–66)

awk '
  NR == 1 { next }
  /^#/ { sub(/^# ?/, ""); print; next }
  { exit }
' "${BASH_SOURCE[0]}"

The only operand is ${BASH_SOURCE[0]} — bash sets this to the script's own filesystem path; no user input touches it. The awk program string is a hardcoded literal with no concatenation. The sub(/^# ?/, "") substitution operates on the literal content of the script's header comment, not on any external data. Confidence: high. No finding.

morning-brief.test.sh — new fixture blocks (lines 103–110, 167–182)

Both new blocks use single-quoted heredocs (<<'EOF'), so no variable expansion occurs during fixture construction. Written paths are all under $TMP (a per-run mktemp -d directory), and consumed only within the same test invocation. No user-controlled data reaches bash, jq, or awk through these fixtures. Confidence: high. No finding.

plugin.json version bump and CHANGELOG.md

The version field advances with no new permissions, no new MCP servers, no new userConfig keys, and no change to the plugin's trust boundary or data-egress surface. CHANGELOG.md is inert documentation. No supply-chain or privilege-escalation risk. Confidence: high. No finding.

@kyle-sexton kyle-sexton removed the do-not-merge Hard merge gate: do not merge while applied. label Jul 21, 2026
@kyle-sexton
kyle-sexton marked this pull request as ready for review July 21, 2026 18:08
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Post-rebase re-review classification (work lane):

Rebased twice now (past #841, then past #860), re-derived to 0.17.4, do-not-merge dropped after confirming no live collision with sibling #853 (which serializes past this PR instead).

Finding Source Classification Disposition
Everything substantive PR review + security review "Approved" / "No security issues found" No action needed
usage() inline comment slightly imprecise ("shebang to first blank line" vs. exact mechanics) PR review (nit) Non-blocking wording suggestion Left alone

No DEFER-FORBIDDEN class applies. No inline review threads to resolve (PR-level comments only). Verified comment content directly (not just the green check) per this cycle's standing practice.

Flipping to ready, handing off to babysit.

@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 20s —— View job


PR Review — #844

  • Gather context and read changed files
  • Review morning-brief.sh changes (usage() hardening)
  • Review morning-brief.test.sh additions
  • Review plugin.json version bump
  • Review CHANGELOG.md entry
  • Post final review findings

Summary: Clean, targeted patch. All three deferred nits from #569 are addressed correctly. No bugs, no security issues, no CLAUDE.md violations. Approved.


morning-brief.shusage() awk sentinel (L58–68)

The sentinel-based extraction is correct and a genuine improvement over the hardcoded sed -n '2,35p'. The { exit } on the first non-^# line (the blank separator at line 36 before set -uo pipefail) extracts exactly the right range. sub(/^# ?/, "") is semantically identical to the old sed substitution; behavior is preserved and the extraction is now size-independent.

Invariant to keep: Blank lines within the header comment would prematurely terminate extraction (they don't match /^#/). The current file has none, and # comment lines (which awk does match) render as blank help output — so the convention is already correct. Not a defect, just an implicit constraint to maintain.


morning-brief.test.sh — New test cases (L103–110, L167–182)

--rec-maxlen 0 (lines 167–174): The source condition at L370[[ "$REC_MAXLEN" != "0" && ... ]] — short-circuits the entire truncation block when REC_MAXLEN="0". Both assertions are correct:

  • assert_contains … "omicron pi" — tail survives untruncated
  • assert_not_contains … "…" — ellipsis never emitted

any=0 telemetry path (lines 103–110, 176–182): The telemetry-no-lanes.json fixture has two comments with no lane: field, so any stays 0 through the loop and L454 emits (no per-lane comments found on the telemetry issue). The assertion string matches exactly. Well-targeted — this path was previously untested.

Both fixtures use single-quoted heredocs (<<'EOF'), no variable expansion risk, written to $TMP (per-run mktemp -d). No issues.


plugin.json version bump (L4)

0.17.3 → 0.17.4 — correctly re-derived after rebasing past #841 and #860. Patch bump is appropriate (test/maintenance only, no behavior change). No new permissions, MCP servers, or userConfig keys.


CHANGELOG.md (L6–17)

The [0.17.4] entry accurately describes all three changes. "Fixed" category is appropriate. Date omission is consistent with the project's established convention for all prior entries.


Verdict: Approved. Ready to merge.

@claude

claude Bot commented Jul 21, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 43s —— View job


Security Review — PR #844

  • Gather context
  • Fetch PR diff and read changed files
  • Review morning-brief.sh changes (usage() awk rewrite)
  • Review morning-brief.test.sh additions
  • Review plugin.json and CHANGELOG.md
  • Post findings

No security issues found. The four changed files introduce no new attack surfaces and do not worsen any existing ones.


morning-brief.shusage() sentinel rewrite (L62–66)

awk '
  NR == 1 { next }
  /^#/ { sub(/^# ?/, ""); print; next }
  { exit }
' "${BASH_SOURCE[0]}"

The sole operand is ${BASH_SOURCE[0]} — the shell sets this from the filesystem, not from any argument or external input. The awk program string is a hardcoded literal; no user-controlled data reaches the awk program or the path operand. sub(/^# ?/, "") operates on literal lines from the script header. No injection surface. Confidence: high.


morning-brief.test.sh — new fixture blocks (L103–110, L167–182)

Both new fixture blocks use single-quoted heredocs (<<'EOF'), so no variable expansion occurs during fixture construction. All fixture paths are under $TMP (a per-run mktemp -d directory with a trap ... EXIT cleanup). No user-controlled data reaches bash, jq, grep, or awk through these fixtures. Confidence: high.


plugin.json version bump (L4) and CHANGELOG.md

0.17.3 → 0.17.4. No new permissions, no new MCP servers, no new userConfig keys, no change to the plugin's trust boundary or data-egress surface. CHANGELOG.md is inert documentation. No supply-chain or privilege-escalation risk. Confidence: high.


GitHub Actions scope

No workflow files are touched by this PR. No pull_request_target, workflow_run, script injection via github context, or permission-widening changes. Nothing to flag.

@kyle-sexton
kyle-sexton merged commit 90288d1 into main Jul 21, 2026
26 of 27 checks passed
@kyle-sexton
kyle-sexton deleted the fix/579-claude-ops-morning-brief-test-nits branch July 21, 2026 18:32
kyle-sexton added a commit that referenced this pull request Jul 21, 2026
#844 (claude-ops) merged into main at exactly 0.17.4, which this branch's
prior 0.17.5 was already one past — kept as-is, no re-bump needed for the
number itself, just resolved the resulting plugin.json/CHANGELOG.md conflict.

Full fresh collision sweep after the merge found claude-ops now has NO open-PR
collision at all. It also found #861 (work-items) re-derived its own claim
from 0.19.0 to 0.20.0 since the last check (following #857's Jira-adapter
minor bump into main) — colliding with this branch's prior 0.19.1. Re-bumped
work-items to 0.20.1.

source-control (0.16.1, held behind #882's 0.16.0 and #840's 0.15.10),
repo-hygiene (0.4.6, no collision), and guardrails (0.9.6, no collision)
re-verified against current main and all live open PRs — unchanged.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K1V3gkrfSf75isB8MiDy3o
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Opened by automation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

claude-ops:morning-brief: 3 minor test-coverage/maintenance nits (no-lanes telemetry case, rec-maxlen=0 case, usage() header extraction fragility)

1 participant