feat(verdict): VerdictFailureClass + cargoless verdict --advisory — structural fix for INDETERMINATE bypass spiral #77

Open
triform-admin wants to merge 12 commits from agent/verdict-failure-class into main

Summary

Structural depth-fix for the pre-commit --no-verify bypass spiral on INDETERMINATE verdicts. Three phases:

  • Phase AVerdictFailureClass enum (DaemonDegraded/Unwitnessable/NonAttributable/TimeBudget) + classify_reason lock-table in cargoless-proto. Threaded through ProjectCheckSummary::Indeterminate, WorktreeStatus, TransitionEvent, and the statusfile. Rust's exhaustiveness check is the audit-completeness guarantee — every construction site stamps a class. Omit-when-None ser/de discipline (precedent: ra_blind_paths); unknown class tags drop to None forward-compat.
  • Phase Bcargoless verdict --advisory reifies the operator-design contract at the exit-code seam:
    • green → 0
    • red with red_diagnostics > 0 AND non-empty crates[] → 1 (justified hard-block)
    • red without evidence/attribution → 0 + structured stderr line
    • unknown (any class) → 0 + structured stderr line
    • unauthorized → 2 (setup error)
  • Phase C — README pointer, examples/pre-commit-advisory.sh reference hook, and docs/operator/pre-commit-hook-contract.md.

Four commits in branch:

  • 4544401 feat(verdict): structured VerdictFailureClass + cargoless verdict --advisory
  • 118aafd fix(verdict): reach VerdictFailureClass through cargoless-core re-export
  • b3334ab fix(verdict): complete Status literals + re-export classify_reason
  • c1b5f4e fix(proto): classify_reason prefix-match the project_check/red/ra arms

The last fix-forward addresses a real semantic bug: classify_reason was exact-match on project_check_* arms but production formats them as format!("{reason}: {detail}") at the publish edge. The detail-bearing lock-table assertions are the regression guard.

Test plan

  • Forgejo CI build/test/fmt/clippy all green on c1b5f4e
  • Classifier lock test covers all 14 reasons in BOTH bare and detail-bearing forms
  • Wire round-trip tests (status + event) for each class variant + omit-when-None
  • Compose-layer test asserts compose_hard_mode_payload lifts class without losing reason
  • CLI exit-code tests cover each shape under --advisory AND plain (no behavior change for plain)
  • Backward-compat: pre-INFRA-36 wire shape parses with class: None
  • Consumer-side smoke (manual, post-merge): tf-multiverse pre-commit hook adopting examples/pre-commit-advisory.sh
## Summary Structural depth-fix for the pre-commit `--no-verify` bypass spiral on INDETERMINATE verdicts. Three phases: - **Phase A** — `VerdictFailureClass` enum (`DaemonDegraded`/`Unwitnessable`/`NonAttributable`/`TimeBudget`) + `classify_reason` lock-table in `cargoless-proto`. Threaded through `ProjectCheckSummary::Indeterminate`, `WorktreeStatus`, `TransitionEvent`, and the statusfile. Rust's exhaustiveness check is the audit-completeness guarantee — every construction site stamps a class. Omit-when-None ser/de discipline (precedent: `ra_blind_paths`); unknown class tags drop to `None` forward-compat. - **Phase B** — `cargoless verdict --advisory` reifies the operator-design contract at the exit-code seam: - green → 0 - red with `red_diagnostics > 0` AND non-empty `crates[]` → 1 (justified hard-block) - red without evidence/attribution → 0 + structured stderr line - unknown (any class) → 0 + structured stderr line - unauthorized → 2 (setup error) - **Phase C** — README pointer, `examples/pre-commit-advisory.sh` reference hook, and `docs/operator/pre-commit-hook-contract.md`. Four commits in branch: - `4544401` feat(verdict): structured VerdictFailureClass + `cargoless verdict --advisory` - `118aafd` fix(verdict): reach VerdictFailureClass through cargoless-core re-export - `b3334ab` fix(verdict): complete Status literals + re-export classify_reason - `c1b5f4e` fix(proto): classify_reason prefix-match the project_check/red/ra arms The last fix-forward addresses a real semantic bug: `classify_reason` was exact-match on `project_check_*` arms but production formats them as `format!("{reason}: {detail}")` at the publish edge. The detail-bearing lock-table assertions are the regression guard. ## Test plan - [x] Forgejo CI build/test/fmt/clippy all green on c1b5f4e - [x] Classifier lock test covers all 14 reasons in BOTH bare and detail-bearing forms - [x] Wire round-trip tests (status + event) for each class variant + omit-when-None - [x] Compose-layer test asserts `compose_hard_mode_payload` lifts class without losing reason - [x] CLI exit-code tests cover each shape under `--advisory` AND plain (no behavior change for plain) - [x] Backward-compat: pre-INFRA-36 wire shape parses with `class: None` - [ ] Consumer-side smoke (manual, post-merge): tf-multiverse pre-commit hook adopting `examples/pre-commit-advisory.sh`
Pre-existing in-flight work on this branch, committed separately from the
content-exempt blind-path change that follows.

- Factor member_result_to_summary out of coalesced_project_check so the
  InteractionRed→Indeterminate(retryable) attribution rule is unit-testable
  with synthetic members (a single-member coalesced call can only produce
  SoloRed, so InteractionRed is otherwise unreachable from a live test).
- An InteractionRed (combined union of concurrent same-base overlays failed
  while every member is solo-green) maps to a retryable unknown with a verbose
  "not your red, retry" explanation — never a Red attributed to one submitter.
- INFRA-36 parity: emit the verdict.project_checks span on the coalesced path
  so coalesced outcomes are queryable in SigNoz, not just in the stderr line.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(serveapi): content-exempt blind paths (CARGOLESS_BLIND_PATHS) — close generated-twin RA-native false-green
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / fmt (push) Successful in 2m45s
ci / build (push) Successful in 2m46s
ci / clippy (push) Successful in 2m46s
ci / test (push) Failing after 2m47s
6efb97f411
The deployed daemon verdict is RA-native only (a product invariant — it never
runs cargo check), and RA-native is structurally blind to cross-crate type
resolution. So it greened `error[E0425]: cannot find type DonutSlice` in a
generated twin (chemistry/generated/ui-frozen/donut_chart_frozen.rs); it
self-merged and only the later SSR/rustc compile caught it.

The existing #A8 macro-blind net did not cover it: a generated twin has no
`view!`, so the CARGOLESS_MACRO_BLIND_MACROS content filter clears it to green
even when a path glob matches.

Add a second, content-exempt glob set CARGOLESS_BLIND_PATHS whose hits are
blind REGARDLESS of macro content, feeding the same downstream machinery:

- compute_blind_hit (was compute_macro_blind_hit) takes exempt_globs; an
  exempt-glob hit is always blind (no content scan), OR a macro-glob hit
  narrowed by macro_names as before. Empty exempt set ⇒ byte-identical to prior.
- PushAttribution.blind_hit (was macro_blind_hit) now means "blind by either
  mechanism"; threaded through record_push_attribution(_with_globs).
- Reuses unchanged: ra_native_payload green→unknown(ra_blind_path_green_
  unwitnessed) downgrade, the ra_blind_paths wire annotation, and the
  CARGOLESS_MACRO_BLIND_ESCALATE witness escalation (now governs both sets).

Tests: regression (exempt glob + macro-free generated file + macro_names=[view]
⇒ blind), coexistence of both sets, empty-exempt non-regression, and
end-to-end classification at consume. Docs: D-PROJECT-CHECKS § Blind-path
coverage, CHANGELOG, known_blind README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
deploy(jobs): in-cluster kaniko build job for the app-serve image
All checks were successful
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / clippy (push) Successful in 2m5s
ci / fmt (push) Successful in 2m57s
ci / test (push) Successful in 2m58s
ci / build (push) Successful in 2m58s
4d6eeb73ea
Mirrors build-serve-image.yaml for the cargoless-appserve daemon image
(WASM toolchain, cargoless-appserve.Dockerfile). Same GitHub git context +
registry as the serve job; adds the :latest destination so the preview
Deployment (imagePullPolicy: Always) picks up a rebuild on rollout restart.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(verdict): structured VerdictFailureClass + cargoless verdict --advisory
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / clippy (push) Failing after 2m31s
ci / fmt (push) Successful in 3m59s
ci / test (push) Failing after 3m59s
ci / build (push) Failing after 4m0s
4544401d4f
The operator's pre-commit hook produced 4× INDETERMINATE in a row on a
110-file / 13k-line codegen sweep, forcing `--no-verify` each time. The
cargoless wire flattens 14 distinct INDETERMINATE reasons into one
free-text `verdict_failure_reason`, so a hook cannot structurally
distinguish "daemon was degraded for this push class" from "real RED",
and hard-blocks on both. The operator-design contract (cargoless-gate
witness is advisory by design; the downstream compile-witness is the
authoritative gate) was not encoded anywhere a hook could consume it.

Structural fix shipped here:

  Phase A — Daemon: VerdictFailureClass enum
    * `cargoless-proto` gains `VerdictFailureClass` (DaemonDegraded /
      Unwitnessable / NonAttributable / TimeBudget) + `classify_reason`,
      a lock-table mapping each of the 14 reason strings to its class.
    * `ProjectCheckSummary::Indeterminate` now carries `class`, so
      Rust's exhaustiveness check refuses to compile until every
      construction site stamps one — audit completeness by the type
      system, not by sidecar.
    * Class lifts through `compose_hard_mode_payload` (the publish-edge
      funnel where the prior code flattened `{reason, detail}` into a
      single string and lost the `&'static str` boundary).
    * `WorktreeStatus` and `TransitionEvent` gain
      `verdict_failure_class: Option<VerdictFailureClass>`, with the
      `ra_blind_paths` additive-on-the-wire precedent: emit when Some,
      omit when None, parser drops unknown tags to None instead of
      erroring. JSON byte shape is unchanged when class is None.
    * Statusfile mirrors the additive field on disk under the same
      omit-when-None discipline.

  Phase B — CLI: `cargoless verdict --advisory`
    * New flag reifies the advisory contract at the exit-code seam.
      `green` → 0; `red` with `red_diagnostics > 0` AND non-empty
      `crates[]` → 1 (the one justified hard-block); every other shape
      (red-without-evidence, red-without-attribution, unknown of any
      class, client-synthesized unknown from ladder exhaustion /
      await timeout) → 0 with one structured
      `[cargoless:advisory] verdict=... class=... reason=...` stderr
      line per skip.
    * JSON wire shape on stdout is unchanged.
    * Non-advisory mode is byte-identical to the legacy 0/1/75 ladder.
    * Config-error exit 2 (unauthorized everywhere) still hard-fails
      under `--advisory` — a misconfigured remote is a setup error, not
      a degraded daemon.

  Phase C — Publish the consumer contract
    * README section ("Local hooks: use `cargoless verdict --advisory`").
    * `examples/pre-commit-advisory.sh` reference hook (env-driven,
      three substantive lines — all policy lives in cargoless).
    * `docs/operator/pre-commit-hook-contract.md` carves the exit-code
      mapping and the rationale for the protective shape.

Test coverage:

  * `classify_reason` lock-table test: all 14 reasons mapped, an
    unmapped reason → None.
  * Wire round-trip test in transport/mod.rs: every class round-trips
    via JSON; None stays absent from the wire; unknown tag from a
    newer daemon drops to None.
  * Statusfile round-trip test mirrors the wire pattern.
  * `compose_hard_mode_payload` truth-table test: every Indeterminate
    class preserves through to the published verdict.
  * `exit_byte_for_status`: plain mode matches legacy byte-for-byte;
    advisory mode tests cover all four protective vs non-protective
    shapes plus every VerdictFailureClass variant on unknown.
  * `--advisory` flag parsing + scoping test (verdict-only).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(verdict): reach VerdictFailureClass through cargoless-core re-export
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / fmt (push) Successful in 2m18s
ci / clippy (push) Failing after 2m19s
ci / build (push) Failing after 3m27s
ci / test (push) Failing after 3m27s
118aafdbac
The `cargoless` binary crate depends on `cargoless-core`, not on
`cargoless-proto` directly. Direct `cargoless_proto::VerdictFailureClass`
references in servedrv/serveapi/statusfile/verdict failed to compile
on Forgejo CI build (E0432 / E0433: undeclared crate).

Re-export `VerdictFailureClass` from `cargoless-core::lib.rs` alongside
the existing proto pass-throughs (`CheckResult`, `TreeState`, etc. —
the same adjacency precedent), then route every binary-crate reference
through `cargoless_core::VerdictFailureClass` / `cargoless_core::classify_reason`.

Net wire shape, semantics, and exhaustive-match guarantees are
unchanged; this is purely a dependency-graph plumbing fix.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(verdict): complete Status literals + re-export classify_reason
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / fmt (push) Successful in 7m22s
ci / test (push) Failing after 7m24s
ci / build (push) Successful in 8m22s
ci / clippy (push) Successful in 14m4s
b3334ab007
Second fix-forward pass after 118aafd:

(a) The `cargoless-core::classify_reason` re-export was missing —
statusfile.rs:185 calls it but only `VerdictFailureClass` was added
to the pass-through. Append `classify_reason` to the same `pub use`
block.

(b) Eight Status struct literals across build.rs, servedrv.rs (one),
watch.rs, and statusfile.rs (test sites) were missing the new
`verdict_failure_class: Option<VerdictFailureClass>` field, causing
E0063 "missing field" diagnostics. Add `verdict_failure_class: None`
to every literal that lists fields explicitly (sites that already
use `..Default::default()` or `..st.clone()` need no change — that's
the whole point of having a Default-derive on Status).

The second-construction site in servedrv.rs (line 1488,
`compose_hard_mode_payload`) already received `verdict_failure_class:
failure_class` in the original Phase A wiring.

Net wire shape, semantics, and exhaustive-match guarantees unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(proto): classify_reason prefix-match the project_check/red/ra arms
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / test (push) Successful in 4m13s
ci / fmt (push) Successful in 4m13s
ci / build (push) Successful in 9m24s
ci / clippy (push) Successful in 5m23s
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / test (pull_request) Has been cancelled
ci / clippy (pull_request) Has been cancelled
ci / build (pull_request) Has been cancelled
ci / fmt (pull_request) Has been cancelled
c1b5f4e02a
The exact-match block silently mis-classed every reason that reaches
the publish edge, because `compose_hard_mode_payload` formats reasons
as `format!("{reason}: {detail}")`. A reason like
`"project_check_setup_error: oops"` therefore fell through to `None`
instead of `DaemonDegraded`, even though the bare prefix is on the
locked list — the exact regression caught by the new
`verdict_payload_unknown_post_classifies_known_reasons` test.

The `witness:*` arms above already use `starts_with`. Apply the same
discipline to `project_check_*`, `red_claimed_without_evidence`, and
`ra_native_*` / `ra_blind_path_*` — the rest of the locked taxonomy.

The lock-table test now asserts BOTH the bare form (existing) AND a
detail-bearing form (new) for each project_check / red / ra reason,
so the exact-match regression cannot silently come back.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Merge branch 'main' into agent/verdict-failure-class
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / fmt (push) Successful in 8m2s
ci / test (push) Failing after 8m36s
ci / build (push) Failing after 8m38s
ci / test (pull_request) Failing after 7m24s
ci / fmt (pull_request) Successful in 7m23s
ci / clippy (push) Failing after 8m9s
ci / build (pull_request) Failing after 8m37s
ci / clippy (pull_request) Failing after 9m9s
3f4c62f14e
Resolve 3 conflicts in:
- crates/cargoless-core/src/transport/mod.rs (parallel additive-contract
  asserts for verdict_failure_class and gated_checks_ran; keep both)
- crates/cargoless/src/serveapi.rs (parallel helpers
  member_result_to_summary vs configured_batch_u32/u64; keep all)
- crates/cargoless/src/servedrv.rs (5 ProjectCheckSummary::Indeterminate
  sites need both the new `class:` field AND main's tuple
  `(Indeterminate, ran_check_ids)` return shape; combine)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(transport,verdict): backfill verdict_failure_class + gated_checks_ran on 2 missed WorktreeStatus literals
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / fmt (push) Successful in 6m39s
ci / clippy (push) Successful in 6m23s
ci / test (push) Failing after 6m45s
ci / build (push) Successful in 12m15s
ci / fmt (pull_request) Successful in 10m46s
ci / clippy (pull_request) Successful in 11m8s
ci / build (pull_request) Successful in 15m57s
ci / test (pull_request) Failing after 15m55s
1af601c8af
These two literals were on main BEFORE my branch (http.rs:1803
EchoBaseSha mock, verdict.rs:882 advisory_status test helper) but
got auto-merged without adding the new exhaustive fields. The
audit script that found the 8 statusfile.rs sites pre-merge
missed them because they came in through `origin/main`, not
through the conflicted set.

Also adds gated_checks_ran: Vec::new() to verdict.rs:882 (the
field was added by main between my branch-point and the merge).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
feat(verdict,serve): prove known-blind corpus + batch-check --advisory + unprotected-RA observability
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / clippy (push) Successful in 3m59s
ci / build (pull_request) Successful in 6m30s
ci / test (push) Failing after 8m0s
ci / fmt (push) Successful in 8m0s
ci / clippy (pull_request) Successful in 7m3s
ci / fmt (pull_request) Successful in 7m4s
ci / test (pull_request) Failing after 7m6s
ci / build (push) Successful in 11m13s
da12b89b18
CGLS-side hardening for the witness/verdict escalation. Most of the
escalation's asks (pre-push hook exit codes, the witness reporter's
dual-context cancel-latch, witness auto-retry, the portal/src branch-
protection gate, the compile-lane scheduler) are external tf-multiverse
infrastructure that consumes the cargoless verdict primitive, not this
repo. This commit lands the genuinely in-scope kernel:

A. Prove the blind-path detector against the REAL known-blind corpus.
   New tests read the actual bench/fixture/src/known_blind/*.rs contents
   and assert compute_blind_hit fires + ra_native_payload downgrades a
   clean RA green to unknown(ra_blind_path_green_unwitnessed)/Unwitnessable,
   with drift guards. Closes the gap where the corpus (incl. the #7067
   view! double-capture E0382 class) was documented but never run against
   the detector, so it could silently rot into a false green.

D. Add the missing generated-twin fixture
   (generated_twin_unimported_type.rs) for the content-exempt cross-crate
   class (DonutSlice E0425). A loose, never-compiled corpus file matching
   the existing convention (a real sibling crate would force a Cargo.lock
   regen, and the content-exempt detector is pure path-glob anyway).

C. batch-check --advisory — exit-code parity with verdict --advisory for a
   staged/pre-commit gate: real RED still exit 1, Indeterminate + transport
   failure exit 0 + a [cargoless:advisory] line instead of 75. Plain mode
   byte-identical to the legacy 0/1/75 ladder.

B. Unprotected-RA-native startup observability — a [cargoless:obs] blind-
   path config banner at serve boot, plus a distinct WARN when RA-native
   runs with zero blind globs (the false-GREEN precondition). cargoless
   cannot set tf-multiverse's Flux env, but it can refuse to be silently
   unprotected. Observability only; pure formatter is unit-tested.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix(test): drift guards key on content_has_macro_call, not naive view! substring
Some checks failed
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / build (pull_request) Failing after 22s
ci / fmt (pull_request) Failing after 18s
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / clippy (pull_request) Failing after 21s
ci / test (pull_request) Has been cancelled
ci / test (push) Failing after 6m29s
ci / build (push) Successful in 6m29s
ci / clippy (push) Successful in 6m59s
ci / fmt (push) Successful in 6m59s
36b59a4917
CI test job for da12b89 failed on real_generated_twin_corpus_file_is_content
_exempt_blind (327 passed, 1 failed — not a flake): the twin corpus file's
doc-comment prose mentions `view!` in backticks while explaining WHY the
class has no macro, so `content.contains("view!")` tripped the
"must NOT contain view!" drift guard.

Fix both corpus drift guards to assert against the real detector primitive
`content_has_macro_call` (which keys on an actual `view!{`/`(`/`[`
invocation) instead of a naive substring. This is strictly more correct —
it is exactly what the macro-narrowed net keys on — and tolerates prose
mentions of the macro name. The compute_blind_hit / ra_native_payload
assertions were already correct; only the prose-level guards were wrong.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ci: re-trigger (flake re-roll)
Some checks failed
ci / clippy (push) Failing after 17s
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / build (pull_request) Failing after 17s
ci / test (pull_request) Failing after 17s
ci / fmt (pull_request) Failing after 17s
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / clippy (pull_request) Failing after 17s
ci / build (push) Successful in 6m26s
ci / test (push) Failing after 7m11s
ci / fmt (push) Successful in 8m13s
5fa2807dcf
No content change. Prior SHA 36b59a4 was green on build/fmt/clippy + the
cargoless bin test suite (328/328); the only reds were:
  - cargoless-core project_checks::timeout_results_are_not_cached and
    appdrv::pressure_prune_* — pre-existing ~10%-load-flaky tests in a crate
    this branch does not touch (1ms-timeout race / pressure-prune race), and
  - run-799 build/fmt/clippy dying on a Docker Hub unauthenticated pull rate
    limit (toomanyrequests) — pure infra, the job never compiled.
Re-rolling to get a clean run; my code is unchanged and verified green.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Some checks failed
ci / clippy (push) Failing after 17s
ci / rust-analyzer latency harness (S1 / AC#2) (push) Has been skipped
ci / build (pull_request) Failing after 17s
ci / test (pull_request) Failing after 17s
ci / fmt (pull_request) Failing after 17s
ci / rust-analyzer latency harness (S1 / AC#2) (pull_request) Has been skipped
ci / clippy (pull_request) Failing after 17s
ci / build (push) Successful in 6m26s
ci / test (push) Failing after 7m11s
ci / fmt (push) Successful in 8m13s
This pull request has changes conflicting with the target branch.
  • crates/cargoless-core/src/transport/mod.rs
  • crates/cargoless/src/batchcheck.rs
  • crates/cargoless/src/serveapi.rs
  • crates/cargoless/src/servedrv.rs
  • crates/cargoless/src/verdict.rs
  • deploy/jobs/build-appserve-image.yaml
  • docs/design/D-PROJECT-CHECKS.md
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin agent/verdict-failure-class:agent/verdict-failure-class
git switch agent/verdict-failure-class

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff agent/verdict-failure-class
git switch agent/verdict-failure-class
git rebase main
git switch main
git merge --ff-only agent/verdict-failure-class
git switch agent/verdict-failure-class
git rebase main
git switch main
git merge --no-ff agent/verdict-failure-class
git switch main
git merge --squash agent/verdict-failure-class
git switch main
git merge --ff-only agent/verdict-failure-class
git switch main
git merge agent/verdict-failure-class
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
triform/cargoless!77
No description provided.