Skip to content

Commit d8a2186

Browse files
committed
1.49.1: the app's one address keeps no cookies, parts started again in their place, and clearer verification
1 parent 8ab569d commit d8a2186

5 files changed

Lines changed: 103 additions & 10 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,27 @@
33
Release notes for AlbertCode SWE Agent, newest first. Each release's installers and checksums are
44
on the [releases page](https://github.com/huynvic/albertcode-swe-agent/releases).
55

6+
## 1.49.1 — 2026-10-09
7+
8+
- **Security fix.** The one address **Start all** gives your app (`localhost:4400`) kept cookies, so a
9+
second browser could be signed in as the first person. It now keeps none: each browser keeps its
10+
own. Affects 1.47.0 to 1.49.0.
11+
- **Started again in its place.** A part that is up but not working, whose services moved, or whose
12+
code changed and does not reload by itself (a worker, say), is started again where it runs, never as
13+
a second copy.
14+
- **Every declared package checked** before a Python part starts, each missing one listed under
15+
**Install packages**.
16+
- **Redis with nothing to connect.** In Development, with `redis-server` installed, AlbertCode runs its
17+
own Redis and its answer proves the step.
18+
- **A service that does not answer is yours to start.** Verification names it and what it said, and
19+
asks you to start it or change its connection; nothing is sent to Albert to repair. A browser the
20+
tests could not start is something to install.
21+
- **Clearer evidence.** Each connected service is named with what it answered.
22+
- **The map reads more of your code:** routes under a router's prefix, endpoints under a parameter,
23+
services in variables, packages and setup files, and sign-in token libraries. A line to a later step
24+
no longer holds back what is verified before it.
25+
- **Names on lines never overlap,** and the line between two neighbours keeps its own name.
26+
627
## 1.49.0 — 2026-10-08
728

829
- **Step by step, the app first.** The System page's **Build** stage starts with **The app runs**: each

‎docs/architecture.md‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,20 @@ connection:
3737
Lines need evidence too: the front end calls the API where its code fetches from it; the back end uses
3838
a database, a sign-in library or a service where the same manifest declares both.
3939

40+
A route on a FastAPI router or a Flask blueprint carries the router's prefix, so the list a router
41+
serves at `""` is found where it is:
42+
43+
```python
44+
router = APIRouter(prefix="/api/shipments")
45+
46+
@router.get("") # GET /api/shipments
47+
@router.get("/{ref}") # GET /api/shipments/{ref}
48+
```
49+
50+
A library that signs and checks tokens (PyJWT, jose, jsonwebtoken) is how the code reaches the sign-in
51+
provider it also has, such as Okta, and is shown inside that box. Without a provider it is the app's
52+
own sign-in, a box of its own.
53+
4054
A framework it does not recognise is listed as *found in a manifest*, not guessed at.
4155

4256
## Only the folder as it is now

‎docs/security.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,9 @@ computer as you, outside the limits AlbertCode puts on the agent's commands:
141141
- The keys of services you connected are read from your key store when a part starts, given only to
142142
the parts that use that service, and masked in everything the parts print.
143143
- Every part, and the app's one address, listens on `127.0.0.1` only.
144+
- The app's one address keeps no cookies of its own: each browser's cookies go with its own requests,
145+
and a cookie a part sets (a session, say) goes back only to the browser that asked, so two people
146+
using the app at once are never signed in as each other.
144147
- What the parts print is kept in memory, masked, and never written into your repository.
145148
- **Stop all** stops every part and everything it started. Parts left running by an AlbertCode that
146149
ended without stopping them are stopped the next time it starts, but only when they are verifiably the

‎docs/system.md‎

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,33 @@ payments, email and the rest appear on their own, read from the same files the
7474
| A chip with a port | It is running now (see [Run every part](#run-every-part)) |
7575
| A tick or a cross | Albert finished, or hit a problem, on this part in the current chat |
7676

77+
**How your code shows a part.** A dashed box turns solid when your code has what it describes: a
78+
package that reaches it (`@okta/okta-react`, `stripe`), the variable it is configured by, named in a
79+
`.env.example` (names written for the browser, such as `NEXT_PUBLIC_…` or `VITE_…`, count too), the
80+
image it runs from in `docker-compose.yml`, or the file that sets it up (`.github/workflows/ci.yml`
81+
for GitHub Actions, `vercel.json` for Vercel, a `Dockerfile` for Docker). Each build request names
82+
the variable or file to use, so a box Albert builds turns solid. An API that only sends jobs to a
83+
Celery worker stays the API: the worker is the folder whose code defines the tasks.
84+
85+
For example, with this `api/.env.example` the Company sign-in (Okta), Error reports (Sentry) and
86+
Monitoring (Datadog) boxes turn solid:
87+
88+
```text
89+
OKTA_ISSUER=https://your-company.okta.com/oauth2/default
90+
SENTRY_DSN=
91+
DD_API_KEY=
92+
```
93+
7794
**Moving around.** Drag a box to arrange the map; it stays where you put it, for this repository on
7895
this computer. Drag empty space to move. <kbd>Ctrl</kbd>/<kbd>⌘</kbd> with the mouse wheel, or **−**
7996
and **+**, zooms. **Fit** shows everything; **Tidy** lines the boxes up in their lanes. **List** shows
8097
every part and how it stands; **Library** opens the library.
8198

8299
**Connecting boxes.** Drag a box's dot onto another box, or click the dot and then the other box.
83100
Select a line to see the file that shows the connection, its [contract](#contracts-on-connections),
84-
**Go to** either end, or **Remove this connection**.
101+
**Go to** either end, or **Remove this connection**. Each line is named by what it carries, such as
102+
*HTTP*, *SQL* or *Sign-in*, where the name covers no box and no other name; when a busy corner leaves
103+
no room for it, point at the line or select it to read its name.
85104

86105
**Read again** reads the repository afresh, for example after you changed files outside AlbertCode.
87106

@@ -322,7 +341,7 @@ one starts:
322341
| Kind | What it is |
323342
|---|---|
324343
| **The app** | The app itself, running: each part answers, and the front end reaches the API. Nothing else yet |
325-
| **Service** | One service the app uses (a database, sign-in…), added through its adapter. A database must answer AlbertCode's check; an outside service answers through its stand-in |
344+
| **Service** | One service the app uses (a database, sign-in…), added through its adapter. A database must answer AlbertCode's check; a Redis the runtime runs itself in Development is proven by its answer, with nothing to connect; an outside service answers through its stand-in |
326345
| **First feature** | The smallest real flow the product has, on the app and its services |
327346
| **Feature** | Each other feature, in order |
328347
| **Outside service** | Each outside service (payments, email…) made real: until then the app uses a stand-in |
@@ -347,8 +366,9 @@ its health route and the environment variables it is configured by (names only).
347366
- **The app**: each part's skeleton in the framework's own layout, starting and answering its health
348367
route, with a test for it, and the front end reaching the API. *Nothing else yet.*
349368
- **A service**: that one service added to the part that uses it, through an adapter configured by its
350-
environment variables, with a stand-in for tests. A database also gets its migration set up, with no
351-
tables until a feature needs one. *No feature uses it yet.*
369+
environment variables, with a stand-in for tests. A database with tables (PostgreSQL, MySQL, SQLite
370+
and the like) also gets its migration set up, with no tables until a feature needs one; a cache or a
371+
queue such as Redis has none to set up. *No feature uses it yet.*
352372
- **A feature**: the requirement, the journey, how to tell it works, its endpoints and the data it
353373
keeps (with a migration), built on the parts already in place, and a browser test titled `[R1] …`
354374
that walks the journey.
@@ -465,10 +485,18 @@ repairs it (*repair 1 of 3*), you accept the fix, and it passes: **Build queue
465485
runner, or a browser to run the tests in. The verification stops here, before starting anything, and
466486
lists each one with what installs it (`npm install` in `web/`, for example) and an **Install** button.
467487
Installing fetches from the network and runs what it fetches, so it is always your click. This is not
468-
a failure of the code: press **Install** on each, then **Verify again**.
469-
3. **Start the app**: every part the slice needs, through the [runtime](#run-every-part).
488+
a failure of the code: press **Install** on each, then **Verify again**. A browser the tests could
489+
not start is found here too, even after the app has started: Playwright's own was never downloaded,
490+
and the tests do not use the Chrome, Edge or Chromium AlbertCode found on the computer (it names it in
491+
`PW_CHROMIUM_PATH`, which each slice's request asks the tests to use).
492+
3. **Start the app**: every part the slice needs, through the [runtime](#run-every-part). A service
493+
connected on the map that does not answer where it is (a database that is down, say) stops it here:
494+
the slice asks you to start it or change its connection, and is never sent to Albert to repair.
470495
4. **Each part answers its health route**.
471-
5. **Check each connected service**.
496+
5. **Check each connected service**, each named with what it answered (*Database: Signed in · 4
497+
tables · read-only query answered*), and each one the runtime runs itself: in Development, with
498+
`redis-server` installed and no Redis connected on the map, the runtime's own Redis answering is
499+
the check (*Cache and job queue, run here: PING answered*), and there is nothing to connect.
472500
6. **Walk every journey in a browser**: the browser tests titled `[R…]` for this slice and the ones
473501
before it, at the app's one address. **The app** and a **Service** have no journey of their own, so
474502
their verification ends at step 5 (and needs no browser test runner); each feature walks its own.
@@ -501,8 +529,10 @@ the code holds, a verification of the code as it is now, and what the runtime se
501529
Only **Verified** is green, and only on evidence about the code as it is now. Change the code and earlier
502530
evidence is out of date: green parts go back to **Connected** (if the runtime still finds them answering)
503531
or **Built** until a slice through them is verified again; red clears the same way. An outside service
504-
that Albert uses a stand-in for stays **Built** until its own slice connects the real one. Select a part
505-
or a connection to read why it has its status. Parts no feature needs show their check, as before.
532+
that Albert uses a stand-in for stays **Built** until its own slice connects the real one. A line to a
533+
part a later slice builds (the API's line to CI, say) waits for that slice, and does not hold back the
534+
parts and features verified before it. Select a part or a connection to read why it has its status.
535+
Parts no feature needs show their check, as before.
506536

507537
**Example.** In the notes app, *The app runs* passes: Web app and API turn **Connected**, because they
508538
answer but no journey has gone through them yet. *Add SQLite* passes: SQLite turns **Connected** too.
@@ -594,9 +624,31 @@ that reloads by itself.
594624
- **Recovery.** A part that stops by itself is started again after 2, 5 and 10 seconds: at most three
595625
times in ten minutes, then it is left stopped with the reason. A dev server that reloads after a bad
596626
edit is not restarted: it answers again once the code is fixed.
627+
- **Started again, never twice.** Pressing **Start all** while the app runs leaves alone each part
628+
that works and still has the right addresses. A part that runs but does not work, or that started
629+
before a service it uses was connected on the map (or before a part it reaches moved to another
630+
port), is stopped and started again in its place, never beside itself. So is a part whose code has
631+
changed since it started and that does not reload by itself: a Celery worker, a `start` script or a
632+
command of your own (dev servers such as `next dev`, `vite`, `uvicorn --reload`, Flask in debug mode
633+
and Django's `runserver` reload by themselves). A verification does the same before it checks
634+
anything, so no part is judged by an address it was never given, or by code it is not running. Its
635+
log says why:
636+
637+
```text
638+
API Starting it again: what it reaches has changed since it started
639+
API $ python3 -m uvicorn main:app --host 127.0.0.1 --port 8000 --reload (in api)
640+
API INFO: Application startup complete.
641+
```
597642
- **Install packages.** A part whose packages are missing says so before it starts, with the exact
598643
command: **Install packages** runs it (`npm install` or your package manager; for Python, a `.venv`
599-
and `pip install`). A failed install says why, for example a network that needs a proxy.
644+
and `pip install`). A failed install says why, for example a network that needs a proxy. For a
645+
Python part, every package its `requirements.txt` (or `pyproject.toml`) lists is checked, not only
646+
its framework, so a package added in a later step is found before the part starts:
647+
648+
```text
649+
Workers Its packages are not installed
650+
Declared in its project but not installed: redis. Install packages runs it for you.
651+
```
600652
- **Logs.** The **Log** section shows what every part prints, or one part's, with errors marked. Keys
601653
are masked. **Its log** on a part jumps to it.
602654
- **Fix with Albert** on a part that fails sends Albert how it was started, what it printed and what

‎docs/troubleshooting.md‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,13 @@ Everything an installer run did is written to its log:
6666
| **Install packages** fails with a certificate or network error | Your network needs a proxy or its own certificates. Set `HTTPS_PROXY` (and `SSL_CERT_FILE`, `PIP_CERT` or `NODE_EXTRA_CA_CERTS` if your company gives you a certificate) in your terminal, run `albertcode stop`, then start `albertcode --ui` from that terminal. |
6767
| A database in `docker-compose.yml` is not started | AlbertCode does not start containers. Run `docker compose up -d` yourself, then **Connect** the database on the map: its check decides when it is up. |
6868
| Redis says it cannot be started | Install Redis (`redis-server`) and press **Start all** again, or connect a Redis you already run on the map. |
69+
| A part does not use a service you just connected | It was started before the connection. Press **Start all**: each part started before it is started again with the service's address (a verification does this for you). |
6970
| A part is **Running** but not **Healthy** | Nothing proves it works: give it a health route (`/health`) or, for a worker, a ready line it prints, in **How it runs**. |
7071
| A part is **Unhealthy** right after a change | Its code fails to load: read its log in **Operate** → **Run**, or press **Fix with Albert** on it. The dev server picks up the fix by itself. |
7172
| A part **Crashed** and stays stopped | It stopped three times within ten minutes. Read its log, fix the cause, then **Start**. |
7273
| The app's address keeps showing *Starting…* | A part is still starting or waiting for a part it needs. **Operate** → **Run** says which, and why. |
74+
| **Verify** stops at *Install what the app needs: A browser for the tests*, though Chrome, Edge or Chromium is installed | The browser tests were started without a browser of Playwright's own, and your `playwright.config.ts` does not use the one AlbertCode found. Under `use`, add `launchOptions: process.env.PW_CHROMIUM_PATH ? { executablePath: process.env.PW_CHROMIUM_PATH } : {}` (new slices ask Albert for it), or press **Install** to download Playwright's own Chromium. Nothing in the app is repaired for it. |
75+
| **Verify** stops at *Start the app* or *Check each connected service*: a service *is not answering where it is connected* | A service you connected on the map (your database, say) is down, or not where its connection says. Start it, or change its connection on the map: once its check passes, **Verify** again. Nothing in the app is repaired for it. |
7376
| **Verify** fails at *Walk every journey*: no browser test walks [R1] yet | The slice needs a browser test titled `[R1] …`. Build the slice (its request asks for one), or **Add a test** on the Requirements page. |
7477
| The **Build** stage says *the code has changed since* | The last verification was of older code. Press **Verify** again. |
7578
| **Roll back** says there is no checkpoint yet | A checkpoint is kept each time a slice passes its verification, and only in a Git repository. Run `git init` and commit, then verify a slice. |

0 commit comments

Comments
 (0)