The Universe promise and what I have on 15 March
It is 15 March. In January I wrote that November’s Universe showed a preview of an environment in which an assistant takes a change through many files, from issue to pull request, and that I did not have that environment. Two months have passed and I still do not have it. GitHub named that preview Copilot Workspace and on 8 November 2023 said “when Copilot Workspace is delivered in 2024”. Today, in mid-March, I have no waitlist, no preview, and I am not opening anything that would take an issue through a plan to a PR.
I do have something that conversations confuse with that preview, and that is what this post is about. Since 29 December Copilot Chat has been generally available in stable VS Code, without the Insiders channel and without the Nightly extension I wrote about in May. Since the changelog of 30 November 2023 that chat has included a @workspace agent: a question that is not tied to one open buffer, but to the repository in the window. That is the multi-file help I actually use. It is not the Workspace product.
My thesis for March 2024 is narrow. Multi-file help is @workspace in Copilot Chat. I review a plan for changes across several test files before I paste anything into the suite. I do not delegate the merge. I do not pretend that Universe has already delivered a bridge from issue to pull request.
Here is the state of the workshop today. The runner is Playwright 1.42.1 from 2 March. I have Chat in stable VS Code on the same subscription as ghost text since June 2022. On 27 February Copilot Enterprise became GA: chat on github.com, knowledge bases, PR summaries. None of those three things is Workspace. I also do not pin tools I do not have as a daily stack for this post.
What will not be here. There will be no sentence that “today I open Workspace and commit from issue to PR”. There will be no Devin tutorial. There will be no move of daily work onto claude.ai. There will be one synthetic demo: a POM, a spec, and a login test in the examples repository, a @workspace question about where to add an assertion for a wrong password, and two strikeouts.
What multi-file means in March
Ghost text still sees one buffer. That was true in technical preview, true for test boilerplate, and true today. The gray text in front of the cursor does not know that LoginPage.ts and auth.md sit next to login.spec.ts. It knows what is above the cursor.
@workspace is there to lift that limit without pasting three files into a browser. I ask in chat, with the @workspace agent, about something that by definition does not fit in one file: where in this suite to add an assertion that a wrong password leaves the user on the form and shows a message. Chat collects references. I decide which of them to touch.
The difference from May 2023 is product status, not magic. Then chat was a preview in Insiders and saw the open file. Today it is GA and can point at several files. It still cannot confirm that the pointer is right. It still does not merge.
In practice I open chat, type @workspace and a question, and I get a list of places. Sometimes with a citation. Sometimes with a confidence the citation does not support. I read that list as a review, not as an order.
A plan, not a blind apply
I ask for two things and nothing else: a list of files that need to change, and a proposed diff in the chat. I do not ask it to write the changes to disk. I do not ask for a commit. This is the same discipline I used in April 2023 on ghost text, except the object under review is wider: not one suggestion in a line, but a plan that claims to know three files at once.
I will show this on synthetic login from the examples repository, not from a client project. There are three files. LoginPage.ts holds locators and methods. login.spec.ts has the correct-password scenario. auth.md says that a wrong password leaves the form and shows the text “Invalid password”. The prompt I pasted was this:
@workspace Where should I add an assertion that login with a wrong password
leaves the user on the form and shows an error message?
Do not write changes. List the files and a proposed diff.The answer pointed at three places. I strike out two of them.
Strikeout one: the wrong file. Chat proposed adding the assertion to the existing correct-password test, at the end, after expect(page).toHaveURL(/dashboard/). That is the shortest path to green and the worst contract for what the test checks. A success scenario should not spend its second half pretending the password is wrong. The wrong-password assertion belongs in a new test or a separate test(), not on the tail of the happy path. The POM could get an expectError(message) method, the spec did not need to move, login.spec.ts needed a second case. Chat folded that into one edit because that is fewer files.
Strikeout two: an invented export. The proposed diff for LoginPage.ts imported errorBanner from a file locators.ts. That file does not exist in this repository. It was not in the cited references. The model added it because in other projects it trained on, locators live in a separate module, and my POM keeps them on the page class. If I had pasted that diff without reading it, I would have gotten red TypeScript before I got a red test.
The third pointer is the only one I accepted as a plan: a new test in login.spec.ts plus a page-object method that reads the message after a failed submit. auth.md stays the source of the expectation, not a place for code. That call did not come from chat. It came from review.
I do not delegate the merge, because nobody but me signs that plan. @workspace cannot see whether the error message is in the DOM, in aria-live, or in a toast that disappears after three seconds. That is not in the files it indexed. It is in the application’s behaviour, and I check behaviour with the runner, not with chat.
Devin as a headline
On 12 March, three days before this post, Cognition announced Devin: an “AI software engineer” with access to a shell and a browser, for now early access and a waitlist. The headline is loud and belongs in the same conversation I had in January about the Auto-GPT loop: a goal, tools, next steps, a promise that the suite will get an owner.
I am not installing it. I do not have access. I am not turning it into a tutorial on maintaining tests. I am leaving the date and one observation: Devin sells itself as an agent that reaches the end on its own, and @workspace sells itself as chat that can see the repository. Those are two different contracts. In March 2024 I stay with the second, with a review of the plan, and I do not swap it for the first only because the first looks better in a title.
Claude 3 as a competitor
On 4 March Anthropic announced the Claude 3 family: Opus and Sonnet immediately, Haiku in a “soon” preview. The API is generally available. That is a real competitor for the browser chat in which I have sketched cases since January 2023. It is not a competitor for @workspace in VS Code, because it does not sit in my editor and does not index my test repository.
I am not moving daily work onto claude.ai. Copilot stays in the IDE. Claude stays in the same drawer as ChatGPT: a sketch I paste and cross out. On 15 March I have no reason to merge those two channels into one process. The pyramid has not changed shape since September because March added another model.
Summary
The multi-file help I have in March 2024 is workspace context in Copilot Chat. The Copilot Workspace product remains a promise from Universe.
Three sentences I want to be able to read a year from now. On 15 March I do not open Workspace and I do not take an issue to a PR; I open @workspace and ask for a file list plus a diff in chat. A synthetic login suite showed two strikeouts I already know from ghost text and from loops: an assertion glued onto the happy path, and an import from a file that does not exist. Review of the plan remains, exactly like review of one line in April and review of an agent in January.
What does not follow. It does not follow that Workspace will not ship this year: GitHub promised 2024, and I record that date, I do not negotiate it. It does not follow that Devin is worthless, because I do not have it and I cannot measure it. It does not follow that @workspace replaces reading the POM, the spec, and the test in order, because the only correct plan in the demo was the one I assembled after the strikeouts.
The condition by which I will know the issue-plan-PR bridge has matured is this: I get a preview I can run myself, and two runs on the same issue produce the same set of files, without an invented export. Until then, multi-file help on my side ends in chat. I sign the merge.

