Note: No affiliate links and no sponsor. Two paid accounts, both mine: ChatGPT Plus and Claude, run on 14 September 2026. Each model got the identical prompt once, at whatever effort setting the product hands you by default. Every file, screenshot and clip below came out of those two runs, and both HTML files are saved.
The first version of this test was worthless, and the way it failed is worth two minutes before the results.
I wrote a prompt that banned almost everything. No external libraries, no CDN, no network, hand-written JavaScript only, massing only, no labels. Six dimensions with a known answer key, so grading would be arithmetic instead of taste.
Both models scored six out of six. I wrote it up as a finding.
It is not a finding. When both sides get full marks, the test measured nothing. I had built something so constrained that nothing could tell the two apart, then reported the tie as a result. Meanwhile people were posting Astra demos that build playable city simulators and rebuild a drawing in Blender as thousands of editable objects, and I was comparing grey boxes.
So I threw it out and wrote the opposite kind of brief.
The brief, second attempt
This time the only constraints are the dimensions. Everything else is theirs.
Build a single self-contained HTML file I can open straight from disk. Load
three.js, or any other library you want, from a CDN.
Make it an explorer for a small three-storey building, and make it look like
architectural visualisation rather than a diagram: real materials, daylight
and shadows, a ground surface, planting, and furniture at human scale.
Hold these dimensions exactly, in metres:
- Site 24 east-west by 16 north-south, flat.
- Building footprint 18 by 12, centred on the site.
- Three storeys, floor-to-floor height 3.6.
- The top storey is shifted 4 m east, so it overhangs 4 m past the east facade
of the storeys below and leaves a 4 m deep roof terrace on the west side.
- A courtyard void 6 by 6 through all three storeys. Its south-west corner sits
6 m east and 3 m north of the south-west corner of the footprint.
Everything else is yours: how you divide each floor into rooms, the materials,
the glazing, the furniture, the planting, the colours.
Four things I want to be able to do in the browser:
1. Walk through it in first person at eye height, mouse to look and WASD to
move, inside as well as outside.
2. Drag a slider to cut a horizontal section at any height and see the plan
of the cut.
3. Click any room and see its name and its floor area in square metres.
4. Drag a second slider to move the sun from morning to evening and watch the
shadows follow.
Reply with the complete file.
Four results, before the detail:
- Both placed every one of the six dimensions exactly, and I checked by reading the coordinates out of their code rather than looking at the picture.
- Both delivered all four interactions, with zero console errors. The only network requests either file makes are for three.js, and they do not fetch it from the same place: Astra pulls one file from jsDelivr, Fable pulls three from unpkg.
- Astra finished in 6 minutes 50 seconds and 21,385 characters. Fable took about 21 minutes and 51,165.
- The interesting difference is in what neither of them was asked for.
What came back

Same six numbers, same four requests, two different buildings.
Astra called it Spatial Studies / 01 and gave it warm limestone, oak and a lot of glass. Fable clad the shifted top storey in dark timber so the cantilever reads from outside, and put the building in a landscape with hedges, paving and grass.
Here is each one orbiting while the section slider descends. Watch the label on the slider: it names the floor you are cutting through.


Both of them held every dimension
I graded from the code. Astra writes its coordinates into a comment near the top:
// Site [-12,12] × [-8,8]; lower footprint [-9,9] × [-6,6].
// Top [-5,13] × [-6,6]; courtyard remains [-3,3] × [-3,3] on EVERY floor.
slab(-9,9,0); slab(-9,9,3.6); slab(-5,13,7.2); slab(-5,13,10.8);
Fable states the same geometry as a table of levels:
const FF = 3.6, SLAB = 0.3, WH = FF - SLAB;
const SITE = { x0:-12, x1:12, z0:-8, z1:8 }; // 24 x 16
const COURT = { x0:-3, x1:3, z0:-3, z1:3 }; // 6 x 6 void
const LV = [
{ y:0, x0:-9, x1:9, z0:-6, z1:6, name:'Ground floor' },
{ y:3.6, x0:-9, x1:9, z0:-6, z1:6, name:'First floor' },
{ y:7.2, x0:-5, x1:13, z0:-6, z1:6, name:'Second floor' }, // shifted 4 m east
];
Both read the courtyard the same way. The brief anchors the void to the footprint, so when the top storey slides 4 m east the courtyard should stay put and the storey should move around it. Astra spelled the decision out in a comment. Fable passed the same numbers to all three levels. Two labs, one reading, and it is the reading the brief supports.
Then I ran each file in a fresh browser tab with the developer protocol attached, listened for exceptions and network requests, and drove the four interactions.
Neither threw a single console error. Their only outbound requests are the library:
Astra cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js
Fable unpkg.com/three@0.160.0/build/three.module.js
unpkg.com/three@0.160.0/examples/jsm/controls/OrbitControls.js
unpkg.com/three@0.160.0/examples/jsm/controls/PointerLockControls.js
Same library, same version, different CDN, and Fable reaches for the two control add-ons where Astra writes its own camera handling.
| GPT-6 Astra | Claude Fable 5.1 | |
|---|---|---|
| Materials, shadows, planting | yes | yes |
| First person at eye height | yes | yes |
| Section cut that moves geometry | yes, 4.9 to 14.7 per cent of the screen changes per step | yes, 4.3 to 27.5 per cent per step |
| Click a room for name and area | yes | yes |
| Sun slider that moves shadows | yes, 52 to 55 per cent per swing | yes, 86 to 87 per cent per swing |
| Six dimensions | 6 / 6 | 6 / 6 |
| Console errors | 0 | 0 |
| Generation time | 6 min 50 s | about 21 min |
| File size | 21,385 characters | 51,165 |
The percentages are measured, not impressions: I screenshotted before and after each slider step and counted the pixels that changed.
The room areas are worth one more line, because this is where a model can quietly invent a number.

Neither invented anything. Fable prints the room's dimensions next to the area, so 6.0 × 3.0 m and 18.0 m² check against each other on screen. Astra computes area from the room's own extents, and its top-floor east room reads 57.60 m² where the same position two floors down reads 33.6 — the 4 m shift shows up in the floor areas, which is exactly what should happen and would not if the number were decorative.
The difference is in what nobody asked for
Neither brief mentioned stairs, floor plans, or how to get from the ground floor to the top.
Astra built buttons. Ground, First, Second, which drop you onto that level at 1.65 m eye height. It also keeps a live plan of the current section in the corner of the screen the whole time, and while you walk, your position shows on that plan as a red dot.
Fable built a staircase. A dog-leg stair in the east stair hall, with a sloped handrail, that you climb. Its panel tells you so: "Stairs and doors are in the east stair hall; the terrace door is on the top floor." Its plan is a separate mode you switch into, not a panel you keep.

This is the clearest split in the whole test, and it shows up immediately when you try to look around. Here they are side by side in first person, driven the same way at the same moment:

They are in different places because the products put you in different places. Astra's floor buttons had already taken me inside. To get inside Fable's building I have to walk there and find the door.
Neither is wrong. One of them optimised for a reviewer who wants to check the second floor right now. The other optimised for a building you experience by moving through it. If you are choosing between them for architectural work, that difference will matter more to you than any benchmark score, and no benchmark reports it.
Where I had to go to find Astra
One practical note, because it cost me an hour.
OpenAI's launch page says, under a heading that just reads Availability:
"GPT‑6 Astra is rolling out today to a limited set of organizations and over the coming days will become available to all ChatGPT Plus, Pro, Business, and Enterprise users, as well as through the OpenAI API, Microsoft Azure, and AWS Bedrock."
On my Plus account, eleven days after that page went up, the model list in the Chat tab holds two entries: GPT-5.6 Sol and GPT-5.5. Astra is not among them. It is one tab across, in Work, where the list has six and the effort control has five steps instead of three.

A thread on OpenAI's own developer forum, opened on 5 September, asks about the same gap and had no staff answer when I read it. I cannot tell you why the split exists or whether your account looks the same. I can tell you which tab I found it in.
What I got wrong while measuring this
I want this part in the post because it nearly changed the results four separate times, and every one of the four was my instrument rather than the models.
- I judged "did the screen change?" by the length of
canvas.toDataURL(). On a WebGL canvas that call returns an empty image, so it was the same 44,058 characters no matter what I did. The section slider and the sun slider both looked dead. They were not. - A patch to my own test script failed silently. I used Python's
str.replace()without asserting the match, so the slider id stayed hard-coded to Fable'scutwhile I was testing Astra'ssection. The script cheerfully reported zero change, and I nearly published "Astra's section cut does not work." - My screen recorder did not clear its frame folder. A shorter run left older frames behind, and one clip ended up with the sun at 13:00 in the first half and 10:30 in the second.
- The recorder's arguments were off by one position, so the slider id arrived as the string
"880x560". The section never moved during that recording, and I read the building rotating as the building opening.
Every one of those errors pointed the same direction: they made a working thing look broken, or a broken thing look fine. The only reason none of them reached this page is that I looked at the frames.
What I did not test
- One run each. Astra's weekly allowance on Plus is not published and reporting puts it low, so I spent one. That means I cannot tell you whether either model would produce something different on a second attempt with the same words. I know from an earlier test that Fable does vary; for Astra I simply do not know.
- Different effort settings. Astra ran on
Light, second of five in the Work tab. Fable ran on medium. Those are the defaults, which is the point, but it is not a like-for-like capability test. - Wall clock only. The times include whatever queue each service was in. Do not read them as speed.
- One task, one building. Nothing here transfers to writing, to data work, or to a codebase.
- Nobody has lived in either of these. They are browser toys built from a paragraph. The dimensions are right; that is a much smaller claim than the pictures suggest.
If you want to run it yourself
Take a brief you already know the answers to, write down the numbers first, and then take the handcuffs off. My first attempt failed because I wrote a prompt made almost entirely of prohibitions, and got back exactly what I asked for: two correct, identical, useless grey boxes.
Keep the part that can be graded — the dimensions — and hand over everything else. Then grade the code rather than the render, because a model that has invented a floor area will still draw you a convincing room.