Commit Graph

37 Commits

Author SHA1 Message Date
pulse-triage[bot] a2fc29b70b Limit guarded demo updates to owned signed runtime files
Retain the rejected VERSION rollback result. Replace general installer execution with pinned-signature archive selection and atomic binary/VERSION swaps, preserve unrelated distribution assets, and fail closed on missing matching native acceptance before production mutation.

Change-source: pulse-maintainer
2026-10-03 03:01:05 +01:00
pulse-triage[bot] 360721cc91 Bind demo cohost observation to the real Relay health route
Current operational source exposes healthz and takes the shared deployment lock. Pin that route and make the disposable service return 404 for unknown paths so native acceptance cannot manufacture a healthy cohost observation.

Change-source: pulse-maintainer
2026-10-03 01:44:42 +01:00
pulse-triage[bot] 4df3e8974e Add disposable native acceptance for owned demo recovery
Exercise actual systemd and Caddy with a changed executable, distinct persistent data, delayed synthetic failure, observer loss and TERM during full rollback. Keep 300-second clocks, exact-source and cleanup receipts; no production credential or worker system privilege is added. Update the connected recovery contract and policy assertions, and retain bounded service identity observations.

Change-source: pulse-maintainer
2026-10-03 01:36:36 +01:00
pulse-triage[bot] 751fb67523 Bind demo controls without broadening unrelated release proof
Keep new source paths on their own connected proof policy after the full lookup suite exposed six broadened metadata expectations. Preserve terminal no-op cancellation evidence and the runtime file owner.

Contract-Neutral: Correct connected observation and verification routing within the existing demo operations and authority.
Change-source: pulse-maintainer
2026-10-03 01:12:47 +01:00
pulse-triage[bot] f56e28e6af Own demo update and recovery through sustained host observation
Compose the existing signed stable demo paths with the Relay host lock, durable systemd ownership, full persistent estate capture and five-minute forward and recovery watches. Preserve uncertain attempts and failed rollback, refuse destructive headroom pruning, and keep native installed acceptance separate from connected source controls.

Change-source: pulse-maintainer
2026-10-03 01:05:16 +01:00
pulse-triage[bot] bb1903e48d Stop demo diagnostics at failed tailnet readiness
Failed setup now yields local-only, topology-free diagnostics. Require recognised Running state and successful tailnet ping before TCP, retain probe exits without raw private output or fallback probes, and exercise twenty synthetic readiness/privacy cases. Parent controls expose false success and private output on both channels. Keep workflow identities, secrets, action pins, mutation gates and release scope unchanged.

Change-source: pulse-maintainer
2026-10-01 17:36:26 +01:00
pulse-triage[bot] dc75bd6e3b Keep pre-release evidence visible and identify running images
The feedback form forced screenshots into shell code fences and conflated a running container image with a non-container release asset. Preserve rendered attachments, ask for the Pulse image only on running containers, and keep failed-install evidence truthful.

Contract-Neutral: Community issue intake only; release and installation contracts unchanged.
Change-source: pulse-maintainer
2026-09-29 20:03:09 +01:00
pulse-triage[bot] 564a63a651 Accept unsafe one-off failures in community intake
The bug and v6 pre-release forms previously required reproduction steps even when a retry could cause a host outage, duplicate update, alert storm or data loss. Ask for the original sequence and safe evidence instead, and mirror the guidance in the public triage document.

Contract-Neutral: Community intake wording only; release and installation contracts unchanged.
Change-source: pulse-maintainer
2026-09-29 19:24:42 +01:00
pulse-triage[bot] 5d39c8623f Make failed-install issue intake truthful
Ask for the attempted release and installer provenance when Pulse never started, without forcing a false running-version attestation or a token-bearing command. Keep public triage guidance aligned and pin both forms in tests.

Contract-Neutral: Issue form provenance and wording change community intake only, not release promotion or artifact dispatch
Change-source: pulse-maintainer
2026-09-29 18:44:42 +01:00
pulse-triage[bot] 498e2b12a2 Merge protected Pulse main with reviewed publication range
Preserve upstream browser verification for the newer Relay retirement surface; earlier action recovery proof remains in reviewed ancestry. Include current CI sharding and qualification canary without rewriting accepted commits.

Change-source: pulse-maintainer
2026-09-29 17:12:31 +01:00
courtmanr@gmail.com 341e8a7eb4 Calibrate internal/api shard weights to CI and record per-test seconds
The weights from #2324 came from one local run and left the api shards at
4.5, 8.8, 17.1 and 12.5 minutes on CI. Most of the 17.1 was not test time.
That shard ran `-run . -skip <1231 names>`, and the test binary caches only
its last compiled pattern, so alternating the two recompiled the 62 KB skip
regex for every test and subtest (about 50 ms each under -race locally, 30s
against 1.3s for 300 trivial tests). Two runs put that shard at 887s and
875s against roughly 450s of tests. The skip path now passes -skip alone.

Every api shard now runs go test -json through
.github/scripts/record-internal-api-test-seconds.py. It prints what plain go
test would (package lines and the output of failing or unfinished tests),
exits non-zero on any failure behind pipefail, and writes each top-level
test's seconds to an internal-api-test-seconds-N artifact that is uploaded
even when the shard fails. .github/scripts/refresh-internal-api-test-seconds.py
rebuilds the weights file from those artifacts (gh run download, median
across runs, DEFAULT_WEIGHT set to the mean of the unlisted tests, which the
selector now reads from the file).

Until those artifacts exist, the weights are a local -race -json run with
each region of go test's order scaled to what CI reported for it.
Equal-count quarters averaged 107, 437, 100 and 787s over four runs, and the
weighted cut gave 131s for the first 1187 tests, 350s for the next 23 and
608s for the last 21 over two. The last quarter and the last 21 tests
disagree on how the tail splits, so the tail takes the midpoint of an exact
fit and a pooled factor.

With these weights four shards still predict a slowest shard near 10
minutes, and a 20% slower runner on the tail would take it past the 11
minutes of Frontend and rest-1. Five shards predict about 131, 325, 280-340,
330-355 and 330-365s of tests, or 4.5 to 8.5 minutes a job with about 2.3
minutes of setup, so API_SHARD_COUNT goes to 5. Every test still runs
exactly once in contiguous go test order, and all five slices passed locally
from their new starting points. The required Backend tests (api) verdict
keeps its name.
2026-09-29 15:27:08 +01:00
pulse-triage[bot] 20c99e2e67 Preserve community decomposition decisions in issue label sync
An empty form field or unrelated edit cannot prove comment-raised topics were dispositioned. Only label newly declared topics, leaving removal to whole-thread triage and respecting a completed manual disposition.

Change-source: pulse-maintainer
2026-09-29 14:45:33 +01:00
courtmanr@gmail.com 06d78b66d3 Balance internal/api race shards by measured run time
The four Backend tests (api-N) shards took equal-count quarters of go
test's list, which left them at 4.0, 10.6, 4.0 and 16.8 minutes on the
first PR run, and at 1.9, 8.0, 1.5 and 10.3 minutes of go test time on
the following main push (run 36560070496). Almost all of it sits in a
few tests. One contract mock chart test runs about six minutes on the
runner, and the 28 integration server tests at the end of the list take
about twenty seconds each, so the fourth quarter held nearly half the
package.

Shards are still contiguous runs of go test's own order, since some
tests depend on package state from their neighbours, but the cut points
now come from estimated seconds.
.github/scripts/select-internal-api-shard.sh weighs each test from
.github/scripts/internal-api-test-seconds.txt (the 199 tests at 0.5s or
more, seeded from a local -race -json run scaled to that main run's
shard totals, with a 0.05s default for anything unlisted), binary
searches the smallest per-shard budget that fits the list into four
slices, and fills up to it. The weights only move cut points. Every test
is assigned exactly one shard in a single pass, so a stale file can
unbalance shards but never drop or repeat a test, and no shard is ever
empty.

With today's list the slices hold 1187, 23, 2556 and 21 tests, estimated
at 1.9, 6.9, 6.5 and 6.7 minutes of tests, or about 9.5 minutes per job
with the roughly 2.6 minutes of setup and race compile. The 2556-test
slice would need a 124 KB -run pattern, so a shard passes -skip of the
other shards' tests whenever that is shorter, which runs the same tests
in the same order.
2026-09-29 13:14:27 +01:00
pulse-triage[bot] 05d8ae9227 fix(triage): preserve concurrent community label changes
Apply classification label deltas instead of replacing the stale issue-event label set. This keeps Community retest and unrelated labels untouched while retaining metadata cleanup; regressions cover newer additions, removals and API failures.

Change-source: pulse-maintainer
2026-09-08 12:00:46 +01:00
pulse-triage[bot] 590b80cfe7 fix(triage): retire version-only retest posting and timeout closure
An older reported version does not establish a relevant released fix, and silence after generic advice does not justify closing an unresolved report. Retire both scheduled paths and retain no-write compatibility entry points. Preserve metadata classification while leaving retest state to Community's evidence-backed whole-thread review. Focused regression tests cover both entry points, label ownership and workflow retirement.

Change-source: pulse-maintainer
2026-09-08 11:32:57 +01:00
pulse-triage[bot] ed41610c41 fix(triage): keep upgrade source versions out of structured reports
Issue #1913 reports an incomplete v6 running version but names its old v5 image in the upgrade title. Falling back to that title incorrectly starts old-version retest handling. Treat the structured version field as authoritative and stop at the next heading, requesting exact version information when incomplete. Cover the parser and mocked label/comment flows without changing public issue state.

Change-source: pulse-maintainer
2026-09-05 20:01:58 +01:00
pulse-triage[bot] 1f3cc0fe37 Preserve headed secondary issue topics
Stop the issue-form parser only at known subsequent form fields so reporter-authored Markdown subheadings do not suppress needs-decomposition. Reproduce the public #1875 body shape in the focused test.\n\nChange-source: pulse-maintainer
2026-09-04 04:13:04 +01:00
pulse-triage[bot] af0e8f8d39 Reclaim CI capacity when pull requests close
Cancel queued and running validation workflows for a closed pull request head so obsolete matrices cannot hold the hosted-runner limit and delay required checks. Keep the privileged close hook bound to reviewed default-branch code and cover reopen, branch-reuse, identity, and API-race boundaries.

Change-source: pulse-maintainer
2026-09-02 11:03:53 +01:00
Pulse Test 1720fd635b Harden CodeQL-scanned input boundaries 2026-08-29 23:42:23 +01:00
pulse-triage[bot] 6cb5d3046b Preserve secondary issue feedback
Contract-Neutral: issue-triage intake only; no product, deployment, or release contract change
Change-source: pulse-maintainer
2026-08-29 12:24:03 +01:00
pulse-triage[bot] 2c6eb9a58d Clear retired demo alert replay sources 2026-08-29 03:57:50 +01:00
pulse-triage[bot] 5686069d6e Reset poisoned demo incident replay 2026-08-29 03:53:34 +01:00
Richard Courtman db0145b2b9 Bound legacy demo history startup 2026-08-29 03:47:09 +01:00
pulse-triage[bot] 2bf37a58c7 Capture blocked demo startup stack 2026-08-29 03:46:48 +01:00
pulse-triage[bot] 0d5b1202b5 Disable dev metrics backfill on stable demo 2026-08-29 03:41:44 +01:00
Richard Courtman c006b15871 Require proven large-demo startup 2026-08-29 03:28:50 +01:00
pulse-triage[bot] 1d15ab60a3 Defer generic retest guidance to maintainers 2026-08-28 16:25:05 +01:00
Richard Courtman 55192bf835 Clarify continuous maintenance provenance 2026-08-26 11:23:05 +01:00
rcourtman a8e84b4011 Bound legacy demo bootstrap workload 2026-08-26 10:27:58 +01:00
Richard Courtman af370a8dda Route triage comments through dedicated identity 2026-08-26 09:59:10 +01:00
rcourtman b34a3d8164 Fix stable demo runtime profile convergence 2026-08-26 00:20:50 +01:00
courtmanr@gmail.com acfe84d9cf Fix issue version parser dropping capitalised V prefixes
normalizeVersion matched /\bv?(\d+\.\d+\.\d+...)/ without the i flag, so a
reported version written as "V6.0.4" never parsed.

The heading regexes in extractPulseVersion already carry the i flag and did
capture "V6.0.4" correctly, but they hand the captured string to
normalizeVersion, which then returned null. That collapsed every extraction
path -- inline scan, heading match, legacy match, and title fallback -- so the
issue was labelled needs-version-info despite stating its version.

Adding the i flag to normalizeVersion fixes all four paths at once. It is a
no-op on the rest of the pattern, since [0-9A-Za-z.-] already spans both cases.

Seen on #1538, which stated "V6.0.4" under the "Pulse version" heading and was
wrongly flagged as missing version metadata.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-26 12:49:24 +01:00
rcourtman f8bbae2f34 Expose demo tailnet identity diagnostics 2026-07-09 20:32:43 +01:00
rcourtman 910418c3b2 Make stable patch releases unattended 2026-07-09 20:16:13 +01:00
rcourtman 2be167331d Harden demo SSH setup for IP targets 2026-07-09 17:06:52 +01:00
rcourtman b0f22f1130 Stop posting retest boilerplate on maintainer issue reopens
The retest-comment workflow fired on 'reopened' as well as 'opened', and
canPostRetestComment gated on the issue author's association, not the
reopen actor's. Since non-collaborator reporters cannot reopen
maintainer-closed issues, a reopened event is in practice always a
deliberate maintainer decision, and the bot would post version-retest
boilerplate that contradicts the maintainer's own comment while planting
the needs-retest auto-close marker on an issue they chose to keep open
(seen on #1471).

Restrict the trigger and the guard to 'opened' and pin the reopened skip
with a test.
2026-06-11 15:10:33 +01:00
rcourtman 730290cc80 Split issue triage workflows
Separate silent issue metadata sync from public retest guidance so maintainer edits and reporter-facing comments do not share the same workflow boundary. Extract the shared parsing and classification logic into a local helper with a small node test so both workflows stay in sync without duplicating the script.
2026-04-15 19:08:06 +01:00