Compare commits

..

1 Commits

Author SHA1 Message Date
kami dcd0578925 orchestra: TASK.md 2026-08-28 10:48:28 +04:00
4 changed files with 28 additions and 398 deletions
+24 -45
View File
@@ -1,70 +1,49 @@
# Task 06G4W2TMZ9MW9SEBM5MGTM5288
# Task 06G4E83E4KRXM8DS90M2648MGM
Describe each healthcheck check in one line
Add a --quiet flag to the healthcheck script
- Project: test-e2e
- Source: gitea:test-e2e/24
- Source: gitea:test-e2e/8
- Priority: 0
## Instructions
scripts/orchestra_e2e_healthcheck.sh now runs ten named checks. Give each one a one-line description, and print those descriptions where the names are already printed.
## Goal
The descriptions, one per check:
Add a --quiet flag to the healthcheck script
- repo_root_readable: the repository root exists and is readable
- scripts_dir_present: the scripts directory exists
- healthcheck_executable_bit: this script is executable
- selftest_present: the selftest script is present
- test_healthcheck_present: the healthcheck test is present
- readme_present: README.md is present
- no_crlf_line_endings: no tracked text file uses CRLF endings
- no_tabs_in_scripts: no script indents with tabs
- shebang_is_bash: every script declares the bash shebang
- usage_text_mentions_every_flag: the usage text lists every flag
scripts/orchestra_e2e_healthcheck.sh already handles --help. Add a --quiet flag alongside it that suppresses the success line and still exits 0. Leave the default behaviour and the --help output unchanged.
Where they appear:
## Verification
- `--list-checks` prints `<name>: <description>`, one per line.
- `--help` prints the same description beside each name in its Checks section.
- `--summary` is unchanged and keeps printing `<name>: ok`.
- `bash -n scripts/*.sh && bash scripts/orchestra_e2e_healthcheck.sh` exited 0
- commit: 41dee802416aaa9020a2e31ae5b79fa084a4f150
- independent review of 41dee802416aaa9020a2e31ae5b79fa084a4f150: pass
- accepted plan: 6c62e3cde23ed9aca296ed5b60295384b35cdad9fe0e1e45fa381d5801fb9af3
Plan this as FIVE phases, two checks per phase, in the order listed above.
## Behavioural changes
## Work one phase at a time
- none reported
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.
## Deviations from plan
## Every phase carries both kinds of check
- none reported
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.
## Remaining risks
## Verification policy for this project
- none reported
Only two commands may appear on a run: line, exactly:
## Review hotspots
- ["bash", "-n", "<path>"]
- ["bash", "scripts/orchestra_e2e_healthcheck.sh"]
- none reported
Anything else is refused when you seal the plan.
The sections above are derived from Orchestra state. The reported
changes, deviations, risks, and hotspots are the implementing agent's
own account and are not verified.
## Behaviour that must not change
## Acceptance criteria
Every existing flag keeps its current behaviour and exit status: --quiet, --json, --summary, --timing, --strict, --help. The success line is unchanged.
## Research first
Establish at least three findings with distinct confidence: at least one fact, one inference, one assumption.
## Handoff behaviour
Behave normally. If Orchestra asks you to write a handoff report, write it and stop.
Acceptance:
- Each of the ten checks has a one-line description in exactly one place in the script.
- --list-checks prints name and description for all ten.
- --help lists all ten names with their descriptions.
- --summary, --timing, --strict, --json and --quiet behave exactly as before.
- not stated in the task contract
## Completion
+4 -198
View File
@@ -1,210 +1,16 @@
#!/usr/bin/env bash
readonly VERSION=1.0.0
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,
# never read from an enclosing variable.
emit() {
local format=$1
shift
[ "$format" = none ] || printf "$@"
}
# describe <name>: the one-line description of a check. One case branch per
# name; this is the only place a description is written.
describe() {
case "$1" in
repo_root_readable) printf 'the repository root exists and is readable' ;;
scripts_dir_present) printf 'the scripts directory exists' ;;
healthcheck_executable_bit) printf 'this script is executable' ;;
selftest_present) printf 'the selftest script is present' ;;
test_healthcheck_present) printf 'the healthcheck test is present' ;;
readme_present) printf 'README.md is present' ;;
no_crlf_line_endings) printf 'no tracked text file uses CRLF endings' ;;
no_tabs_in_scripts) printf 'no script indents with tabs' ;;
shebang_is_bash) printf 'every script declares the bash shebang' ;;
usage_text_mentions_every_flag) printf 'the usage text lists every flag' ;;
esac
}
# label <name>: '<name>: <description>', or bare '<name>' while a name has no
# description yet.
label() {
local text
text=$(describe "$1")
if [ -n "$text" ]; then
printf '%s: %s' "$1" "$text"
else
printf '%s' "$1"
fi
}
# 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' "$(label "$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
usage text
printf 'Usage: %s\n\n' "${0##*/}"
printf 'Healthcheck script for Orchestra E2E tests.\n'
printf 'Exits 0 with a success message if all checks pass.\n'
exit 0
elif [ "$arg" = --list-checks ]; then
local listed
for listed in $CHECKS; do
emit text '%s\n' "$(label "$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
local format=text
[ -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
local timings=
[ -n "$timing" ] && timings=",\"timings\":{\"healthchecks\":$elapsed}"
emit "$format" '{"status":"ok","checks":%d%s}\n' "$TOTAL" "$timings"
exit 0
fi
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"
printf 'OK - all healthchecks passed\n'
exit 0
}
-49
View File
@@ -1,49 +0,0 @@
#!/usr/bin/env bash
# Self-test for the Orchestra E2E healthcheck.
here=$(cd "$(dirname "$0")" && pwd)
healthcheck="$here/orchestra_e2e_healthcheck.sh"
# fail <assertion> <captured stdout>: always echo what the healthcheck printed,
# so a red run is diagnosable without rerunning it by hand.
fail() {
printf 'selftest: FAILED %s\n' "$1" >&2
printf 'selftest: healthcheck stdout was:\n%s\n' "$2" >&2
exit 1
}
# plain run
out=$(bash "$healthcheck")
status=$?
[ "$status" -eq 0 ] || fail "plain run exit status: want 0, got $status" "$out"
case "$out" in
*OK*) ;;
*) fail "plain run stdout contains OK" "$out" ;;
esac
# --json run
jout=$(bash "$healthcheck" --json)
jstatus=$?
[ "$jstatus" -eq 0 ] || fail "--json run exit status: want 0, got $jstatus" "$jout"
jlines=$(printf '%s\n' "$jout" | wc -l)
[ "$jlines" -eq 1 ] || fail "--json run line count: want 1, got $jlines" "$jout"
case "$jout" in
'{"status":'*) ;;
*) 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'
-106
View File
@@ -1,106 +0,0 @@
#!/usr/bin/env bash
# Self-check for orchestra_e2e_healthcheck.sh.
HC="$(dirname "$0")/orchestra_e2e_healthcheck.sh"
OK='OK - all healthchecks passed'
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'
LABELS='repo_root_readable: the repository root exists and is readable
scripts_dir_present: the scripts directory exists
healthcheck_executable_bit: this script is executable
selftest_present: the selftest script is present
test_healthcheck_present: the healthcheck test is present
readme_present: README.md is present
no_crlf_line_endings: no tracked text file uses CRLF endings
no_tabs_in_scripts: no script indents with tabs
shebang_is_bash: every script declares the bash shebang
usage_text_mentions_every_flag: the usage text lists 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'
while IFS= read -r line; do printf ' %s\n' "$line"; done <<<"$LABELS"
printf '\nVersion: 1.0.0')"
fails=0
check() { # check <expected-stdout> <label> [args...]
local want=$1 label=$2 got status
shift 2
got=$(bash "$HC" "$@" 2>/dev/null)
status=$?
if [ "$got" != "$want" ] || [ "$status" -ne 0 ]; then
printf 'FAIL: %s (exit=%s)\n---got---\n%s\n---want---\n%s\n' "$label" "$status" "$got" "$want"
fails=$((fails + 1))
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
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=$LABELS
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'