Compare commits

...

20 Commits

Author SHA1 Message Date
kami f5d8f90b0e orchestra: TASK.md 2026-08-29 19:17:00 +04:00
claude 6f6ead4ffc Merge pull request 'Integrate the six open burn-in pull requests' (#23) from integrate into master 2026-08-29 16:52:47 +02:00
kami 66f6eeb4e4 Merge remote-tracking branch 'origin/orchestra/06G4VF5HZW7Q4JBM3TTY7W1Y64' into integrate
# Conflicts:
#	TASK.md
#	scripts/orchestra_e2e_healthcheck.sh
#	scripts/test_healthcheck.sh
2026-08-29 18:07:05 +04:00
kami 835d796781 Merge remote-tracking branch 'origin/orchestra/06G4GBSQ2WRGD5HGYPYZZ4TYH0' into integrate
# Conflicts:
#	TASK.md
#	scripts/orchestra_e2e_healthcheck.sh
2026-08-29 18:05:39 +04:00
kami 51490707f5 Merge remote-tracking branch 'origin/orchestra/06G4V20T528ZTER7KZBVGNAYXC' into integrate
# Conflicts:
#	TASK.md
#	scripts/orchestra_e2e_healthcheck.sh
#	scripts/test_healthcheck.sh
2026-08-29 18:04:56 +04:00
kami ba6e49ffb7 Merge remote-tracking branch 'origin/orchestra/06G4SWEVP71FYYKAV5FV0ZK5ZG' into integrate
# Conflicts:
#	TASK.md
#	scripts/orchestra_e2e_healthcheck.sh
#	scripts/test_healthcheck.sh
2026-08-29 18:02:49 +04:00
kami e0ab86b8f8 Merge remote-tracking branch 'origin/orchestra/06G4M8WHGQ4P3GQMPEEH0RJRHM' into integrate
# Conflicts:
#	TASK.md
#	scripts/orchestra_e2e_healthcheck.sh
2026-08-29 18:00:52 +04:00
kami fd13778dd8 orchestra: pre-release WIP snapshot (orchestra-06g4vf5hzw7q4jbm3tty7w1y64-4d839c05) 2026-08-29 17:49:15 +04:00
kami 8ea3c7d1ae orchestra: pre-release WIP snapshot (orchestra-06g4vf5hzw7q4jbm3tty7w1y64-4d839c05) 2026-08-29 17:46:50 +04:00
kami d3acd4989a orchestra: TASK.md 2026-08-29 17:36:49 +04:00
kami 82c944728e orchestra: complete 06G4V20T528ZTER7KZBVGNAYXC 2026-08-29 17:01:49 +04:00
kami ad74c8a39e orchestra: TASK.md 2026-08-29 16:39:22 +04:00
kami 0e35d8d978 orchestra: complete 06G4SWEVP71FYYKAV5FV0ZK5ZG 2026-08-29 14:13:41 +04:00
kami 3da86dbf8a orchestra: TASK.md 2026-08-29 13:55:16 +04:00
kami cef655acc6 orchestra: pre-release WIP snapshot (orchestra-06g4m6hf1z3erex1x3nekshp24-c19bf648) 2026-08-29 00:46:35 +04:00
kami 9a0ea96d22 orchestra: TASK.md 2026-08-29 00:40:26 +04:00
kami ec0502f829 Restore the byte-pinned USAGE test_healthcheck.sh from master
7d04aef replaced the byte-exact USAGE pin with a shape check that requires
every long flag grepped from the healthcheck source to appear in --help.
--json was already undocumented before this task, so that check was red on
arrival and it also dropped the 'unknown flag ignored' assertion on --bogus,
the only pin on the no---strict silent-ignore path.

The accepted plan's phase 3 is 'no edit': --help is untouched by --strict, so
master's version passes as-is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-28 15:54:11 +04:00
kami 7d04aef94d Drop the byte-exact USAGE pin from test_healthcheck.sh 2026-08-28 15:52:53 +04:00
kami 172c100dec orchestra: pre-release WIP snapshot (orchestra-06g4gbsq2wrgd5hgypyzz4tyh0-ec8111ad) 2026-08-28 15:50:32 +04:00
kami 94bd45c3b5 orchestra: TASK.md 2026-08-28 15:44:12 +04:00
4 changed files with 257 additions and 26 deletions
+37 -14
View File
@@ -1,37 +1,60 @@
# Task 06G4M8WHGQ4P3GQMPEEH0RJRHM
# Task 06G4W63545T3RV8SSKGKN11B3G
Give the healthcheck a --list-checks flag
Run a single named check with --only
- Project: test-e2e
- Source: burnin/run14-c
- Source: gitea:test-e2e/26
- Priority: 0
## Instructions
Give `scripts/orchestra_e2e_healthcheck.sh` a `--list-checks` flag that prints the name of each check it performs, one per line, and exits 0.
Give scripts/orchestra_e2e_healthcheck.sh a `--only <name>` flag that runs a single named check instead of all ten, then prints the usual success line.
This is deliberately two pieces of work, and the plan should carry two phases:
Behaviour:
1. Name the checks. The script performs its checks inline. Introduce one list of check names and drive the existing run from that list, with no change to any output or exit status.
2. Add the flag. `--list-checks` prints the names from that list and exits 0. Add one line to the usage text describing it.
- `--only repo_root_readable` runs that check alone and exits 0 when it passes.
- `--only nonsense` prints `unknown check: nonsense` on stderr and exits 2.
- `--only` composes with `--summary`, `--json` and `--quiet`, each keeping its current shape over the single result.
- Without `--only`, every existing flag behaves exactly as it does today.
Plan this as FIVE phases:
1. A helper that resolves a name to a check function and reports whether the name is known.
2. Flag parsing for `--only <name>`, with the unknown-name refusal and exit 2.
3. Running the single resolved check and recording its result through the existing results state.
4. Composition with `--summary` and `--json`.
5. The usage text in `--help`, and assertions in scripts/test_healthcheck.sh for each behaviour above.
## Work one phase at a time
Implement phase N, request its verification, and only then begin phase N+1. Do not write the whole change first and verify the phases afterwards.
## Every phase carries both kinds of check
This is a hard requirement of this task. Each phase must have at least one automated check from the policy below. Each phase must also have at least one manual check, confirmed by a human reading the printed output. Orchestra runs the automated ones. A human owns the manual ones, and the phase is not finished until that human signs it off.
## Verification policy for this project
Only two commands may appear on a `- run:` line, exactly:
Only two commands may appear on a run: line, exactly:
- `["bash", "-n", "<path>"]`
- `["bash", "scripts/orchestra_e2e_healthcheck.sh"]`
- ["bash", "-n", "<path>"]
- ["bash", "scripts/orchestra_e2e_healthcheck.sh"]
Anything else is refused when you seal the plan. `scripts/test_healthcheck.sh` is NOT permitted as an automated command. Update it as a manual step so its expected `--help` text matches, and list that as a manual check.
Anything else is refused when you seal the plan.
## Research first
Establish at least three findings with distinct confidence: at least one `fact`, one `inference`, one `assumption`.
Establish at least three findings with distinct confidence: at least one fact, one inference, one assumption.
## Handoff behaviour
## Quality gate
Behave normally. If Orchestra asks you to write a handoff report, write it and stop.
bash -n scripts/*.sh && bash scripts/orchestra_e2e_healthcheck.sh
Acceptance:
- `--only <name>` runs exactly one check.
- An unknown name exits 2 with a message on stderr.
- `--only` composes with `--summary`, `--json` and `--quiet`.
- Every existing flag is unchanged when `--only` is absent.
## Completion
+141 -11
View File
@@ -1,7 +1,68 @@
#!/usr/bin/env bash
readonly VERSION=1.0.0
readonly CHECKS=(script-runs)
readonly SUCCESS_MESSAGE='OK - all healthchecks passed'
readonly ROOT=$(cd "$(dirname "$0")/.." && pwd)
# Space-separated check names; each has a check_<name> function.
CHECKS="repo_root_readable scripts_dir_present healthcheck_executable_bit
selftest_present test_healthcheck_present readme_present
no_crlf_line_endings no_tabs_in_scripts
shebang_is_bash usage_text_mentions_every_flag"
# name=ok / name=fail pairs, in run order.
RESULTS=
FAILED=0
TOTAL=0
# record <name> <status>: append one outcome to the results state.
record() {
RESULTS="$RESULTS $1=$2"
TOTAL=$((TOTAL + 1))
[ "$2" = ok ] || FAILED=$((FAILED + 1))
}
check_repo_root_readable() { [ -d "$ROOT" ] && [ -r "$ROOT" ]; }
check_scripts_dir_present() { [ -d "$ROOT/scripts" ]; }
check_healthcheck_executable_bit() { [ -x "$ROOT/scripts/orchestra_e2e_healthcheck.sh" ]; }
check_selftest_present() { [ -f "$ROOT/scripts/orchestra_e2e_selftest.sh" ]; }
check_test_healthcheck_present() { [ -f "$ROOT/scripts/test_healthcheck.sh" ]; }
check_readme_present() { [ -f "$ROOT/README.md" ]; }
check_no_crlf_line_endings() {
[ -d "$ROOT/scripts" ] || return 1
! grep -qU $'\r' "$ROOT"/scripts/*.sh "$ROOT/README.md" 2>/dev/null
}
check_no_tabs_in_scripts() {
[ -d "$ROOT/scripts" ] || return 1
! grep -q "$(printf '\t')" "$ROOT"/scripts/*.sh 2>/dev/null
}
check_shebang_is_bash() {
[ -d "$ROOT/scripts" ] || return 1
local f
for f in "$ROOT"/scripts/*.sh; do
[ "$(head -n 1 "$f")" = '#!/usr/bin/env bash' ] || return 1
done
}
check_usage_text_mentions_every_flag() {
local text flag
text=$(usage text)
for flag in --quiet --json --help; do
case "$text" in
*"$flag"*) ;;
*) return 1 ;;
esac
done
}
# now_us: current time in microseconds. Strips any locale decimal separator.
now_us() { printf '%s' "${EPOCHREALTIME//[!0-9]/}"; }
# elapsed_ms <start-us>: whole milliseconds since <start-us>.
elapsed_ms() { printf '%s' "$(( ($(now_us) - $1) / 1000 ))"; }
# emit <format> <template> [args...]: the single output path.
# format: text or json print; none suppresses (--quiet). Explicit argument,
@@ -12,27 +73,72 @@ emit() {
[ "$format" = none ] || printf "$@"
}
# usage <format>: the --help body. Also the source check_usage_text_mentions_every_flag
# reads, so the flag list has exactly one home.
usage() {
emit "$1" 'Usage: %s [--quiet] [--json] [--summary] [--timing] [--strict] [--list-checks]\n\n' "${0##*/}"
emit "$1" 'Healthcheck script for Orchestra E2E tests.\n'
emit "$1" 'Exits 0 with a success message if all checks pass.\n'
emit "$1" ' --quiet Suppress the success message; still exits 0.\n'
emit "$1" ' --json Print a single-line JSON result; still exits 0.\n'
emit "$1" ' --help Print this usage text and exit 0.\n'
emit "$1" ' --summary Print one line per check before the success message.\n'
emit "$1" ' --timing Print elapsed milliseconds for the run.\n'
emit "$1" ' --strict Reject an unrecognised flag: exits 2.\n'
emit "$1" ' --list-checks Print the name of each check; exits 0.\n'
emit "$1" '\nChecks:\n'
local name
for name in $CHECKS; do
emit "$1" ' %s\n' "$name"
done
emit "$1" '\nVersion: %s\n' "$VERSION"
}
main() {
local start_us
start_us=$(now_us)
local quiet=
local json=
local summary=
local timing=
local strict=
local unknown=
for arg in "$@"; do
if [ "$arg" = --help ]; then
emit text 'Usage: %s [--quiet]\n\n' "${0##*/}"
emit text 'Healthcheck script for Orchestra E2E tests.\n'
emit text 'Exits 0 with a success message if all checks pass.\n'
emit text ' --quiet Suppress the success message; still exits 0.\n'
emit text ' --list-checks Print the name of each check; exits 0.\n'
emit text 'Version: %s\n' "$VERSION"
usage text
exit 0
elif [ "$arg" = --list-checks ]; then
for name in "${CHECKS[@]}"; do
emit text '%s\n' "$name"
local listed
for listed in $CHECKS; do
emit text '%s\n' "$listed"
done
exit 0
elif [ "$arg" = --quiet ]; then
quiet=1
elif [ "$arg" = --json ]; then
json=1
elif [ "$arg" = --summary ]; then
summary=1
elif [ "$arg" = --timing ]; then
timing=1
elif [ "$arg" = --strict ]; then
strict=1
else
[ -n "$unknown" ] || unknown=$arg
fi
done
if [ -n "$strict" ] && [ -n "$unknown" ]; then
printf 'unknown flag: %s\n' "$unknown" >&2
exit 2
fi
local name
for name in $CHECKS; do
if "check_$name"; then
record "$name" ok
else
record "$name" fail
fi
done
@@ -40,12 +146,36 @@ main() {
[ -n "$quiet" ] && format=none
[ -n "$json" ] && format=json
if [ "$FAILED" -gt 0 ]; then
local entry
for entry in $RESULTS; do
[ "${entry#*=}" = fail ] && emit "$format" 'FAIL - %s\n' "${entry%=*}"
done
exit 1
fi
local elapsed
elapsed=$(elapsed_ms "$start_us")
if [ "$format" = json ]; then
emit "$format" '{"status":"ok","checks":%d}\n' "${#CHECKS[@]}"
local timings=
[ -n "$timing" ] && timings=",\"timings\":{\"healthchecks\":$elapsed}"
emit "$format" '{"status":"ok","checks":%d%s}\n' "$TOTAL" "$timings"
exit 0
fi
emit "$format" 'OK - all healthchecks passed\n'
if [ -n "$summary" ]; then
local entry
for entry in $RESULTS; do
emit "$format" '%s: %s\n' "${entry%=*}" "${entry#*=}"
done
fi
if [ -n "$timing" ]; then
emit "$format" 'healthchecks: %sms\n' "$elapsed"
fi
emit "$format" '%s\n' "$SUCCESS_MESSAGE"
exit 0
}
+12
View File
@@ -34,4 +34,16 @@ case "$jout" in
*) fail '--json run stdout prefix: want {"status":' "$jout" ;;
esac
# --strict rejects an unknown flag
sout=$(bash "$healthcheck" --strict --nonsense 2>&1)
sstatus=$?
[ "$sstatus" -eq 2 ] || fail "--strict --nonsense exit status: want 2, got $sstatus" "$sout"
# --strict alone is accepted
gout=$(bash "$healthcheck" --strict)
gstatus=$?
[ "$gstatus" -eq 0 ] || fail "--strict run exit status: want 0, got $gstatus" "$gout"
printf 'selftest: ok\n'
+67 -1
View File
@@ -3,7 +3,11 @@
HC="$(dirname "$0")/orchestra_e2e_healthcheck.sh"
OK='OK - all healthchecks passed'
USAGE="$(printf 'Usage: orchestra_e2e_healthcheck.sh [--quiet]\n\nHealthcheck script for Orchestra E2E tests.\nExits 0 with a success message if all checks pass.\n --quiet Suppress the success message; still exits 0.\n --list-checks Print the name of each check; exits 0.\nVersion: 1.0.0')"
NAMES='repo_root_readable scripts_dir_present healthcheck_executable_bit
selftest_present test_healthcheck_present readme_present
no_crlf_line_endings no_tabs_in_scripts
shebang_is_bash usage_text_mentions_every_flag'
USAGE="$(printf 'Usage: orchestra_e2e_healthcheck.sh [--quiet] [--json] [--summary] [--timing] [--strict] [--list-checks]\n\nHealthcheck script for Orchestra E2E tests.\nExits 0 with a success message if all checks pass.\n --quiet Suppress the success message; still exits 0.\n --json Print a single-line JSON result; still exits 0.\n --help Print this usage text and exit 0.\n --summary Print one line per check before the success message.\n --timing Print elapsed milliseconds for the run.\n --strict Reject an unrecognised flag: exits 2.\n --list-checks Print the name of each check; exits 0.\n\nChecks:\n repo_root_readable\n scripts_dir_present\n healthcheck_executable_bit\n selftest_present\n test_healthcheck_present\n readme_present\n no_crlf_line_endings\n no_tabs_in_scripts\n shebang_is_bash\n usage_text_mentions_every_flag\n\nVersion: 1.0.0')"
fails=0
check() { # check <expected-stdout> <label> [args...]
@@ -17,6 +21,18 @@ check() { # check <expected-stdout> <label> [args...]
fi
}
contains() { # contains <needle> <label> [args...]
local want=$1 label=$2 got status
shift 2
got=$(bash "$HC" "$@" 2>/dev/null)
status=$?
if [ "$status" -ne 0 ] || [ "${got#*"$want"}" = "$got" ]; then
printf 'FAIL: %s (exit=%s)\n---missing---\n%s\n---in---\n%s\n' \
"$label" "$status" "$want" "$got"
fails=$((fails + 1))
fi
}
check "$OK" 'no args'
check '' '--quiet' --quiet
check "$USAGE" '--help' --help
@@ -24,5 +40,55 @@ check "$USAGE" '--help --quiet' --help --quiet
check "$USAGE" '--quiet --help' --quiet --help
check "$OK" 'unknown flag ignored' --bogus
for name in $NAMES; do
contains "$name" "--help names $name" --help
done
# All ten names in one run's output.
help_out=$(bash "$HC" --help 2>/dev/null)
missing=
for name in $NAMES; do
[ "${help_out#*"$name"}" = "$help_out" ] && missing="$missing $name"
done
if [ -n "$missing" ]; then
printf 'FAIL: --help lists all ten check names\n---missing---\n%s\n' "$missing"
fails=$((fails + 1))
fi
# --list-checks prints one name per line and nothing else.
listed=$(bash "$HC" --list-checks 2>/dev/null)
want_listed=$(printf '%s\n' $NAMES)
if [ "$listed" != "$want_listed" ]; then
printf 'FAIL: --list-checks\n---got---\n%s\n---want---\n%s\n' "$listed" "$want_listed"
fails=$((fails + 1))
fi
# --summary prints one name: outcome line per check, then the success line.
summary_out=$(bash "$HC" --summary 2>/dev/null)
for name in $NAMES; do
case "$summary_out" in
*"$name: ok"*) ;;
*) printf 'FAIL: --summary omits %s\n' "$name"; fails=$((fails + 1)) ;;
esac
done
case "$summary_out" in
*"$OK") ;;
*) printf 'FAIL: --summary does not end with the success line\n'; fails=$((fails + 1)) ;;
esac
# --timing prints an elapsed line, and composes with --json and --quiet.
contains 'healthchecks:' '--timing' --timing
contains '"timings":{"healthchecks":' '--timing --json' --timing --json
check '' '--timing --quiet' --timing --quiet
# --strict rejects an unrecognised flag; on its own it changes nothing.
strict_out=$(bash "$HC" --strict --nonsense 2>&1)
strict_status=$?
if [ "$strict_status" -ne 2 ] || [ "${strict_out#*unknown flag}" = "$strict_out" ]; then
printf 'FAIL: --strict --nonsense (exit=%s)\n---got---\n%s\n' "$strict_status" "$strict_out"
fails=$((fails + 1))
fi
check "$OK" '--strict alone' --strict
[ "$fails" -eq 0 ] || exit 1
printf 'all checks passed\n'