5454 exit 1
5555 fi
5656
57+ plugin-integration :
58+ needs : fast-gate
59+ runs-on : ubuntu-latest
60+ steps :
61+ - uses : actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
62+ with :
63+ persist-credentials : false
64+ - uses : actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
65+ with :
66+ go-version-file : go.mod
67+ # No fetch_meta: the git-archive clean tree must embed only the
68+ # committed meta_data stub (reproduces the bare-module customer state).
69+ - name : Run plugin-integration L4 tests
70+ run : go test -count=1 -timeout=15m ./tests/plugin_e2e/...
71+
72+ sidecar-integration :
73+ needs : fast-gate
74+ runs-on : ubuntu-latest
75+ steps :
76+ - uses : actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
77+ with :
78+ persist-credentials : false
79+ - uses : actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
80+ with :
81+ go-version-file : go.mod
82+ - name : Run sidecar tag build + HMAC round-trip
83+ run : make sidecar-test
84+
5785 # ── Layer 2: Quality Gate ──────────────────────────────────────────
5886 unit-test :
5987 needs : fast-gate
@@ -183,7 +211,11 @@ jobs:
183211 run : python3 scripts/fetch_meta.py
184212 - name : Run tests with coverage
185213 run : |
186- packages=$(go list ./... | grep -v '^github.com/larksuite/cli/tests/cli_e2e$' | grep -v '^github.com/larksuite/cli/tests/cli_e2e/')
214+ # tests/ holds only L3/L4 suites (cli_e2e, plugin_e2e, sidecar_e2e) that
215+ # have dedicated jobs; exclude the whole subtree so none of them runs a
216+ # second time here — and, crucially, so an observe-only suite's failure
217+ # can never block merges through coverage's spot in the results loop.
218+ packages=$(go list ./... | grep -v '^github.com/larksuite/cli/tests/')
187219 go test -race -coverprofile=coverage.txt -covermode=atomic $packages
188220 - name : Upload coverage to Codecov
189221 if : ${{ github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork }}
@@ -468,7 +500,7 @@ jobs:
468500 # ── Results Gate (single required check for branch protection) ─────
469501 results :
470502 if : ${{ always() }}
471- needs : [fast-gate, unit-test, lint, script-test, deterministic-gate, coverage, deadcode, e2e-dry-run, e2e-live, security, license-header]
503+ needs : [fast-gate, unit-test, lint, script-test, deterministic-gate, coverage, deadcode, e2e-dry-run, e2e-live, security, license-header, plugin-integration, sidecar-integration ]
472504 runs-on : ubuntu-latest
473505 steps :
474506 - name : Evaluate results
@@ -488,10 +520,19 @@ jobs:
488520 echo "| L3 | e2e-live | ${{ needs.e2e-live.result }} |" >> $GITHUB_STEP_SUMMARY
489521 echo "| L4 | security | ${{ needs.security.result }} |" >> $GITHUB_STEP_SUMMARY
490522 echo "| L4 | license-header | ${{ needs.license-header.result }} |" >> $GITHUB_STEP_SUMMARY
523+ echo "| L4 | plugin-integration (observe-only) | ${{ needs.plugin-integration.result }} |" >> $GITHUB_STEP_SUMMARY
524+ echo "| L4 | sidecar-integration (observe-only) | ${{ needs.sidecar-integration.result }} |" >> $GITHUB_STEP_SUMMARY
491525
492526 # Any failure or cancellation in any job blocks the merge.
493527 # Legitimately skipped jobs (deadcode on push, e2e-live when not
494528 # needed or on a fork, license-header on push) are OK.
529+ #
530+ # plugin-integration and sidecar-integration are intentionally NOT
531+ # in this loop yet: they run on every PR and their status is shown
532+ # in the table above, but a failure is observe-only (non-blocking)
533+ # during the initial soak. Graduation to required is tracked in
534+ # https://github.com/larksuite/cli/issues/1894 (criteria: 4
535+ # consecutive weeks with zero false positives).
495536 FAILED=0
496537 for result in \
497538 "${{ needs.fast-gate.result }}" \
0 commit comments