Changelog#
Notable changes to WELD, newest first.
Unreleased#
-
Changed: the docs pages wear the front page's look: the same header and main menu (Docs marked current), each page a cream sheet on the green field, commands on the quick start's terminal with its gold Copy button, the weld bead under every title, branded callouts and a derived dark mode. Motion only for readers who allow it. Sources:
docs/_header.html,docs/theme/weld.css, thethemekey indocs/docs.json. -
Fixed: code on the front page's Sourdough card is cream, so it meets AA contrast on the deep green.
-
Changed: the front page header has a main nav that includes Docs.
-
Changed: the test APP_KEY is an obvious dummy (32 zero bytes), labeled test-only, and
App\Support\DummyAppKeymakes the app refuse it whenAPP_ENV=production; tests cover both. -
Changed: the regen gate treats Squire kit files that WELD keeps under
deploy/as relocated (not drift), andoracle:checkfinds the check file at the app root or underdeploy/. -
Changed: WELD adopts Pest 4 for new tests: the PHPUnit class tests run unchanged,
composer testruns Pest over the whole suite,tests/Pest.phpis configured, the example feature test is converted, andpestphp/pestis required at^4because Pest 5 needs PHP 8.4. -
Changed: CI pins the Preflight components to the 0.1.4 release SHA, so PROCTOR's preflight-pinned check passes.
-
Changed: the GitHub Actions in WELD's CI (
actions/checkout,shivammathur/setup-php) are pinned to commit SHAs with the tag in a comment, so PROCTOR'sci-pipelines-unpinned-useswarning is gone; setup-php moves from the unpublished@v3to 2.40.0. -
Added: a docs site (site/docs/) built by the shared docs builder from docs/, checked in composer ci.
-
Changed: the regeneration baseline shrinks from 66 to 62 known-drift paths now that Sourdough no longer ships
resources/js/app.js,welcome.blade.phpor a phantomvite.config.js, and the.editorconfigmatches. -
Fixed:
npm run lintpasses on the shipped code: the deadbadgeDirconstant leavesscripts/readme-art/build.mjs, and Squire's kit bytes (site/assets/agent-ready.js,site/assets/stack-env.js, with the unusedcatch (e)bindings and dead variables fixed in Squire's kit) are synced in, so the ESLint config no longer excludes them. -
Changed:
npm run lintis now a pure check (eslint .); a newnpm run fixscript runseslint . --fix. -
Fixed: TrustedProxiesTest no longer depends on a local .env file. The trustProxies() closure in bootstrap/app.php runs when the HTTP kernel resolves on the first request, after the test's app refresh has re-read .env into the process environment, so the .env that composer create-project writes clobbered the value the test set and one of the four tests failed. The helper now re-asserts TRUSTED_PROXIES after the refresh, so the suite is green with a .env present and without one.
-
Changed: the README and front page say Sourdough bakes four shapes today (raw PHP, Laravel with Blade, Laravel with Blade plus Vue islands, and Laravel with Inertia and Vue) and only raw PHP with a Vue SPA is not available yet; the front page gains a card for the islands shape. WELD is the Inertia and Vue shape, already assembled with every part wired.
-
Changed: the front-page deploy layer pins HELMET ^0.3, PROCTOR ^0.4 and CREED ^0.1 (lock: HELMET 0.3.0, PROCTOR 0.4.0, CREED 0.1.6).
-
Changed: CI pins Preflight 0.1.4 (GitLab component includes and the GitHub reusable workflow at its tag commit); the deploy layer sets minimum-stability to stable.
-
Changed: HELMET moves to ^0.3 and PROCTOR to ^0.4 (lock: HELMET 0.3.0, PROCTOR 0.4.x, CREED 0.1.6, ADVISOR 0.1.5), so the newest PROCTOR checks run on WELD itself; an empty
HELMET_PROXIES=now trusts nobody. Tests, style, analysis and PROCTOR pass unchanged.
0.1.2 (2026-11-03)#
- Changed: SESAME moves from 0.2 to 0.4 (
^0.4). It now logs sign-in events (sesame.login,sesame.logout, with a per sign-insession_ref; turn off withSESAME_LOG=false), re-reads the signed-in user when the resolver asks for it, and the gateway driver refuses anat+jwtaccess token. WELD itself needed no code change. - Fixed: the user menu gains a Sign out item on SESAME's logout route, the app bar branding drops the Laravel Starter Kit name and links (WELD logo text, waynestate/weld repository, weld.apps.wayne.edu documentation), .editorconfig covers compose.yaml and its variants, ExampleTest stops booting the framework, and UiBrandingTest pins the branding.
- Changed: docs and package metadata name nougat as the canonical repository, with git.wayne.edu and GitHub as read-only mirrors, until git.wayne.edu has CI runners.
- Changed: Laravel's trusted proxy list now comes from the TRUSTED_PROXIES environment variable (unset keeps Citadel's 172.18.0.1, set but empty trusts none,
*trusts all), instead of a literal address. Citadel behaviour is unchanged. - Changed: the README and front page now say Sourdough is the starter tool for every shape of Wayne State app (raw PHP and Laravel with Blade today, the Vue shapes planned) and WELD is the Inertia and Vue shape, already assembled and ready to clone.
- Changed: CI pulls its Docker Hub images through the GitLab Dependency Proxy (the group's CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX), so pipelines no longer hit Docker Hub's anonymous pull limit.
- Added:
waynestate/advisorjoinsrequire-devat^0.1, and "Clone it and rename" gains one step:php vendor/bin/advisor install --client=claude --writewrites.mcp.json, which is now git-ignored because a committed MCP config would run a program on whoever opens the project. SetADVISOR_ENABLED=1in.envto switch the advisor on. - Changed:
bin/weld.ps1 upandbin/weld.sh upwrite.mcp.jsonfrom ADVISOR inside the app container as part of the first-run setup (no PHP on the host PATH in the Docker path), with a--no-advisoropt-out on both scripts (-NoAdvisoron the PowerShell one). - Changed: the deploy layer's Squire kit is refreshed to 0.3.3 (release options can now live in ./.env.squire).
- Changed: the deploy layer's Squire kit is refreshed to 0.3.4 (the local .env.squire file is now git-ignored).
- Changed: the deploy layer's Squire kit is refreshed to 0.4.0: deploy/oracle-check.php arrives, so
php artisan oracle:checkruns the real check, and release.sh runs it without failing the release. - Changed: the Oracle overlay docs name Squire's parity image,
squire/oracle-parity:8.3. - Added:
StackIntegrationTestpins HELMET's security headers on a signed-in dashboard, a 404 error page and/up;ProctorCheckTestruns PROCTOR against CREED's policy.json inside the test suite, whichcomposer cialone did not cover. - Added: README section "Clone it and rename": copy WELD, rename the composer name, APP_NAME, site title and git remote, regenerate the key and re-run the checks, for PowerShell and sh.
- Changed: BEST_PRACTICES.md re-checked against the code on 2026-11-02: the Squire kit's Dockerfile, entrypoint and release script move W10, W12, W16 and W24 from
Not yettoDocumented, W8/W13/W22 sentences name the new deploy files, and the shifted line numbers in composer.json, .env.example and bootstrap/app.php are corrected. - Added: the regen gate, which makes "WELD is the prebuilt Inertia shape" checkable:
bin/regen-check.phpcompares a freshly generated Sourdough Inertia app (its.sourdough/manifest.json, path to SHA-256) with WELD file by file, skipping.sourdough/product-files.jsonentries and anyvendorornode_modulespath, and fails only on drift not already recorded in.sourdough/regen-baseline.json(a ratchet;--write-baselinerecords the current drift). The logic lives inApp\Support\RegenCheckwith unit tests,composer regen-checkpasses arguments through (not part ofci), and warning-onlyregen-gatejobs in both pipelines generate a fresh app from Sourdough's main and run the gate.
0.1.1 (2026-10-29)#
- Added: agent-ready site (prompt blocks, Markdown twins, llms.txt), from Squire's kit.
- Fixed: stale capability claims in the site and docs.
- Changed: project names written as words except acronyms.
npm run typecheck(vue-tsc, no emit) joins the scripts, and it passes: the ten errors from the first run are fixed in the bullets below.site/assets/wayne-ui/marks/warrior-strong-reverse.svgcomes back from the WayneUI static bundle; the CSS has pointed at it since the front page assets landed.- The tsconfig
typesarray keepsvite/clientand regains./resources/js/types: the shared interfaces move fromindex.tstoindex.d.ts, which is the shape that entry resolves to.vue/tsxstays out, because it never resolved. VITE_APP_NAMEis declared in a newresources/js/env.d.tsagainst vite/client'sImportMetaEnv, replacing the inlinedeclare moduleblock in the app entry.- The app entry imports the Ziggy config from a new
ziggy-value.jsbeside the generatedziggy.js, with a matchingziggy-value.d.ts: the generated declaration names the routes but not the value, and the value's stringlocationpredates the package's typed shape, so the declaration stops at the config minus that field. SharedDataextends Inertia'sPageProps, so it satisfies the constraintusePageputs on its type argument.- AppHeader types its page with
usePage<SharedData>(), so the user menu meets aUserinstead ofunknown. - TextLink's optional
methodprop takes Inertia'sMethodunion instead ofstring. - Welcome reads the signed-in state from
usePage<SharedData>()instead of$page, which vue-tsc does not recognize on the component instance.
0.1.0 (2026-10-29)#
waynestate/helmetmoves from^0.1to^0.2(locked at 0.2.3). The publishedconfig/helmet.phpre-syncs with the package:HELMET_PRESETfills the proxy list (an unknown name throws at boot), and the security headers middleware joins the global chain, so every response carries the baseline. The trusted-header set narrows toX-Forwarded-ForandX-Forwarded-Proto;X-Forwarded-Portis no longer trusted, because Citadel's HA-Proxy never sends it.php artisan weld:doctor: local setup only: the app key, writable storage, the database and pending migrations. The standards checks (PHP version, debug in production, secure session cookies) belong to PROCTOR, and the report points atcomposer proctor.- Ziggy's route list leaves the inline
<script>from@routesand moves into the Vite bundle:composer ziggygeneratesresources/js/ziggy.js(plusziggy.d.ts), the app entry imports it and passes it toZiggyVue, soroute()works in Vue exactly as before while HELMET's strict CSP stays closed. A CI job regenerates the file and fails on any diff, and a feature test pins the contract that every script tag on the app page carries a nonce. - PROCTOR is welded in from Packagist (
waynestate/proctordev dependency, CREED'spolicy.jsoncarried bywaynestate/creed):composer proctormeasures WELD against the version policy, and a CI job runs it on every pipeline. Warnings pass, failures block. The package's own bin looks for its autoloader where only a project-root install puts one, socomposer proctorruns directly without a temporary launcher. - SESAME is welded in from Packagist (
waynestate/sesame): sign-in moves from the starter kit's password forms to/loginand/logout, owned by the package. The fake driver signs in locally; pointing at CAS is an env change. Ausernamecolumn joinsusers, andApp\Sesame\UserResolverimports the identity on first sign-in. - HELMET is welded in from Packagist (
waynestate/helmet): security headers and CSP on every web response, a publishedconfig/helmet.php, trusted proxies inbootstrap/app.php, and the Vite build asks for the per-request nonce./upstays Laravel's built-in health route. Every web response now wears the baseline. docs/running-off-citadel.md: the off-Citadel contract: OpenShift, Coolify and plain Docker, with Citadel for comparison. Traffic and trusted proxies per platform,php://stderrlogs, writable paths, non-root user,/up, andweld:doctorafter every deploy. Same bead, four different tables.- README: one line under "Run it locally" linking the guide.
php artisan weld:doctor: checks the app is set up safely, one PASS, WARN or FAIL line per check (PHP version, app key, debug in production, secure session cookies, writable storage, database, pending migrations); exits 1 when anything FAILs,--jsonfor machines. A good bead is a quiet one: all PASS and nothing to say.bin/weld.ps1andbin/weld.sh: adoctorsubcommand runs it in the app container.- README: "Check your setup".
compose.yaml: the local stack: the app (PHP and Composer in one image) and Vite, on pinned images, SQLite per.env.example, ports bound to 127.0.0.1 only.bin/weld.ps1(Windows, PowerShell 5.1 and 7) andbin/weld.sh(Linux and macOS, POSIX sh):up,down,testandlogs, the same subcommands on every OS.- README: "Run it locally" is now one command per OS.