Landing the first province sample of the rules/_evidence/ tree.
Locks down the hunan-2026 本科批 院校专业组 rule set so audit
output and downstream consumers can cite the source摘录 instead
of just 'trust me, the loader says so'.
What's in the box:
- rules/_evidence/README.md: directory contract, evidence-file
template (4 required sections), coverage table, and a note on
RuleLoader's future strict_evidence toggle.
- rules/_evidence/hunan/<11 rule keys>.md: one Markdown
摘录 per source_evidence_id declared in hunan.yaml
(mode / batch / max_volunteers / max_majors_per_group /
has_adjustment / adjustment_scope / retrieval_rule /
collection_count / subject_mode / official_url /
exam_subject_total). Each file carries the official quote,
the machine-readable YAML form, key edge cases, and the
next-review date.
- tests/test_rules_evidence_layer.py: 4 invariants
* README exists and documents the contract
* every active hunan.yaml source_evidence_id has a matching
.md file
* 11 evidence files contain the keywords that prove they
actually carry the rule (parameterised, one test per file)
* every evidence file has all 4 required template sections
* no orphan evidence files (file exists but no rule
references it)
Verification:
- focused: 27 passed (15 evidence-layer + 12 cli doctor)
- dev-verify full gate: all checks passed (ruff / mypy /
coverage / pytest / benchmark)
Follow-up (not in this commit):
- Wire RuleLoader.from_truth_root(strict_evidence=True) so
callers can opt in to fail-loud on missing evidence
- Extend the same pattern to national.yaml + 2-3 more
provinces
- Add a 'last_verified_at' field to each rule and surface
>90-day-old evidence via 'gaokao-cli rules status'
Round 3 of the unified gaokao-cli rollout. Adds four more passthrough
markers so the unified entry point can drive the remaining ops scripts
without bringing new data models into data/.
- data/cli_compat_delivery_dispatch.py: runpy shim for
scripts/gaokao-delivery-dispatch.py (DispatchDeliveryEvents).
- data/cli_compat_delivery_watchdog.py: runpy shim for
scripts/gaokao-delivery-watchdog.py (WatchdogDeliveryEvents).
- data/cli_compat_retention_cleanup.py: runpy shim for
scripts/gaokao-retention-cleanup.py (OrderRetentionCleanup).
- data/cli_compat_channel_fallback.py: forwarder for
data.channel_sync.monitor.main (CheckChannelHealth /
ManualTemplate).
- data/cli_compat_backup.py: subprocess wrapper that dispatches
scripts/backup_snapshot.sh and scripts/backup_verify.sh.
- data/rules/cli.py main(): routes gaokao-cli {channel, delivery
{dispatch,watchdog}, retention, backup {snapshot,verify}} to the
shims; rejects unknown subcommands with a structured error.
- docs/CLI_API_MAPPING.md §2.1: now lists 12 top-level commands with
their real subcommands and fallback paths.
- tests/test_cli_doctor_phase3.py: +6 tests covering channel
delegation, delivery dispatch / unknown-subcommand, retention
routing, backup shell routing, and backup unknown-subcommand
rejection.
Verification:
- focused: 12 passed
- dev-verify full gate: all checks passed (ruff / mypy / coverage /
pytest / benchmark)
Builds on 7d31d75 (order delegation + doctor self-check). The unified
gaokao-cli now also wraps the legacy shortlink and payment-doctor
scripts through thin runpy-based compat shims.
- data/cli_compat_gaokao_shortlink.py: loads scripts/gaokao-shortlink
via runpy.run_path; preserves argv routing for native subcommands
(create/list/resolve/revoke/...).
- data/cli_compat_payment_doctor.py: loads scripts/payment_provider_doctor.py;
strips the leading 'doctor' marker (the legacy script takes no args)
and rejects unrecognised tokens so silent flag drops are surfaced.
- data/rules/cli.py main(): routes gaokao-cli {share,payment} <...>
to the compat shims; gaokao-cli order remains delegated to
data.orders.cli.
- docs/CLI_API_MAPPING.md §2.1: records the actually-shipped command
surface (rules / majors / majors school-* / audit / order / share /
payment doctor / doctor) so the design doc matches runtime.
- tests/test_cli_doctor_phase3.py: covers share delegation, payment
doctor rejection, and the passthrough help flow.
Verification:
- focused: 6 passed
- dev-verify full gate: all checks passed (ruff / mypy / coverage / pytest / benchmark)
After successful payment, the gateway now lands users on an
intermediate 'payment-success' page that explains next steps
(continue intake, or jump to status) before they continue into
the live status view. This is a product-experience improvement
over the old direct /status redirect and was already staged in
uncommitted web_public work; this commit lands the matching test
assertions and copies.
Changes:
- admin/routes/web_public.py
* /portal/{token}/payment-success route + _render_payment_success_page
* payment_return_page now redirects to /payment-success (303)
* landing_page renders a 'consult' quick-intake card
- admin/tests/test_web_public.py
* test_payment_return_redirects_to_payment_success_page
* test_payment_success_page_served_after_paid_order
* landing/pricing/info/status copy assertions
- admin/tests/test_order_info_form.py
* assert the 'still need to fill' reminder renders
- admin/tests/test_order_status_page.py
* test_info_required_status_page_emphasizes_continue_intake
* assert '查看报告' / '查看当前进度' on delivered/processing status
- admin/tests/test_web_public_alipay_sim_e2e.py
* accept the new /payment-success intermediate page
- tests/test_cli_doctor_phase3.py
* drop unused pytest import (ruff F401)
Verification:
- focused alipay_sim E2E: 1 passed
- dev-verify full gate: all checks passed (ruff / mypy / pytest / coverage / benchmark)
docs-only + cli: extend scripts/gaokao-cli with two thin wrappers
without changing data/rules, data/majors_catalog, or rules/_truth.
- gaokao-cli order <subcommand> delegates argv to data.orders.cli.main
with the 'order' prefix stripped, so callers can use the unified
command face without changing the existing orders parser.
- gaokao-cli doctor <json?> returns a single self-check payload that
reuses RuleLoader + MajorsCatalogLoader (no new dependencies, no
gaokato/ scaffolding). Truth-root or catalog-root failures degrade
gracefully with structured {error, ok=false} sections instead of
raising.
- tests/test_cli_doctor_phase3.py covers: help text, order delegation
to list subcommand, doctor ok-path, doctor failure-path.
Also re-aligns docs/ACTIVE_EXECUTION_BOARD_2026-06-17.md (new) +
docs/CURRENT_STATE.md (single execution口径) + rules/majors source-
of-truth index files so design-phase numbering no longer drifts from
execution-phase numbering. Pre-existing 2026-06-16 optimization board
and 2026-06-17 phase2 plan are demoted to historical snapshots.
P0_P1_P2 remediation plan §4 historical cards get a red warning
banner so they are not re-read as current pending.
Verification:
- focused: 4 passed
- dev-verify: 770 passed, 1 failed
(alipay_sim E2E failure pre-existed this commit; caused by an
uncommitted upstream edit in admin/routes/web_public.py that
rewires payment_return -> /portal/{token}/payment-success while
the E2E still asserts /portal/{token}/status; out of scope for
this commit and intentionally not touched.)