Repository navigation
Conversation
551acb2 to
e90aef1
Compare
|
Needs to be rebased with main after #119 is merged |
|
Heads up, this one currently has merge conflicts with its base and will need a rebase before it can merge. |
1979c05 to
6a2742a
Compare
sugat009
left a comment
There was a problem hiding this comment.
Content review. The operational core (Docker/Helm/HAProxy/CouchDB/upgrade tooling) is a strong, principled fit and the prose is faithful (verified 10006, 10267, 10557). Blockers:
- issue (blocking): identity keys record the PR number on 21 of 49 drafts (verified against
closingIssuesReferences); plus10689and8693close no tracked issue, so theirissueUrlpoints at the PR itself. - issue (blocking): 2 duplicate clusters (4 files): issue 10481 = [10482, 10488] (10488 is a 5.0.x cherry-pick), issue 9992 = [10006, 10267]. Separately,
9960and10014are near-duplicate content (both bump CouchDB to 3.5.0) for different issues. - issue (content):
10267misattributes an issue. Its "## Related Issues" describes #9992 as "line wrapping in HAProxy config", but issue #9992 is actually "Remove haproxy-healthcheck service from single-node deployments". - issue:
related_issues: []empty on every draft;domainFit: strongon every draft. Forced picks:10689(net-newadmin-tool/Angular app),10837/10857(CI supply-chain + credential-scanner security, all.github/+scripts/ci),10264(admin-app UI). Borderline:10045(mixed admin UI + upgrade service). - nitpick: classifier/seed reasoning leaks into
## Domain Rationaleon ~9 drafts (10512, 10557, 10758, 9119, 9634, 9700, 9717, 11141, 10264): "per the seeds", "the data-sync carve-out", etc.
Clean bill: no secrets, no PII, schema 100% valid.
| category: bug | ||
| domain: infrastructure | ||
| domainFit: strong | ||
| issueNumber: 10267 |
There was a problem hiding this comment.
issue: the "## Related Issues" section says #9992: line wrapping in HAProxy config..., but issue #9992 is "Remove haproxy-healthcheck service from single-node CouchDb deployments". The PR closes no tracked issue; this misdescribes the linked issue.
| category: bug | ||
| domain: infrastructure | ||
| domainFit: strong | ||
| issueNumber: 10488 |
There was a problem hiding this comment.
issue: this is a 5.0.x cherry-pick of #10482 (same helm change) written as a novel fix. It omits the Recreate-strategy change and misstates the template edits as a version-string cascade. Duplicate of 10482.
| category: feature | ||
| domain: infrastructure | ||
| domainFit: strong | ||
| issueNumber: 10689 |
There was a problem hiding this comment.
issue (domain-fit): net-new admin-tool Angular application (all files under admin-tool/); it closes no issue, so issueUrl points at the PR. Infrastructure is a least-bad bin for an app foundation.
…ly, infrastructure) Deterministic relink via #129's relink-issues tool: drafts whose identity keys recorded the merge PR now point at the resolved issue. Frontmatter id/issueNumber/issueUrl lines only; bodies untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per sugat009's review on #121: collapse the #10481 cluster (10482 + 5.0.x cherry-pick 10488) preferring the canonical's Recreate-strategy account; fold 10267 into the #9992 canonical as a second source PR — verification showed it is a genuine follow-up (base64 no-wrap fix to the exact haproxy health config PR #10006 introduced), which also resolves the misattributed Related Issues text. Drop the three drafts whose PRs close no tracked issue (10689 app skeleton, 8693 k8s/helm templates, 8996 helm-repo — the third found by this pass) per the skip-and-flag policy. Suspect 10557 verified correct as stored: its PR body closes #10610; the filename token 10383 is a stale title scope for a different, still-open issue. The 9960/10014 CouchDB-3.5.0 near-dup pair verified as distinct work (Nouveau-inclusive vs couch-only, same day) — both kept, cross-linked via related_issues. Also: honest domainFit: weak on the forced picks (10837, 10857 CI security; 10264 admin UI), related_issues backfill (CouchDB pair + nouveau family), classifier-seed and reviewer-narrative scrubs across 25 files, and the optional source_prs schema definition. All 44 mappings verified against the live cht-core API (0 mismatches); validate-schema 108/108; no duplicate issueNumbers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
89d3473 to
33810f5
Compare
|
@sugat009 A few caveats on infrastructure domain, but let's get this thru:
|
Companion to the forms (#122) seeder's cross-domain dedup: the curated forms-and-reports memory for issue #10443 (default training forms missing from Docker images) lives on main and now records PR #10445 in its source_prs, so the duplicate draft here is removed. validate-schema 107/107; no duplicate issueNumbers. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
sugat009
left a comment
There was a problem hiding this comment.
Content re-review (post-rework). Identity/dedup are clean. Remaining:
- nitpick (leakage):
11162,9953,8794Domain Rationale carry classifier scaffolding ("per the CI/Docker pitfall", "Per the classification seeds", "…seed example") — strip; this class of cleanup is tracked by #136/#138. - (For the record: I initially flagged
8996's removal but withdrew it — the helm-repo migration is superseded, chart is now in-repo atscripts/build/helm, so dropping it is correct.)
Cross-cutting (whole promote batch, not blocking this PR alone): filenames still encode the PR number while frontmatter is issue-keyed, and two draft schemas coexist (machine-distilled vs hand-authored) — worth a cleanup pass. Full detail + re-runnable Verify commands are in my consolidated review notes.
Review 4745313315 on #121 (at c6c9872): one nitpick, classifier scaffolding in the Domain Rationale of 11162 ("per the CI/Docker pitfall"), 9953 ("Per the classification seeds") and 8794 ("seed example"). All three now argue from the code; the batch-wide filename note is left to the cross-domain cleanup. Then every draft went through the gate suite the landed domains converged on, plus a per-draft audit against cht-core (anchor, master, and the commits between). What the review did not name, worst first: **Mechanism inverted or invented (no gate sees these).** 10512 `[chttpd_auth_lockout] mode = warn` puts CouchDB's failed-login lockout in log-only mode; the draft described a request-rate limiter throttling replication. 8942 direction inverted: `http-server-close` already allowed client keep-alive; the PR enables it on the HAProxy->CouchDB side. 8965 polarity inverted: the fix compares the upgrade target's build with `deployInfo.build`; it does not normalise `version`. 10264 the PR stopped the `buildVersion` filter appending the base version and added a column; the draft said the opposite. 11122 api already returned the right version; the test expected the build string. Fix: `isFeatureReleaseBranch` + the test change. 11162 "renamed the container" is backwards: `getContainerName` maps any name containing nouveau to `nouveau`. 8908 the scripts pass credentials with `curl -u` and JSON-escape them; only haproxy-healthcheck/check.py percent-encodes. 9119 staging always used `database.db`; the wrong users-db `name` broke view warming in view-indexer.js (404). 8775 api already read BUILDS_URL; only admin hard-coded BUILDS_DB. 9039 "fail fast" is false: the version check sits in a retry loop that holds startup. 10583 written from the PR description: the logger never read LOG_LEVEL, and the PR adds it to the Helm templates. Also 9634 9953 11072 11141 10045 9949 10500 10014 9717 10826 9074 10857 10837 8813 (details in the ledger). **Fabricated or unsupported.** 10557's spinner never shipped (it came from review discussion; a maintainer declined one). 8794's admin / monitoring / upgrade-tooling consumers had no source; the reported one is a cht-conf upload failure. 9288's "test-restart" scenario and 10857's log-scanner.js exist in no ref. **Identity and provenance.** 9039 was keyed to #9024, a French/Swahili translations PR (a typo in the PR title); re-keyed to issue #9023 and renamed 9039-fix9023-... . 10557's filename token (10383, a separate open issue) contradicted its verified key (#10610): renamed 10557-feat10610-... . Four drafts are children of the Nouveau epic (#9542) and said nothing about it: 9717 9960 10181 squash-merged into 9542_freetext_tco (-> master as #10201, f1bdfc07c) and 9700 into couchdb-nouveau (-> #9541, 8736d059f -> #10201). Each carries the "Epic child." banner with the refs/pull fetch that makes its source_sha resolvable, plus renamed/superseded banners where files moved on the branch or after landing. **Wrong file, wrong status, drift.** The baseline pass found 19 ungrounded claims (7 of them the gate's own path bugs, below), 9 stale and 1 unverifiable: literals the code does not spell (`check-coverage` for `checkCoverage`, `--offline` for `online-audits: false`), an image ENV credited to a test override file, modified files called added, a deleted Lua script called modified, a deleted spec called updated. stale: true on 18 (4 epic children + 14 with drift annotations). **Linkage and classification.** related_issues 6 -> 18 drafts populated, 6 -> 30 entries; PRs cited as issues relabelled; every gloss quotes the real title (7 gloss mismatches at baseline). Category changed on nine drafts, each to its issue's Type label (8775 8813 8918 9466 -> bug; 9039 9700 9717 10750 11072 -> improvement). domainFit unchanged: 10264 10837 10857 stay weak. The gates had a blind spot here: path extraction only knew the application directories, so couchdb/, haproxy/, .github/ and five other infrastructure trees were never checked (79 draft/path pairs), and `\b` started paths mid-path (48 matches). Fixed on memory/draft-verification with specs. **Regression pass over this commit's own changes.** Every sentence it changed (548 of 894; 346 untouched) went to six independent reviewers told to prove the old text right before accepting a correction. 0 regressions. 1 loss restored (8908: api still fails to start with such a password; the PR merged with that limitation acknowledged). Four over-stated new sentences corrected (10837, 10701 x2, 11072); 8978's four renamed helm templates now say moved, not deleted; 9634 covers installs as well as upgrades; 10758 names the existing cookie spec. Three counted-run attempts did not converge, each on a sentence this round wrote: 9700 quoted index names its integration spec builds from a map, then left that map's literal unscoped; 8978 put the @docker exclusion in the config that only inherits it and repeated the author's loose "api + sentinel"; 9949 quoted `$DEFAULT_ULIMIT` without the `$(ulimit)` reassignment, then said hosts forbid running ulimit when only setting it fails; 11141's rationale omitted the dropped `await`. All fixed before the counted run. validate-schema 64/0; verify-drafts whole corpus 0 infra findings, infra with history 0/0, --online 0 blocking / 0 warnings; ground-claims --added-lines 395/395 grounded; on frozen bytes, ground-claims x3 (0 ungrounded, 0 unverifiable, 0 stale each; 811 / 820 / 776 grounded) and check-coherence x3 (0 contradictions, 43/43 checked each), none degraded. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
PR #121 — reply to round 2 + request for re-reviewThe nitpick is addressed. The three Domain Rationale sections you named (11162 "per the CI/Docker I didn't stop at the review. This domain went through everything the other domains converged on Gate ledger (frozen bytes; working tree == the pushed commit)
The baseline at Three runs before the counted one did not converge. They caught seven imprecisions in sentences
All seven were fixed first. None of those runs was degraded. The counted run used a pinned copy Worst firstMechanism inverted or invented. No gate sees this class. All of it came from reading the
The same class, smaller, in 9634, 9953, 11072, 11141, 10045, 9949, 10500, 10014, 9717, 10826, Fabricated or unsupported:
Identity and provenance:
Wrong file, wrong status, drift. The ungrounded claims were:
Drift is annotated wherever master moved on (for example #11134 disabled 10857's scanner steps, Linkage and classification:
The gates had a blind spot. Path extraction only knew the application directories. So A regression pass over my own changes. The gates prove what the drafts now say. They can't
Disclosed, not fixed
|
Before the round-3 re-review, the 43 drafts were audited the way review 5415306093 on #131 audited authentication: every sentence against the PR diff, the code at the anchor, and master. Ledger: docs/handoffs/121-infra-prereview.md. Gates had already converged on these bytes and could not see any of this. Wrong mechanism: 9717 Nouveau indexes are built whenever a design doc is created or updated; the PR's _nouveau query makes the upgrade wait for the staged indexes before the swap. The draft said it "warmed" them (title, summary, tags, concepts, Problem, Code Patterns, Design Choices, Domain Rationale; also 9700's Related Issues gloss). Inaccurate or incomplete facts: 8794 only final-release tags produced an invalid version; beta tags gave valid semver. 10264 release rows never showed the suffix. 10045 the other two gaps in #9954, plus its two recorded failures. 9970 success when any compose file matched; the naming-convention error is logged only when nothing was updated. 8908 master's Makefile/compose.yml changed under #9963 (banner). 10857 the scanner reads all the container logs the harness saves, not just api and sentinel. 9074 view-logs existed (one deployment's first pod). 10758 cookie.js was not in the change set; link #10815. 10583 #10758 also set NODE_ENV in both Dockerfiles; the separate test override file and its reason; link #10815. Rationales replaced with what the record says, or review-thread decisions added: 9891, 10826, 9700, 11141, 9960, 11072, 8918 (x2), 8775 (scoped to this PR; PR #10557 later removed close(), so stale: true). Mechanical: rename notes (10006), "(added)" labels (10557, 11072, 8813, 8908 incl. couchdb/tests/test_helper/), "PR #N" for bare PR citations (10181, 9074), deleted paths dropped from entities (9876, 8813, 10482, 9074; Related Files keeps them as deleted), related_issues links with their mirrors (10758/10583 -> 10815 and 10826 -> 10754/10357; 9288 -> 9286 and 9634 -> 9284). An independent verifier checked every changed sentence; its corrections are applied and were re-run through the gates. lastUpdated is 2026-10-05 on the 26 touched drafts. Rationale/alternative nits and the other ledger nits are not addressed here. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PR #121: one more commit since my Oct 2 comment (
|
| Draft | Was | Now |
|---|---|---|
| 8794 | tag builds always produced an invalid version | only final-release tags did; 4.5.0-beta.1.<build> is valid semver |
| 10264 | release rows stopped showing the suffix | they never showed it (version === base_version at release tags) |
| 10045 | 2 of the k8s upgrade service's gaps | all 4 from #9954, plus its two recorded failures |
| 9970 | the API logs "match the naming convention" when nothing matches | it logs and throws only when nothing at all updated; here cht-core.yml matched, so the upgrade counted as successful and couchdb.yml was skipped silently |
| 8908 | banner omitted the master Makefile/compose changes | #9963 also dropped the sut service and the backtick/quote characters from the test password |
| 10857 | scanner covers api and sentinel logs | it reads all the container logs the harness saves (CouchDB included) |
| 9074 | "no log-collection helper" | troubleshooting/view-logs existed (one deployment's first pod) |
| 10758 | Related Files listed api/src/services/cookie.js |
not in the 7-file change set; #10815 is now linked |
| 10583 | #10758 described only by its Helm changes | it also added ENV NODE_ENV=production to both Dockerfiles; #10815 is now linked |
Rationales. Where the draft stated a reason or a "rather than X" that no record contains, it now gives the record's reason, or the review-thread decision it had left out:
- 9891, 10826, 9700, 11141, 9960, 11072
- 8918, twice (why
linux/arm64/v8; why regctl) - 8775, now scoped "at this PR", because #10557 later removed
close();stale: true
Mechanical:
- rename notes (10006)
- "(added)" labels (10557, 11072, 8813, 8908)
PR #Nfor two bare PR citations- deleted paths dropped from
entities(four drafts; Related Files still lists them as deleted) related_issueslinks, each mirrored on the other draft
Not changed in this commit. The audit also turned up smaller items that I left out to keep the diff reviewable: invented "rather than X" clauses in about a dozen other Design Choices, some omitted review-thread details, incomplete lists, and optional master-drift notes. Happy to do them here if you'd like them in this PR.
Gates at 27ab97a (frozen bytes, identical to the pushed tree)
| Tier | Result |
|---|---|
validate-schema |
107 / 0 |
verify-drafts, whole corpus (current main + this branch, 210) |
0 findings in infrastructure |
verify-drafts, with git history |
0 findings in infrastructure |
verify-drafts --online |
0 blocking, 0 unverified |
ground-claims --added-lines (base 8fbd8a5) |
41 / 41 grounded |
ground-claims ×3 (26 touched drafts) |
0 ungrounded / 0 unverifiable / 0 stale each pass |
check-coherence ×3 |
0 contradictions each pass |
Merge with main (ee82a46) is clean. The Oct 2 comment's ledger covers 8fbd8a5; this table covers 27ab97a.
sugat009
left a comment
There was a problem hiding this comment.
I checked all 43 drafts at 27ab97a against each source PR, the code at its anchor and master. A trial merge with main is clean: validate-schema passes 210 and 1,171 tests pass.
I request changes. Five items are blocking:
- 8918:73 and 9717:81: sentences that
27ab97aadded state a wrong cause and a wrong mechanism. - 10701:58, 10837:80 and 11162:60: a wrong property name, a wrong zizmor mechanism and a wrong cause.
The other 47 inline items are non-blocking. Eleven restore dropped verification evidence, as with 10994 on #131. Landed drafts on main keep such checks (for example forms-and-reports 9434), so your Oct 2 rule does not match main.
Please also fix your deferred items in this PR: an invented "rather than X" clause is a wrong fact. The two policy items from #131 apply here too.
Nits (113 lines, not blocking)
- 8794:53 On master,
api/src/services/deploy-info.jsalso exportsstore(PR #9312,5152cc5e5), which writesdeploy-info.json; only itsgetdelegates toserverInfo.getDeployInfo(). - 8794:55 The banner scopes the helper move but not the test move: on master the version-selection tests are in
shared-libs/server-info/test/index.spec.js. - 8794:63 The clause from
27ab97ais a fragment: "for a final-release tag that lands after the patch segment" has no main verb. The build number is what lands there. - 8794:75 Circular: the staging ddoc name stays because of "staging ddoc naming". Per the PR body, the staging ddoc version (for branches, historically the branch name) has several uses.
- 8794:91 At this PR,
tests/integration/api/routing.spec.jspicks the field by theBRANCHenv var, not by build type; CI setsBRANCHfor every build, tag builds included. - 8813:66 The code span
await asyncio.start_server(copies part of a source line and ends with a dangling(. Line 70 already writesasyncio.start_server. - 8813:74 Round 3 dropped why the default is
WARNING: the PR first usedINFOand changed it after a reviewer called it log noise (ce83eaed98). - 8813:88 Related Files omits five files the PR added under
haproxy-healthcheck/:test/__init__.py(named in Testing),README.md,.tool-versions,.gitignoreand.dockerignore. - 8813:95 On master the
127.0.0.1:5985:5984mock CouchDB port is gone (PR #8870,b7d005219), and no note says so. - 8908:57 The banner still omits three master changes: PR #9963 removed the
test_couchdb_buildstage fromcouchdb/Dockerfile, PR #9151 movedapi/src/environment.js, and PR #10006 removed the shellcheck line. - 8908:100 Testing omits that the old
setup()intests.batsexportedadmin/passwordcredentials; removing that override lets the cases use the special-character password. - 8918:65 "at this PR" does not say how master differs. On master,
versions.INFRASTRUCTUREalso lists couchdb-nouveau, added by PR #10201. - 8918:69 The code branches on
INTERNAL_CONTRIBUTOR, not on push credentials. Line 73 states the right gate. - 8965:48 The sentence omits the final
|| ddoc.versionfallback (api/src/services/deploy-info.jsline 10); that fallback is why only tagged releases broke. - 8978:88 Related Files omits the root
package.json; this PR modified it to add the fourk3dscripts that lines 76 and 108 name. - 8978:92 Related Files omits
tests/helm/templates/couchdb-servers-configmap.yaml; this PR added it and PR #10051 deleted it. - 8978:101 Related Files omits 11 modified test files, among them
.mocharc-base.js,couch_chttpd.spec.js,keep-alive.spec.jsandnginx.spec.js, which the prose names. All are still on master. - 8978:104 This PR added the
@dockertag section totests/AUTOMATE_TEST_GUIDE.md; PR #9270 later made the file a deprecated stub. The draft says neither. - 8978:112 The draft does not say how #8909 ended. It was closed on 2025-05-12 with both suite families kept, because the team was considering a move away from recommending Kubernetes.
- 9039:60 The scoping note covers only the loop, but PR #9073 (
42a4b28a9) movedcheckitself toindex.js;checks.json master no longer defines it. - 9039:73 The paragraph names the test
unsupported version should throw, which PR #9073 deleted; on master the 3.2.0 assertion is inthrows on invalid version(optional note). - 9039:77 The squash commit (
1bfc16c07) and PR #9039's title readfix(#9024), but #9024 is an unrelated translations PR; record the mismatch as 10557 does. - 9039:83 The second sentence restates the domain classifier's rubric (
src/utils/domain-inference.ts:109), not an argument from the change; five other drafts here also use "operational lifecycle". - 9074:60
related_issuesomitscht-core-10486, the sibling draft whose PR #10500 deleted all that PR #9074 added. The draft names #10500 16 times. Mirror the link in the 10500 draft. - 9074:92 The
binlist omits the eighth entry,upload, which also points at./cht-deploy. - 9074:96
package.jsonis the only Related Files bullet with no status label. The PR added theunit-cht-deployscript and its call inci-compile;1c3277c4eremoved both on master. - 9074:97 "present at this PR's anchor" is true, but the PR rewrote this file from a bash wrapper into the Node.js entry point (GitHub status: modified).
- 9074:122 Round 3 dropped a true fact from round 2: a reviewer confirmed on 2024-04-30 that the PR fixed #9076. The PR's
helm.test.jsalso asserts--create-namespace. - 9119:41
related_issuesis empty, but #9123 and #9146 are real issues about this bug. Other drafts list issues that have no draft (9634 listscht-core-9617). - 9119:76 Missing #9123 (CI only upgraded to the build, never from it; closed by PR #9215) and #9146 (the follow-up investigation). Both cross-reference #9117.
- 9119:82 View warming is not upgrade-only: at api startup,
check-install.jsalso stages and warms views when installed ddocs are invalid. Round 3 noted this in 9634. - 9288:51 HAProxy did not forward requests to the stale IP: its log in #9284 shows
<NOSRV>,503, so no server was assigned and HAProxy answered 503 itself. - 9288:79
listenForApihas drifted. On master it gives up after 3 minutes and repeats/api/infoafter the first success. The restart case also waits 1 second first (PR #10632). - 9288:85 Related Issues omits #9997 and #10565, two flaky-test issues filed against the restart case that this PR added.
- 9466:57 The master template sets this
subPathonly whendataPathOnDiskForCouchDBis set, and the clustered template replaces a%din it with the node number. - 9466:65 Overstated:
describe-deploymentalready printed each mount'ssubPathand PVC claim; the gap was following the PVC to its PV and reporting JSON. - 9466:91 medic/helm-charts#24 is a PR cited bare; your convention labels it "PR medic/helm-charts#24" (as 10837 does for
PR medic/cht-docs#2185). - 9466:92 medic/cht-docs#1502 is a PR cited bare; your convention labels it "PR medic/cht-docs#1502" (as 10837 does for
PR medic/cht-docs#2185). - 9634:81 The #9284 bullet that
27ab97aadded has no closing full stop. The bullets on lines 79 and 80 end with one. - 9717:32
observabilityis left over from round 2's removed progress claim; this PR adds no monitoring. Delete the whole line, not only its text. - 9717:65 The clause that 27ab97a added gives the build on a design doc change as Nouveau only; CouchDB does the same for views. Skip this if line 81 changes.
- 9717:69 On master, PR #11141 (
047f5c562) removed thecompact()call fromcleanup, and no drift note says so. - 9876:10 "was logging request bodies only partially" reads as every body; small bodies were logged whole. The limit was in what HAProxy could log.
- 9876:50 "inherently incomplete" overstates the limits; short single-chunk bodies were logged whole (pre-PR test at
5e70f64a83^). - 9876:58 The spec checks only the
POST /_sessionlog line for the stringpassword(the field name), not for password values. - 9876:62 The pattern should also remove the converter's
lua-load-per-threadline inglobal, as the PR did; otherwise HAProxy loads a missing file. - 9891:56 "whenever
process.env.TAGis unset" is narrower than the guardif (!process.env.TAG). CI branch builds setTAGto''(build.ymlline 16), which is also falsy. - 9949:50 I found no source for "locked-down or restricted environments". #9923 reproduces the error on an ordinary EC2 t2.micro with Docker. Its linked forum thread is about Fedora.
- 9949:77 "per pod under K3D" cannot occur in this teardown. The upgrade suite runs on Docker Compose only, so
saveLogswrites onedocker logsfile per registered container name. - 9953:49 The banner omits where the tests went: PR #9909 moved
should clear cache when requestedtoserver-info, and on master thefinalizetest asserts onserverInfo.getDeployInfo. - 9953:83 Overstated: the assertion covers only the GET polls to the mocked messages API in one test, not the broadcast POSTs (
27e7c08d1). - 9953:87 The issue blames outdated deploy info cached after the upgrade; without "outdated", the gloss blames caching itself.
- 9960:52 "Its own PR number" is ambiguous after "That branch" (PR #10201, whose number is on master). Name PR #9960. 9700, 9717 and 10181 use the same wording.
- 9960:56
stale-as-writtenis a tool label, not a cht-core term; I raised it as a policy item in my PR #131 review. - 9960:69 Missing article: "a maintenance need".
- 9970:61 New instances already started correctly before this PR, because both helper functions used
couchdb.yml. The fix only makes the payload'scht-couchdb.ymlmatch the file on disk. - 10006:52
staleshould betrue: theserver.spec.jsdelay that line 92 names changed on master (PR #10566 and PR #10632). - 10006:92 On master the delay comes before
listenForApi(): PR #10566 removed the added line and PR #10632 re-added it ahead of the call. - 10014:44 PR #11162 wrote lowercase
as; the uppercaseAScame from PR #11139 (fd7ab0310). The 11162 draft (line 64) quotes the lowercase form. - 10045:62 The controller does not pass the flag; its template
admin/src/templates/upgrade.htmlpassescan-upgrade="canUpgrade"on all four<release>elements. - 10045:70 The gate is UI only: api never checks
canUpgradefor upgrade or complete requests, and the Retry button is not gated. - 10045:93 The gloss that 27ab97a added drops "clear": #9954 says the service "does not have a clear upgrade path", and line 54 keeps the qualifier.
- 10181:90
tests/utils/index.jsis the only PR file here with no status label; the PR modified it. - 10264:10
base_versionis the fullpackage.jsonversion (for example 5.0.0 or 4.22.0), not only the major version. - 10264:58 On master, PR #10557 put an icon and "No indexing." text in that column. The bm, hi and id locales got empty labels. Only feature-release rows with a differing
base_versionlost the suffix. - 10264:66 Design Choices omits why the suffix was removed: a reviewer called the duplication a UX step backwards, and the e2e selector dropped
(. Round 3 also dropped the issue's proposed database name,builds_5. - 10264:74 Related Files lists only
messages-en.properties; the PR modified all nine locale files. - 10482:73 The parenthetical misses
k3s-k3d: there the deleted Deployment mounted ahostPathvolume. The sidecar always mounts the claim, so onk3s-k3dthe PR changed where Nouveau data lives. - 10500:46
related_issuesis empty, but thecht-core-8551andcht-core-9468drafts document the deleted code and cite PR #10500. - 10500:60 The list reads as complete but omits 4 of the 20 deleted files:
package.json,package-lock.json,README.mdand.gitignore. - 10500:73
scripts/deploy/src/config.jsholds the chart defaults that Problem and Root Cause rely on. This PR deleted it, but Related Files does not list it. - 10512:40 Line 45 names
couchdb:3.5.0; master usescouchdb:3.5.2(PR #11162). Lockout defaults are unchanged, but 10014 and 9960 setstale: truefor this drift. - 10512:53 The draft does not say that CHT's api keeps its own failed-login rate limiter (
api/src/services/rate-limit.js), unchanged by this PR. Therate-limitertag can mislead agents. - 10557:64 Overstated:
compareLocalToRemotecounts the view index only when views changed, and Nouveau disk sizes only when indexes changed. - 10557:66 Omits that
potentiallyIncompatibleinadmin/src/js/controllers/upgrade.jsnow parsesbase_versionbeforeversion, which changes which releases get the warning. - 10557:70 Commit 27ab97a points 8775 to PR #10557 (
c4fa13bd3) for thebuildsDbchange (one reused instance, noclose()calls), but this draft never mentions it. - 10557:74 "Never blocks" overreaches. A failed compare does not stop the upgrade, but Stage and Install wait for the compare POST. The reviewer reported a window where the buttons do nothing.
- 10557:91 Related Files lists only
messages-en.properties; the PR also modified the ar, es, fr, ne, pt and sw files, which the Solution names. - 10583:66 PR #10376 already had the sentinel path fix (
eb162af831) when it closed. So the sentinel claim is relative to the original contributor's commits, not to PR #10376. - 10583:74 The sentence that
27ab97aadded gives a hedged reviewer concern as the reason to keep the override file. The author's actual reply was a cost argument ("just for testing"). - 10583:96 The gloss still says the containers "never set"
NODE_ENV, then says PR #10758 set it. On master both Dockerfiles haveENV NODE_ENV=production; scope "never" to this PR. - 10701:66 Number agreement: the plural "Shared libs' test scripts" takes the singular "its". Each script runs its own package's
test/directory. - 10701:70 Same wrong name as line 58:
scheduled-tasksstands for the report propertyscheduled_tasks. - 10701:88 Besides the eight moved tests, the PR added two new cases to the
orderByDueDateAndPrioritydescribe block. - 10750:47 The attribution is right, but CouchDB 3.5.0's
config.erlmerges a repeated section in one file. A short note stops agents taking the premise as fact. - 10750:59
set_nouveau_url(PR #11126) has no section-scoped existence check; it deletes everyurl =line and inserts after the header, like the log-level block. - 10750:63 Round 3 no longer says that review replaced the first
awkparser. The hazard wassedbackslash escaping, not shell or regex. Design Choices omits why the PR usescpandrm: to keep inodes for single-file bind mounts. - 10750:71
make testpasses no--build, so a local rerun after editingdocker-entrypoint.shtests the old image. CI starts clean and is unaffected. - 10758:40
entitiesomitsscripts/build/helm/tests/integration-k3d-values.yaml.template, one of the seven changed files. Solution and Related Files name it. - 10758:69 Code Patterns offers the per-service
node_envread as a pattern. The anchor's unguarded form crashed renders (#10815), and PR #10826 rewrote it on master. - 10758:87 Round 3 dropped the check that the PR body reports:
cookie.spec.jsran with 18/18 passing. One clause would keep it. - 10758:93 In the #10815 bullet that
27ab97aadded, the api half is no regression: 5.1 already failed withoutapi:(.Values.api.port). The reported error was on.Values.sentinel.node_envonly. - 10826:71 Optional: the sentence that
27ab97aadded omits that the PR author proposeddig, and that the maintainer who agreed later approved thedefault-dict form. - 10826:83 Round 3 dropped round 2's statement that all 13 cases pass (PR body). The
Validate Helm Templatescheck passed on the PR head. Only the count remains. - 10826:95 "canonically infrastructure, not configuration" restates the domain classifier's rule (
src/utils/domain-inference.ts:138), not an argument from the change. - 10837:70
softprops/action-gh-release@v2became agh release uploadstep, not a SHA pin.regctl-installerhas no tag comment. Thegithub-actionsDependabot entry took the/admincooldown (code-scanning alert 291). - 10857:55 Commit
9af78c7a1(PR #11121) also added one test to the spec. Master has 16it(call sites; Testing (line 89) says 15 without scoping. - 10857:59 In the sentence that
27ab97arewrote,tests/logs/*.logalso holdsbrowser.console.logfrom WebdriverIO runs.scan-logs.shscans that file too. - 10857:63 The logs were archived only when a job failed: each Archive Results step for
tests/logshasif: ${{ failure() }}. - 10857:75 Design Choices omits the review decision to keep CouchDB at debug and strip its OS Process dumps. The #6571 quote is not verbatim ("unexpected errors to be thrown").
- 11072:84 The test for the
-1fallback at line 59 is not named:v2 handles errors gracefullynow expectsreplication_failureto equal{ count: -1 }. - 11072:88 The direct follow-up #11146 is not linked; its PR #11209 reads the
logs/replication_failuresview that this PR added.related_issueswould then listcht-core-11146. - 11122:59
FEATURE_RELEASE_BRANCH_PATTERNmatches onlyX.Y.Z-FR-<name>, not any version-prefixed branch.5.1.2-betastill gets thepackage.jsonversion prepended. - 11141:10 Cleanup compacted only the five databases in
DATABASES, not every database. Root Cause (line 54) scopes this correctly. - 11141:50 The issue says compaction had run for an hour; the upgrade was already finalized, so "an hour into an upgrade" misleads.
- 11141:87
finalizeandabortcallcleanup()themselves; nothing runs it after they return. - 11162:56 The list omits the fourth 3.5.2 item that #11080 names: design docs fetched once per cleanup request.
- 11162:64 Optional: since PR #11139, master reads
FROM couchdb:3.5.2 AS base_couchdb_build(uppercaseAS), so a case-sensitive search for this literal fails. - 11162:68 True only for Docker runs. Under k3d,
saveLogsignoresSERVICESand saves logs for every pod fromkubectl get pods. - 11162:96
tests/utils/index.jsandreplication-failure-log.spec.jsare test harness and CI work, not work on shipped images. - 11202:51 Node's fix adds a new guard
'data'listener (freeSocketDataGuard) to free-pool sockets; it does not keep an existing one.0a22d40180is the 22.x commit, and 24.17.0 has its own. - 11202:67 The file is new in this PR; label it
(added)as other drafts in this domain do. - 11202:71 Round 3 replaced the round 2 result with a statement that CI exercises the code. The PR's integration and e2e CI suites passed with the patch.
|
|
||
| ## Testing | ||
|
|
||
| No test files changed; all seven files in this PR are Helm templates under scripts/build/helm/templates/. |
There was a problem hiding this comment.
suggestion (non-blocking): Round 3 dropped the only verification evidence for this change. On 2025-11-26 the PR author wrote on PR #10482: "I've already verified this with upgrading https://demo-cht.dev.medicmobile.org". Round 2 kept this as "the 5.x upgrade path that originally surfaced the issue". src/scripts/distiller.ts defines testing as "how the change was tested", and this upgrade is the only test. You removed reviewer process narrative from the contacts drafts, but this is the PR author's own check. I raised the same point on draft 10994 in #131. The suggestion adds the upgrade check as one sentence.
| No test files changed; all seven files in this PR are Helm templates under scripts/build/helm/templates/. | |
| No test files changed; all seven files in this PR are Helm templates under scripts/build/helm/templates/. When asking for review, the PR author reported having already verified the fix by upgrading https://demo-cht.dev.medicmobile.org. |
|
|
||
| ## Testing | ||
|
|
||
| Config-only change; the PR adds no automated tests. |
There was a problem hiding this comment.
suggestion (non-blocking): Round 3 dropped the only verification evidence for this config-only change. Your reply discloses manual-validation drops for 8942, 9960, 9466 and 10482 only, not 10512. The approving review on PR #10512 (2025-12-03) records a manual test with images built from the branch. After 10 failed logins as medic there was no Unexpected error, the correct password still worked, and Fauxton showed chttpd_auth_lockout as warn. This is the same point as 10994 on #131. The suggestion adds these results. It leaves out round 2's claim that Docker 27 hit medic/cht-upgrade-service#50; that issue is about Docker 29 and later.
| Config-only change; the PR adds no automated tests. | |
| Config-only change; the PR adds no automated tests. A reviewer tested it manually with images built from the branch (`npm ci; npm run build-dev; npm run local-images`): after 10 failed logins as `medic`, the login page showed no `Unexpected error`, the correct password still worked, and Fauxton showed `chttpd_auth_lockout` as `warn`. |
| related_issues: | ||
| - cht-core-10357 | ||
| - cht-core-10815 | ||
| stale: false |
There was a problem hiding this comment.
suggestion (non-blocking): PR #10826 (f5332b358) changed two paths that the draft names: scripts/build/helm/templates/api/deployment.yaml and scripts/build/helm/templates/sentinel/deployment.yaml. It rewrote the node_env reads that this PR added, to fix the render crash in #10815. The flag still says stale: false. The 10583 draft has stale: true for drift from the same commit. The suggestion sets the flag.
| stale: false | |
| stale: true |
|
|
||
| Remediations: `.github/workflows/release-notes.yml` now passes both inputs through `env:` (`MILESTONE: ${{ github.event.inputs.milestone }}`, `SKIP_COMMIT_CHECKS: ${{ github.event.inputs.skip_commit_checks }}`) and runs `node index.js "$MILESTONE" $SKIP_COMMIT_CHECKS`; the two composite actions pass their inputs through `DB_USER`, `DB_PASS` and `DB_HOST` env vars; `actions: write` is removed from `.github/workflows/stale-prs.yml`, leaving `pull-requests: write`; the seven workflows without one gain `permissions:` (top-level `contents: read` in five, `contents: write` in `.github/workflows/release-helm-charts.yml`, job-level blocks in `.github/workflows/build.yml`); every external action reference in the workflow YAML is pinned to a full 40-character commit SHA with the version tag kept as a trailing comment; every `actions/checkout` step gains `persist-credentials: false`; and `.github/dependabot.yml` gains a `github-actions` ecosystem entry (weekly, on Saturday, `chore` commit prefix) so the pinned SHAs are kept current. In `.github/workflows/release-notes.yml`, `actions/checkout@v6` and `actions/setup-node@v6` were replaced by v4 commit SHAs. | ||
|
|
||
| > **Changed on master after landing (`stale-as-written`):** `.github/workflows/stale-prs.yml` requests `actions: write` again (restored by PR #11390 to allow cache updates), the pinned SHAs have since been bumped (e.g. `actions/checkout` to v6.0.2), and `.github/zizmor.yml` has gained further entries, including an `unpinned-uses` policy that allows a ref pin for `medic/cht-core/.github/actions/andrabot`. |
There was a problem hiding this comment.
suggestion (non-blocking): The stale note does not cover release-helm-charts.yml. PR #11310 (b265f47e1) and PR #11432 (b2df584ac) rewrote that workflow. On master it has no top-level contents: write, and its one checkout does not set persist-credentials: false. Line 70 says that both are present. The workflow now triggers on workflow_run, and the cache-poisoning comment in .github/zizmor.yml was rewritten. The suggestion adds these changes to the note.
| > **Changed on master after landing (`stale-as-written`):** `.github/workflows/stale-prs.yml` requests `actions: write` again (restored by PR #11390 to allow cache updates), the pinned SHAs have since been bumped (e.g. `actions/checkout` to v6.0.2), and `.github/zizmor.yml` has gained further entries, including an `unpinned-uses` policy that allows a ref pin for `medic/cht-core/.github/actions/andrabot`. | |
| > **Changed on master after landing (`stale-as-written`):** `.github/workflows/stale-prs.yml` requests `actions: write` again (restored by PR #11390 to allow cache updates), the pinned SHAs have since been bumped (e.g. `actions/checkout` to v6.0.2), and `.github/zizmor.yml` has gained further entries, including an `unpinned-uses` policy that allows a ref pin for `medic/cht-core/.github/actions/andrabot`. PR #11310 and PR #11432 rewrote `.github/workflows/release-helm-charts.yml`: it now runs on `workflow_run` when a `Build and test` run completes (its `branches` filter is `'[0-9]+.[0-9]+.[0-9]+'`), proceeds only if that run succeeded and was push-triggered, and publishes the committed `scripts/build/helm-releases` directory to GitHub Pages; its two jobs declare `contents: read`, `pages: write` and `id-token: write` in place of the top-level `contents: write`; its checkout no longer sets `persist-credentials: false`; the `actions/setup-node` step with the inline `cache-poisoning` ignore and the `gh release upload` step are gone; and the `cache-poisoning` comment in `.github/zizmor.yml` now rests on the new trigger. |
|
|
||
| ## Testing | ||
|
|
||
| No tests were added; the diff is CI configuration only (12 modified files under `.github/` plus the added `.github/workflows/zizmor.yml` and `.github/zizmor.yml`). The new zizmor workflow re-checks the workflows on every PR, on push to master, and weekly. |
There was a problem hiding this comment.
suggestion (non-blocking): Round 3 removed the only verification evidence. The test plan in the PR description reports a local zizmor --offline .github/workflows/ run, a YAML syntax check and a check for unpinned action references. Round 2 (c6c9872) stated these checks. At 58547e47, all 68 external action references in the workflow YAML under .github/ are pinned to a SHA. But the zizmor run on master at the merge commit still reported 27 results. This is the same point as 10994 on #131. The suggestion restores the test plan as the PR description's claim and adds the merge-commit result. It leaves out the "12 files" and "19 SHAs" counts, which do not match the final diff.
| No tests were added; the diff is CI configuration only (12 modified files under `.github/` plus the added `.github/workflows/zizmor.yml` and `.github/zizmor.yml`). The new zizmor workflow re-checks the workflows on every PR, on push to master, and weekly. | |
| No tests were added; the diff is CI configuration only (12 modified files under `.github/` plus the added `.github/workflows/zizmor.yml` and `.github/zizmor.yml`). The new zizmor workflow re-checks the workflows on every PR, on push to master, and weekly. The PR description's test plan reports local checks: a `zizmor --offline .github/workflows/` run with all findings remediated or documented in `.github/zizmor.yml`, a YAML syntax check, and a check that no unpinned external action reference remained. At this PR every external action reference in the YAML under `.github/` is pinned to a 40-character SHA, but the zizmor run on master at the merge commit still reported 27 findings: 18 `secrets-outside-env` (16 in `.github/workflows/build.yml`, 2 in `.github/workflows/scalability.yml`), 8 `ref-version-mismatch` (6 in `.github/workflows/build.yml`, 2 in `.github/workflows/codeql.yml`) and 1 `dependabot-cooldown` (in `.github/dependabot.yml`). |
Co-authored-by: Sugat Bajracharya <30311933+sugat009@users.noreply.github.com>
Review 5428388209 on #121 (at 27ab97a) left 52 inline suggestions. 50 were applied through the GitHub UI in 8819c0a; the batch limit left two, applied here verbatim: 9970:57 the old API never evaluated the upgrade response; the upgrade service recreated the API container while the request was open. 9960:90 restores the reviewer's local upgrade of a 500,000-doc instance as the Testing evidence. lastUpdated is 2026-10-08 on the 28 drafts touched by 8819c0a and this commit (the stale-timestamp gate compares it to the commit date). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks. All 52 inline suggestions are in:
One gate pass on those 28 drafts is clean: schema, whole corpus, --online, and coherence with 0 contradictions. The only probe hits are literals that live outside cht-core: CouchDB's req_timedout, Python's safe='/', and the contacts_by_depth view directory. On the rest of the review:
I'll push the deletions and the exact-text nits as one commit, then re-request review. |
Promotes 49 strong-fit
infrastructuredrafts fromagent-memory/_pending/intoagent-memory/domains/infrastructure/issues/for squad content review.Categories: bug (22), feature (14), improvement (13)
Themes: HAProxy/CouchDB deployment & upgrades, Helm/Kubernetes charts, Nouveau sidecar, Docker images, CI/security scanning.
All 49 carry
domainFit: strong+ a## Domain Rationalesection. (infrastructureis a new domain introduced by #119's schema; 1 weak draft deferred to Stream C.)seeding-claude-cli-v2(feat(#108): seeding pipeline - CLI provider, domain-rationale, infrastructure domain, concurrency #119) — retarget tomainafter the schema lands.validate-schema: passing, 0 failures.