Skip to content

[CI verification only — do not merge] integration/verify - #1

Closed
adamnfish-gu wants to merge 42 commits into
mainfrom
integration/verify
Closed

[CI verification only — do not merge] integration/verify#1
adamnfish-gu wants to merge 42 commits into
mainfrom
integration/verify

Conversation

@adamnfish-gu

Copy link
Copy Markdown
Owner

Temporary PR opened purely to trigger a CI run against the current integration/verify (all 15 projects merged together).

The workflow only triggers on push-to-main and pull_request, so a PR is the only way to exercise it without pushing to a main branch.

This will be closed once the run is green. Do not merge.

adamnfish-gu and others added 30 commits August 5, 2026 15:47
Projects declare their toolchain in a .tool-versions file and opt into CI
simply by having one; the discover job finds them with `find` so nested
projects like clojure/gol are picked up too.

A conform job asserts that any project declaring a .tool-versions also
provides executable script/setup and script/test, so a half-adopted project
fails loudly rather than silently dropping out of the matrix.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
whereWeLive returned "Mars" while MainTest expected "Earth", so the
skeleton shipped a failing test. Point them at the same answer.

script/test ran `sbt ~test`, which watches for changes and never exits.
Run the tests once by default and keep the watch loop behind --watch.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The test_unit_tests method contained self.assertTrue(False), which
caused the suite to always fail non-interactively. Replaced with a
meaningful assertion (name is non-empty) that demonstrates how to
write a test against pairing_exercise.py while actually passing.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
pairingTest() returned false while the test expected true, causing CI
to fail on every run. The test was also named 'a failing test', which
gave no signal about what it actually tests.

package.json had 'jest --watchAll' and script/test passed '--watch' on
top of that, so the test runner never exited. Fixed by setting
package.json's test script to plain 'jest' and giving script/test a
--watch flag that uses --watchAll (no git detection needed).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The example test asserted result === true but mod.ts exported false.
script/test ran deno test --watch, hanging non-interactively in CI.
The import from deno.land/std@0.153.0 no longer resolves correctly on
Deno 2; the std assert module moved to jsr:@std/assert. Updated deno.lock
to reflect the new JSR dependency.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The project had a Yarn Classic v1 yarn.lock (# yarn lockfile v1 header)
alongside .yarnrc.yml configured for Yarn Berry (nodeLinker, plugin path)
and a .yarn/install-state.gz — a contradictory state that would confuse any
toolchain. Sibling projects (javascript, javascript-esm) both use Yarn Berry 3
with __metadata: version 6 lockfiles, so converging here is the right call.

Deleted the v1 yarn.lock and regenerated it with Yarn 3.8.7. Added a
packageManager field to package.json to make the choice explicit and prevent
it drifting back to Classic.

Also fixed the deliberately-failing test (myConst was false, test expected
true) and script/test which ran 'yarn test --watch' unconditionally — that
never exits in CI. The test runner now does a single run by default and
supports --watch behind an explicit flag.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The example test in spec/pairing_test_spec.rb asserts eq(false) but
returnsFalse returned true, causing the suite to fail. The method name
makes the intent clear: it should return false.

Also removed the print "hello world" from Main#initialize: it ran on
every test instantiation and polluted RSpec output with unwanted stdout.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
pairingTest() returned false while the test expected true, causing the
suite to always fail. jest --watchAll in package.json and --watch in
script/test also meant ./script/test never exited in CI.

Changed pairingTest() to return true. Changed the test script to plain
jest so it exits after one run, and rewrote script/test to support an
explicit --watch flag for local development. Used --watch (not
--watchAll) since this is a git repo and jest --watch works here.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The project failed to build entirely for three reasons:
- No go.mod file; modern Go requires modules and rejects the
  GOPATH-era relative import './src' used in main.go.
- main.go imported './src' which Go modules do not support.
- SayHello() returned 'hi' but TestSimpleString expected 'hello'.

Add go.mod with module path github.com/guardian/coding-exercise-project/go,
fix the import to use the module-qualified path, return 'hello' from
SayHello(), and switch script/test from 'pushd src && go test' to
'go test ./...' which works correctly from the module root.

Also remove TestNothing (t.Skip stub) — a permanently-skipped test
conveys nothing useful in a skeleton whose purpose is to show a
passing suite.

Replace println builtin (writes to stderr, not guaranteed stable) with
fmt.Println which writes to stdout as expected.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pins the toolchain to swift 6 via .tool-versions so mise (or any
asdf-compatible tool) can install the exact version without relying on
manual swift.org download instructions.

Adds script/setup (PATH check + swift package resolve), script/test
(swift test), and script/start (swift run) following the
scripts-to-rule-them-all convention. No watch mode: Swift has no
idiomatic built-in watch mode in the CLI.

Rewrites README to use the standard Prerequisites/Usage/Structure
template, dropping the homebrew/XCode-only instructions and IDE section.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Homebrew is no longer available in our standard CI environment, so
setup was always failing on linux-arm64. Replacing brew/virtualenv
with a mise-compatible .tool-versions declaration and the stdlib
python3 -m venv means no external package manager is needed.

Changes:
- Add .tool-versions pinning python 3.13
- Rewrite script/setup: PATH check, then python3 -m venv venv
- Simplify script/test: cd to project root, use venv/bin/python
- Add script/start to run the exercise
- Delete script/test.bat (superseded by mise on Windows)
- Update README: remove homebrew reference and Windows section,
  document .tool-versions / mise workflow per template

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
.nvmrc contained 'lts/*' which is not a pinned version and requires
nvm specifically. .tool-versions replaces it with explicit major
versions for both node and yarn, compatible with mise, asdf, or any
other tool manager.

script/setup gained the standard PATH check so contributors get a
clear error message with install instructions instead of a confusing
'command not found'. script/start is new: the project had no way to
run the app from the standard scripts interface. README updated to
document the toolchain and drop homebrew-specific instructions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Pins the toolchain to deno 2 in .tool-versions so mise (or asdf) can
install the exact runtime without relying on system packages or homebrew.
Adds script/setup with a PATH check that prints a helpful message when
deno is missing. Updates script/start and script/test to use set -euo
pipefail and cd to the project root. Rewrites README to follow the shared
template: prerequisites block, mise install snippet, standard Usage and
Structure sections; removes the Windows-specific homebrew section.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Gradle 6.8 cannot run on JDK 17+; Kotlin 1.5.31 is incompatible with
Gradle 8.x; JUnit 4.12 predates the fix for CVE-2020-15250. Together
these caused './gradlew test' to fail with an incompatible task-action
signature error on any modern JVM.

- Upgrade gradle wrapper to 8.11.1
- Upgrade Kotlin plugin to 2.0.21 and kotlin-stdlib
- Upgrade JUnit to 4.13.2; kotlin-test-junit now pulls the right version
- Switch from deprecated kotlinOptions.jvmTarget to jvmToolchain(21)
- Replace deprecated mainClassName with application { mainClass = ... }
- Remove 'java' plugin (redundant alongside Kotlin JVM plugin)
- Remove JAVA_HOME / source-setup coupling from script/test and script/start

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The TargetFramework was set to netcoreapp10.0 which is not a valid TFM —
the netcoreappX.Y scheme was retired after 3.1; .NET 10 uses net10.0.
Both csproj files needed updating or the SDK refuses to build.

TestFunction() returned false, causing the only test to fail on every run.
Flipped it to true so the skeleton ships in a passing state.

Assert.IsTrue is the NUnit 3 classic API; NUnit 4 dropped it. Replaced
with Assert.That(..., Is.True) so the project compiles against NUnit 4.5.1.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Tests.php asserted assertSame(true, false) which always fails.
code.php only echoed output with no return value, making it
untestable. Expose a greeting() function and guard the direct
invocation so code.php can be required without side effects;
update the test to assert on the return value.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Clojure 1.6.0 (released 2014) does not run on JDK 21; upgraded to
1.11.1 which supports modern JVMs. Added :main gol.core for lein run
and a -main entry point in gol.core so `lein run` works.

The example test asserted (= 0 1) which always fails; replaced with
a meaningful assertion that foo returns nil (println returns nil),
matching the actual skeleton implementation in gol.core.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
setup was hunting macOS/Android Studio paths and interactively prompting
to install adoptopenjdk11 via Homebrew — completely unusable in CI and
on Linux. Replace with the standard PATH-check template that reads
.tool-versions and directs the user to mise.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
No toolchain was pinned, setup relied on brew which does not work on
linux-arm64 CI, and script/test lacked set -euo pipefail so failures
could be silently swallowed.

Pins dotnet 10 in .tool-versions, rewrites script/setup to check PATH
instead of installing via brew, and brings script/test and script/start
in line with the scripts-to-rule-them-all template. Adds --watch support
(dotnet watch test is idiomatic in the ecosystem). Updates README to
reflect mise-based setup and removes homebrew references.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
script/setup installed maven via brew, which only helped macOS users and
mutated their machine. It now just resolves dependencies, leaving the
install to whatever version manager the candidate prefers.

script/test and script/run now cd to the project root so they work from
any directory, matching the other skeletons.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaces the `brew install --cask guardian/devtools/gu-scala` step, which
only worked on macOS and installed tools system-wide. script/setup now just
runs `sbt update`, leaving the choice of version manager to the reader. The
dependency on the toolchain is already encoded in that command, so there is
nothing to keep in sync with .tool-versions.

The Windows-only setup.ps1 goes too: mise covers Windows, so there is no
longer a reason to maintain a second, divergent setup path.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The project had no .tool-versions file, no script/setup, and the
existing scripts lacked set -euo pipefail and the canonical cd to
project root. Without .tool-versions, cargo is unresolvable from a
fresh environment and CI has no declared toolchain to install.

Add .tool-versions pinning rust to major version 1, add script/setup
that runs `cargo fetch`, and bring script/start and script/test up to
the shared script template shape. Update README to use the standard
prerequisites section and drop the old rustup installation-guide
reference.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
script/setup now installs dependencies with yarn rather than assuming a
working yarn is already present, and .nvmrc goes since .tool-versions
supersedes it.

script/start ran `yarn watch`, a tsc-watch loop that never exits, which
made it the odd one out among the skeletons. It now compiles and runs
once, with the watch loop behind --watch to match script/test.

.yarn/install-state.gz was tracked despite the root .gitignore listing
typescript-node/.yarn/* — it is a regenerated build artefact, so it only
ever added diff noise. Untracked.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Brew-based setup was interactive and macOS-only; the Windows
PowerShell script was a parallel divergent maintenance burden.
Replace both with .tool-versions: script/setup bootstraps composer
locally as composer.phar using the official installer with signature
verification against the live sig from composer.github.io, then
installs dependencies. Update script/test and script/start to use
the local composer.phar. Drop setup.ps1. Update README to remove
brew/Windows references and document .tool-versions.

mise builds php from source, which needs system libraries the GitHub
runner does not ship. script/system-packages installs them and is run
before the toolchain is built, so it cannot live in script/setup.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaces the vendored lein bootstrap script, which self-installed
Leiningen 2.5.1 into ~/.lein on first run. script/setup now just runs
`lein deps`, leaving the install to whatever version manager the
candidate prefers.

Leiningen is pinned to 2.12 rather than the major version alone because
mise's leiningen 2.13.0 package ships a lein script that still declares
LEIN_VERSION=2.12.1-SNAPSHOT, so it 404s trying to fetch a jar that was
never released. 2.12.0 installs and runs cleanly.

Clojure was the only skeleton nested a directory deeper than the rest
(clojure/gol), which forced CI to discover projects with find rather
than a simple depth-1 glob. Unnest it to clojure/ so the layout matches
every other project.

The pairing test used to be Game of Life, which is where the gol name
came from, but that is no longer the case and no other skeleton names a
specific exercise. Rename the namespace to pairing.core and drop the
Game of Life references from the README and project.clj.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Ad-hoc setup used gem install bundler with set -vx (verbose tracing),
which made output unreadable and tied the project to a specific
bootstrap approach. Replace it with a plain bundle install, leaving the
toolchain install to whatever version manager the candidate prefers.

bundler has shipped as a default gem since Ruby 2.6, so requiring
'bundle' to be present once Ruby is installed is fair.

Also:
- Add .tool-versions pinning ruby 3.4
- Delete .ruby-version (superseded)
- Tighten script/test: use set -euo pipefail and bundle exec
- Update README to follow the standard template (drop homebrew references)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Ad-hoc .nvmrc with lts/* gave no pinned version and required nvm.
Replaced with .tool-versions (node 22, yarn 3) for mise/asdf support.
script/setup now just runs yarn, per the shared adoption spec. Removed
Windows/homebrew instructions from README and added mise quickstart.
Hardened script/start with set -euo pipefail and cd to project root.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was no declared toolchain version and script/setup used
'brew install go', which fails in CI and non-macOS environments.

Add .tool-versions pinning Go to major version 1 and rewrite script/setup
to run go mod download as the dependency-fetch step (a no-op here, but
consistent with the template), leaving the toolchain install to whatever
version manager the candidate prefers.

Harden script/start with set -euo pipefail and BASH_SOURCE cd idiom.
Add .gitignore covering the default 'go' binary produced by go build.
Update README to follow the spec template: toolchain prerequisites,
mise install quickstart, drop homebrew references.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@adamnfish-gu

Copy link
Copy Markdown
Owner Author

CI verification complete. Run 31085920406 passed on f81360a: all 15 projects green, plus Discover projects and Check project structure.

Closing — this PR existed only to trigger the run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant