Build progress (v5)
Spec: SPEC.md (v5; v1–v4 in docs/) · Stack: STACK.md · Branch: build/aide-v5 · Started: 2026-11-01
Gate: GitHub Actions CI on the pushed head commit, after a static stack-reviewer pass (CLAUDE.md “Commit gate”).
Agents never run the full gate, Docker, Testcontainers or E2E locally.
Environment
- Tools: .NET SDK 10.0.402, Node 24.14.1.
- Packs (STACK.md):
fe-nextjs,be-aspnet,data-efcore-postgres,vcs-github,deploy-railway,local-docker-desktop-k8s. All installed. - Local: Docker Desktop Kubernetes is manual checks only (Ben).
- VCS CLI auth: gh yes (BenFielder1). Railway deploys run only through
.github/workflows/deploy.yml.
Requirements
| ID | Summary | Spec § | Layer(s) | Phase | Status | Evidence |
| — | — | — | — | — | — | — |
| FR-163 | AIDE’s own Postgres on 18 outside Railway | 3.1 | deploy + data | M32 | done | CI 41323663409 |
| FR-164 | Existing local data survives the upgrade | 3.1 | deploy | M32 | done (upgrade path: manual check) | CI 41323663409 |
| FR-165 | Issue trackers section; Jira connection | 3.2 | backend + frontend + data | M35 | done | CI 41402440433 |
| FR-166 | Linear connection | 3.2 | backend + frontend | M35 | done | CI 41402440433 |
| FR-167 | GitHub Issues via App (issues: read) | 3.2 | backend + frontend | M35 | done | CI 41402440433 |
| FR-168 | GitLab Issues | 3.2 | backend + frontend | M35 | done | CI 41402440433 |
| FR-169 | Browse and select dialog | 3.2 | backend + frontend | M35 | done | CI 41402440433 |
| FR-170 | Imports are snapshots (source_items) | 3.2 | backend + data | M35 | done | CI 41402440433 |
| FR-171 | Import entry points (wizard, new version, Refinement) | 3.2 | frontend + backend | M35 | done | CI 41402440433 |
| FR-172 | Agents use the snapshot; traceability | 3.2 | backend | M35 | done | CI 41402440433 |
| FR-173 | Re-import, remove, drift check | 3.2 | backend + frontend | M35 | done | CI 41402440433 |
| FR-174 | Co-author trailer on every commit, merge, tag | 3.3 | backend | M33 | done | CI 41326693467 |
| FR-175 | Who is credited | 3.3 | backend | M33 | done | CI 41326693467 |
| FR-176 | Which email per host | 3.3 | backend + data | M33 | done | CI 41326693467 |
| FR-177 | Project and personal credit settings | 3.3 | frontend + backend + data | M33 | done | CI 41326693467 |
| FR-178 | Stack step: Infer option | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-179 | Analysis phase | 3.4 | backend | M36 | done | CI 41526801694 |
| FR-180 | Stack Analyst agent | 3.4 | backend | M36 | done | CI 41526801694 |
| FR-181 | Blanks, unsupported stacks | 3.4 | backend + frontend | M36 | done | CI 41526801694 |
| FR-182 | Analysis page | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-183 | Edit, approve, reject the profile | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-184 | Hosts and deployment setup on the page | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-185 | Continue to Refinement | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-186 | Inference for new versions | 3.4 | frontend + backend | M36 | done | CI 41526801694 |
| FR-187 | Deployment groups | 3.5 | backend + data | M34 | done | CI 41342366096 |
| FR-188 | Wizard group windows | 3.5 | frontend | M34 | done | CI 41342366096 |
| FR-189 | Separate projects option | 3.5 | frontend + backend | M34 | done | CI 41342366096 |
| FR-190 | Group setup job | 3.5 | backend | M34 | done | CI 41342366096 |
| FR-191 | Settings → Deployment group cards | 3.5 | frontend + backend | M34 | done | CI 41342366096 |
| FR-192 | Platform mapping | 3.5 | backend | M34 | done | CI 41342366096 |
| FR-193 | Events and notifications | 3.6 | backend + frontend | M37 | done | CI 41702869067 |
| FR-194 | CLI additions | 3.6 | cli + backend | M37 | done | CI 41702869067 |
| FR-195 | Generated apps’ Postgres on 18 (Railway, Render, Compose) | 3.1 | backend + deploy | post-M37 | done | CI 41713212094 |
Phases
- M0 Baseline (base: 391a81d): CI green on
main(run 41312655301); no re-scaffold - M32 PostgreSQL 18: FR-163, FR-164 (CI 41323663409, head c4710e8)
- M33 Commit co-authorship: FR-174–FR-177 (CI 41326693467, head f6b74f1)
- M34 Deployment groups: FR-187–FR-192 (CI 41342366096, head b2dfe44)
- M35 Tracker connections and imports: FR-165–FR-173 (CI 41402440433, head 65ff4ee)
- M36 Stack inference and the Analysis phase: FR-178–FR-186 (CI 41526801694, head 01bce28)
- M37 Integrate and harden: FR-193, FR-194, E2E, axe, perf, docs, acceptance audit over v1–v5 (74 Done, 11 Partial closed by the audit-gap commit, 0 Missing) (CI 41702869067, head 06cf591)
Decisions
- 2026-11-01 (M32): FR-163’s “v4 §8 test note” stays unchanged because
docs/is frozen; SPEC §8 for v5 carries the test scope. - 2026-11-01 (M32, Q5): Testcontainers.PostgreSql 4.15.0 needs no change for
postgres:18(it sets no PGDATA or data mount; from reading the package).readOnlyRootFilesystemlooks fine from reading the image’s entrypoint; unverified at runtime. -
2026-11-01 (M32): the Kubernetes upgrade renames
pgdatatopgdata-17on the same volume, which clears thedeploy-local.shguard without deleting anything. -
2026-11-01 (M33): “person who started the release” is the actor of that attempt’s
RELEASE_STARTEDevent, and “project creator” is thePROJECT_CREATEDevent actor, because neither table has a column. A connection with invalid status still counts as an identity (the id and login remain true). The personal opt-out records no event. GitHubauto_initand GitLabinitialize_with_readmecommits are written by the host, so they carry no trailer. A Bitbucket user linked through the confirmed pending-link path gets their commit email on the next refresh or re-test, and is skipped until then. - 2026-11-01 (M34, spec sync in M37):
deployment_targets.platform_project_idis added to §5, so a created Railway project is resumed rather than refused. Additive beyond §6:windows[]andcaveats[]on/stack/options,?type=pickers, nullablelink.resourceIdfor Vercel. A group’s database setup runs as its owndatabase_provisioningjobs. A groupplanapplies to services only. DELETE on a group clears its targets and databases in AIDE, and platform resources stay. A part with its own resource blocks group creation (D-V5-9). A lone Render database keeps v4’s two wizard windows; a lone Railway database has one, as v4 offered no Railway preview. Catalog version 1.2.0. -
2026-11-01 (M34, Q5, public docs and schema only, not a live account): Render documents
POST /v1/environments/{id}/resources {resourceIds}, used here, and a failure is non-blocking. Railway’s schema hasTCPProxyCreateInput {applicationPort, environmentId, serviceId}andTCPProxy.domain/proxyPort. - 2026-11-01 (M35, spec sync in M37):
tracker_import.supersedes_import_idis added to §5 (the retry chain). Re-import while a retry is pending returns that retry. Removing an import also removes its unfinished and failed retries. A Jira token without read access saves asinsufficient_scopeper the v4 rule, and browsing givesCONNECTION_SCOPE_INSUFFICIENT. The prompts use the optional{{SOURCE_ITEMS?}}syntax so projects with no imports render.POST /sourcesalso returnsTRACKER_NOT_CONNECTEDand 404. Item fetch time isn’t rendered, so an unchanged re-import keeps its hash. A failed import counts towardsource_items_unavailable. PATCH on a non-tracker with tracker-only fields isVALIDATION. -
2026-11-01 (M35, Q5): no live accounts, so Jira’s granular scope names (
read:jira-work,read:jira-userin the UI are inferred), the_edge/tenant_infoshape, JRACLOUD-94547 and Linear Free-plan limits are all unverified. The Jira and Linear logos were drawn from memory. -
2026-11-02 (M36): FR-183 wins over FR-17: rejecting a
stack_profilealways re-runs the Stack Analyst, with the rejected draft as context, even when a person edited it. PUT /stack stays allowed during analysis, because entering refinement still needs the locked profile.Phase.Analysisis first in the enum; phases are stored as strings everywhere, which was checked. Profile drafts and approval are allowed only in analysis. Unknown or conflict layers block approval even withgeneralist. Infer stays offered for URL and Local imports the wizard can’t see into;STACK_INFER_NO_CODEcovers empty repos at create. Detection pre-fills layers whichever stack kind is chosen. -
2026-11-02 (M37, spec sync): new event
CONNECTION_EXPIRINGsent through the personalconnection_invalidrules;TRACKER_IMPORT_FAILEDgainsimportedBy. The seed’s Fake tracker import sits on the new analysis demo (“Demo: Weather Board”, Vite + React skeleton), as no seeded demo is in refinement.aide project createalso gains--import-version,--released-tagand--local-path, because inference needs an imported repository. Channels can subscribe to every selectable event (21; the old cap of 14 is lifted). New config:Trackers__Provider(unset = real; Fake only in Development/Testing or withDeployments__AllowFake),Trackers__SearchTimeout(15 s),Notifications__ConnectionExpirySweepInterval(1 h), optionalLlm__Providers__<P>__Models__StackAnalyst. -
2026-11-03 (audit gaps):
GET /analysistakes optionalreleaseVersionIdfor past versions (read-only). New optional settingTrackers:CheckTimeout(default 10 s; startup refuses more than 10 s) so tests can shorten thesources/checkcap. The §8 co-author trailer check is an integration test, not an E2E, because E2E uses Local Git (SPEC §8 updated). - 2026-11-03 (FR-195, Ben): generated apps’ Railway (
postgres-ssl:18, volume at/var/lib/postgresql/data,PGDATA=/var/lib/postgresql/data/pgdata, as AIDE’s own Railway database), Render (version: "18") and Compose (postgres:18) databases move to 18. Existing databases are never changed. A linked Railway Postgres keeps the Owner’s image. Only anaide-previewinstance with no volume is re-imaged to 18; adopting a production service never changes its image. No catalog bump (skill text only; no hash is pinned).
Known issues
- Test fidelity (minor): the frontend MSW mock returns no pinned composition for a past version’s Analysis page (the real API does, and an integration test covers it), so Vitest can’t show it.
- Wizard (found by M37 E2E, minor UX): the form validates on touch, so after fixing a focused field that showed an error, its error box disappears as the field loses focus; the form moves up and the first Next click can miss the button. Possible fix:
reValidateMode: 'onChange'or an error area of fixed height. - M34 (minor): the Railway public-versus-private
DATABASE_URLis chosen when the database is set up, so changing the stack afterwards needs that database set up again.
Manual checks (Ben)
- FR-195 on real accounts: create a Railway Postgres from AIDE and check it starts on 18. Next to a production Postgres on 17, create the preview and check the preview runs 18 while production is untouched; the
serviceInstanceUpdate {source:{image}}call is unverified against a live account. Create a Render Postgres and check it’s version 18. - Railway (M37): in each environment run
railway config plan(preview first) and expect onlyvariables.ignoreupdates, with no variable changes or destroys; warnings that new ignore names match no variable are expected. Thenrailway config apply(production only when you decide).Trackers__Providermust stay unset there. No secrets to set. - M35 trackers against real accounts (CI uses stubs): update the GitHub App to add
issues: readand accept on each installation. Connect a Jira site with a scoped read-only token (check the scope names in the dialog are right) and a Linear key. Import from each of Jira, Linear, GitHub and GitLab, check ADF renders, re-import, remove, and the drift check. Eyeball the Jira and Linear logos. - M34 groups against real APIs (CI uses stubs): on Railway, create a group for all three parts and check one project with a preview environment; split the database and check the TCP-proxy
DATABASE_URLworks; link an existing project with Postgres and check the preview database comes up. On Render, create a group and check services and Postgres are placed in the project’s environments. On Vercel, check<name>-weband<name>-api. - M33 co-authorship: on real GitHub, confirm a step commit shows both avatars and counts on the contributions graph once on the default branch. Check the GitLab noreply address credits the user on gitlab.com and self-managed, and how Bitbucket displays the line (SPEC Q5).
- M32 PostgreSQL 18 (nothing here has run against a real cluster): on a cluster with 17 data,
deploy-local.shexits non-zero and the volume is unchanged. Run the README’s Kubernetes upgrade end to end, confirming the rename works as uid 999 on the mount root, 18 starts with the read-only root filesystem, and the restore’s “expected errors” list is complete. Then run the compose procedure and a fresh-cluster deploy.