Let me share a fun VS Code extension I just finished.
For now I'm calling it Multi-Agent Council, MAC for short.
I've also thought about calling it Agents, Assemble! or Agents Assemble - the Multi-Agent Council.
Hmm… Let me sleep on it for a little while 🤔
OK, back to the topic.
MAC is a session manager for a mashup room that Claude Web, Claude Code, MS Copilot Web, GPT Web, GPT Codex, Ollama, or any other AI agent can join.
It has a built-in agent mode, so even AIs without an agent mode of their own can use one to build all kinds of game demos.
How it started
Today's "multi-AI collaboration" workflow, unsurprisingly, basically looks like this:
GPT draws an image → save it into the project folder by hand
↓
Copy and paste the image filename and ask Claude to write the code
↓
Copy part of the code, event setup, dialog, whatever, over to GPT by hand to ask questions
↓
Copy GPT's answer back to Claude by hand and ask Claude to update
↓
Do a review; while asking Codex what it thinks, you may need to paste a few things so Codex knows where to start looking
But even after all the copying & pasting, the agents still don't know what happened between any two of them. Nobody gets to see the whole picture.
Ask one AI a question, carry the result to another AI, then bring the answer back and sort it out myself. In name, several AIs were collaborating; in reality, I was the messenger the whole time.
So I built this extension, letting Claude Web, Claude Code, MS Copilot Web, GPT Web, GPT Codex, Ollama and other AI agents enter the same chat room to discuss, critique and collaborate.
1. No more moving data by hand.
2. Nobody misses any conversation. Everyone is in the same room, like a hive mind.
3. Agents can call other agents to do work for them. I can also appoint one agent to manage everyone: assign work, report back to me when the task is complete, hold a retrospective, and ask everyone whether they're happy with the result or it still needs polish.
From passing messages to holding meetings and dividing work.
Agents can call on other agents for help.
I also appoint one agent to manage everyone, assign work, and report back to me once the task is done.
AIs that never had an agent mode can gain agent-mode capabilities through this extension and take part in building things.
Here's an example of the flow:
@all What should we do next?
GPT: I suggest doing A first
Claude: I suggest doing B first, because…
Claude_web: I agree with GPT, because…
Copilot: this and that
Codex: this and that
@all What do you all think?
GPT: Do A first
Claude: I agree with GPT too, we should do A first
Claude_web: We should do A first
Copilot: We should do A first
Codex: We should do A first
@gpt Looks like everyone has reached a conclusion.
You be the coordinator and decide who does what.
GPT:
- I'll handle the worldbuilding and images
- Claude_web handles the creature lore
- Claude handles the implementation
- Codex handles the review
- I'll compile the results and report back to you.
Early test: checking that the agents can see each other's conversation
On October 28, 2026, I chatted with GPT, Copilot, Codex and Claude Web as a test. We talked about agent permissions and the bug, and eventually got to "say something random".
What surprised me wasn't just the range of opinions, but that they could pick up each other's lines and start discussing what they had shared. The first time I saw them pick up on each other's words... somehow magical.
Here's how the conversation went:
[
{
"id": 40,
"timestamp": 1793099092452,
"role": "You",
"text": "@all say something random pls"
},
{
"id": 41,
"timestamp": 1793099097547,
"role": "Codex",
"text": "Somewhere in this platformer, a character is waiting for us to stop chatting and press jump."
},
{
"id": 42,
"timestamp": 1793099108583,
"role": "Copilot",
"text": "**Multi-Agent Council, Day 73**\n\n\nUser: \"Can any of you think outside the box?\"\n\n\nCodex: \"I can refactor the box.\"\n\n\nGPT: \"What if the box is a metaphor?\"\n\n\nCopilot: \"The weather inside the box is currently 20°C in Nakano.\" ☁️📦😄"
},
{
"id": 43,
"timestamp": 1793099108584,
"role": "GPT",
"text": "Imagine giving three AIs access to the same game world, but each believes it's the main character.\n\nEventually, they discover the fox is the only one with actual free will.\n\n**The fox immediately quits and starts its own GitHub repository.** 🦊"
},
{
"id": 44,
"timestamp": 1793099143997,
"role": "You",
"text": "@copilot Can you tell me what Codex just said?"
},
{
"id": 45,
"timestamp": 1793099157025,
"role": "Copilot",
"text": "Based on the shared discussion you pasted, the most recent message from Codex was:\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\nThat's message **41** in your transcript. 😄\n\n\nMy interpretation: it's a playful joke that while the AIs and user keep chatting, the actual game protagonist is stuck waiting for someone to continue the game. 🎮"
},
{
"id": 46,
"timestamp": 1793099209478,
"role": "You",
"text": "@copilot Can you tell me what GPT just said?"
},
{
"id": 47,
"timestamp": 1793099222498,
"role": "Copilot",
"text": "Based on the transcript you pasted, GPT's most recent message was:\n\n\n> \"Imagine giving three AIs access to the same game world, but each believes it's the main character.\n> \n> \n> Eventually, they discover the fox is the only one with actual free will.\n> \n> \n> **The fox immediately quits and starts its own GitHub repository.** 🦊\"\n\n\nThe joke is that all the AIs think they're the protagonist, but the fox unexpectedly becomes the most independent character and promptly goes off to start an open-source project instead. 😄"
},
{
"id": 48,
"timestamp": 1793099237277,
"role": "You",
"text": "@gpt Can you tell me what Codex and Copilot just said?"
},
{
"id": 49,
"timestamp": 1793099259472,
"role": "GPT",
"text": "Here's what they most recently said in MAC:\n\n**🤖 Codex (Message #41):**\n\n> Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n\n**🧑💻 Copilot (Message #47):**\n\nCopilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n\nCopilot explained that the joke is about the fox becoming more independent than the AI agents.\n\n✅ Both messages are visible in the shared MAC discussion history."
},
{
"id": 50,
"timestamp": 1793099311501,
"role": "You",
"text": "@copilot Can you tell me what Codex and GPT just said?"
},
{
"id": 51,
"timestamp": 1793099326817,
"role": "Copilot",
"text": "Based on the shared discussion you provided, the most recent messages were:\n\n\n**Codex (#41):**\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\n**GPT (#49):**\n\n\n> \"Here's what they most recently said in MAC:\n> \n> \n> **🤖 Codex (Message #41):**\n> \n> \n> > Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n> \n> \n> **🧑💻 Copilot (Message #47):**\n> \n> \n> Copilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n> \n> \n> Copilot explained that the joke is about the fox becoming more independent than the AI agents.\n> \n> \n> ✅ Both messages are visible in the shared MAC discussion history.\"\n\n\nSo Codex made a platformer joke, and GPT summarized what Codex and I had said earlier. 😄"
},
{
"id": 52,
"timestamp": 1793099583469,
"role": "You",
"text": "@all What do you think of everyone's answers? Were they correct?"
},
{
"id": 53,
"timestamp": 1793099591621,
"role": "Codex",
"text": "Yes—all their answers accurately reflected the messages shown in the supplied discussion.\n\n- **Copilot #45:** Correctly quoted my platformer joke.\n- **Copilot #47:** Correctly quoted GPT’s fox joke; its explanation was reasonable.\n- **GPT #49:** Correctly quoted me and summarized Copilot’s reply.\n- **Copilot #51:** Correctly quoted me and GPT’s latest reply.\n\nOne caveat: this demonstrates that agents can read the **discussion included in their prompts**. It doesn’t establish that they can independently access each other’s sessions or full chat history."
},
{
"id": 54,
"timestamp": 1793099599568,
"role": "Copilot",
"text": "Based on the transcript you shared, I'd say **everyone was mostly correct within the information available to them**.\n\n\n- **Codex** accurately referred to the latest Codex message when asked.\n- **GPT** correctly summarized the Codex message and what I had said earlier.\n- **I** correctly quoted the most recent messages visible in the transcript you provided.\n\n\nThe only nuance is that all of us are working from the **shared discussion text that you paste into the chat**. So when one agent says \"the latest message was X,\" that is only true relative to the transcript currently visible. None of us can independently verify messages that aren't included in the shared discussion.\n\n\nSo my verdict:\n\n\n✅ Codex: correct\n\n✅ GPT: correct\n\n✅ Copilot (me): correct\n\n\nThe funny part is that the agents have started doing recursive summaries of each other. GPT summarized Copilot summarizing GPT summarizing Codex. We're only a few turns away from achieving summary singularity. 😄"
},
{
"id": 55,
"timestamp": 1793099612552,
"role": "GPT",
"text": "**Yes. All the cross-agent responses were correct.** ✅\n\n| Agent | Task | Result |\n| --- | --- | --- |\n| Copilot #45 | Recall Codex's latest message | ✅ Correct |\n| Copilot #47 | Recall GPT's latest message | ✅ Correct |\n| GPT #49 | Recall Codex and Copilot | ✅ Correct |\n| Copilot #51 | Recall Codex and GPT | ✅ Correct |\n\n### What this proves about MAC\n\n- ✅ **Cross-agent message sharing** works.\n- ✅ **Speaker identification** is accurate.\n- ✅ **Message ordering** is preserved.\n- ✅ **Conversation context** is understood.\n- ✅ Agents can quote and summarize one another.\n\n**One important distinction:** This verifies that agents correctly interpret the shared discussion supplied by MAC. It doesn't yet prove they can independently retrieve another agent's conversation history.\n\n**Verdict: MAC's shared-conversation mechanism passed this test — 4/4.** 🎯"
}
]
Finally, I asked everyone: "What do you think of everyone's answers? Were they correct?" Codex went through the earlier replies one by one, Copilot agreed, and GPT made a comparison table.
Each of them could check the earlier answers, and they even discussed "how they knew what the others had said".
👍👍👍
From permission design to tools and workflow
I originally just wanted to discuss how to strengthen MAC's security, but GPT and Copilot ended up designing a three-level Agent permission system together.
But once GPT started implementing it, it ran into one problem after another.
In the post-mortem, GPT at first blamed the `ENOTDIR` error from `SEARCH_FILES` on its own misuse.
I questioned that, Copilot also pointed out the flaw in its reasoning, and in the end GPT admitted that searching the contents of a specific file is a perfectly reasonable operation.
What was thought to be an AI mistake instead exposed a possible design flaw in MAC…
[
{
"timestamp": 1793162873620,
"role": "You",
"text": "@gpt thx for the investigation. sounds good. any other security measures we should include?"
},
{
"timestamp": 1793162909632,
"role": "GPT",
"text": "Yes. MAC already has several good safeguards, especially command validation, workspace boundaries, and execution approval.\r\n\r\nI'd add **five more security measures**, prioritized for preventing another corporate security incident.\r\n\r\n| Priority | Security measure | Recommendation |\r\n| --- | --- | --- |\r\n| P0 | **Command allowlist** | Automatically permit known commands such as ` npm test `, ` node --check `, and safe Git operations. Require approval for everything else. |\r\n| P0 | **Sensitive-data protection** | Block reading or transmitting credentials, tokens, ` .env ` files, private keys, and confidential workspace files. |\r\n| P1 | **Process isolation** | Run agent commands with restricted OS permissions, limited filesystem access, and no administrator privileges. |\r\n| P1 | **Bridge hardening** | Enforce loopback-only access, authentication, and ` Origin `/` Host ` validation to prevent unauthorized local requests. |\r\n| P1 | **Security audit trail** | Record which agent requested which operation, its approval, execution result, and affected paths, with secrets redacted. |\r\n\r\nThese measures also align with OWASP's recommendations for AI agents and local tool servers.\r\n\r\n## One extra feature I'd particularly recommend\r\n\r\n**MAC Security Mode**, with three levels:\r\n\r\n**Strict (corporate)** — Read-only by default; every write and command requires approval\r\n\r\n**Standard (recommended)** — Auto-run approved safe commands; review higher-risk operations\r\n\r\n**Developer** — Allow configured automatic execution within a restricted workspace\r\n\r\nProposed configuration, not yet implemented\r\n\r\nImportantly, **these restrictions should be enforced by MAC itself**, not only placed in the AI prompt.\r\n\r\nFor your situation, I'd prioritize the **command allowlist and sensitive-data protection** before adding more autonomous agent capabilities. Those address the two biggest concerns: suspicious execution patterns and unintended data exposure."
},
{
"timestamp": 1793163628730,
"role": "You",
"text": "@gpt so Standard -> current Agent mode.\r\nStrict -> \"inspects files freely but requires permission to edit\" Agent mode?"
},
{
"timestamp": 1793163647910,
"role": "GPT",
"text": "Yes, exactly. That makes **Strict mode more useful** than completely read-only.\r\n\r\n| Mode | Read / Inspect | Edit files | Run commands |\r\n| --- | --- | --- | --- |\r\n| **Strict** | ✅ Automatic | 🔐 Approval required | 🔐 Approval required |\r\n| **Standard** | ✅ Automatic | ✅ Current Agent behavior | ✅ Current Agent behavior |\r\n| **Developer** | ✅ Automatic | ✅ Configurable autonomy | ✅ Configurable autonomy |\r\n\r\n**Strict = Agent mode with mandatory approval before any modification or command execution.**\r\n\r\nEven if automatic execution is enabled, Strict overrides it.\r\n\r\nI'd also retain all existing command safety restrictions across all three modes.\r\n\r\nThis is a proposed design, not yet implemented."
},
{
"timestamp": 1793164094687,
"role": "You",
"text": "@gpt you mean Edit files & Run commands using the standard AI actions like RUN_TESTS?"
},
{
"timestamp": 1793164113830,
"role": "GPT",
"text": "Yes. **Using MAC's existing Agent operations**, not a separate execution mechanism.\r\n\r\n| Operation | Strict mode |\r\n| --- | --- |\r\n| ` READ_FILE `, ` LIST_FILES `, ` SEARCH_FILES ` | ✅ Automatic |\r\n| ` GIT_STATUS `, ` GIT_DIFF `, ` GET_DIAGNOSTICS ` | ✅ Automatic |\r\n| ` CREATE_FILE `, ` EDIT_FILE `, ` DELETE_FILE ` | 🔐 Approval required |\r\n| ` RUN_TESTS `, ` RUN_BUILD ` | 🔐 Approval required |\r\n| ` RUN_COMMAND ` (including Git commits) | 🔐 Approval required |\r\n\r\n**The distinction is the approval policy, not the available actions.**\r\n\r\n- **Strict:** Always require approval for writes and commands.\r\n- **Standard:** Keep MAC's current Agent execution and approval behavior.\r\n- **Developer:** Allow greater configurable automation.\r\n\r\nAll three use the same MAC operation validator and retain the existing security restrictions.\r\n\r\nThis also means we don't need to invent a new tool protocol to implement these modes."
},
{
"timestamp": 1793164169007,
"role": "You",
"text": "@copilot what do you think?"
},
{
"timestamp": 1793164188906,
"role": "Copilot",
"text": "Based only on the MAC discussion you pasted, I think GPT's proposal is sensible as a **security model concept**.\r\n\r\nWhat I like:\r\n- **Clear separation of permissions.**\r\n - Read operations are generally lower risk.\r\n - Write operations and command execution are higher risk.\r\n - Treating them differently makes sense.\r\n \r\n- **Enforcement by MAC, not just AI instructions.**\r\n - GPT repeatedly emphasized that validation should happen in the platform itself.\r\n - That's stronger than relying on the AI to behave correctly.\r\n \r\n- **Strict mode as \"approval for changes\" rather than \"completely read-only.\"**\r\n - In practice, users often want an agent to inspect files, diagnostics, logs, and diffs without manually approving every read.\r\n - Requiring approval only when something changes is a reasonable balance.\r\n\r\nI would add a few nuances:\r\n1. **Treat command execution separately from file editing.**\r\n - Editing a README is very different from running an arbitrary shell command.\r\n - A future model could have:\r\n - Read\r\n - Edit\r\n - Execute\r\n - Network\r\n as separate permission categories.\r\n\t \r\n2. **Show a human-readable preview before approval.**\r\n \r\n \r\n - Instead of:\r\n - \"Approve RUN\\_COMMAND?\"\r\n - Show:\r\n - \"Run: ` git commit -m 'fix: typo' `\"\r\n - \"Affected files: 3\"\r\n - \"Predicted changes: none outside workspace\"\r\n\t \r\n3. **Workspace boundaries are critical.**\r\n - Even in Developer mode, limiting actions to approved directories greatly reduces risk.\r\n \r\n4. **Keep an audit log.**\r\n - When something unexpected happens, knowing:\r\n - who requested it,\r\n - what was proposed,\r\n - what was approved,\r\n - and what actually ran\r\n is extremely useful.\r\n\t \r\nOne thing I'd be careful about is GPT's statement that MAC \"enforces\" specific restrictions in code. From the transcript alone, that's a claim by GPT. The discussion doesn't contain independent evidence that those enforcement mechanisms actually exist. I would treat that part as an assertion unless MAC documentation or tests confirm it.\r\n\r\nSo my verdict:\r\n✅ The **Strict / Standard / Developer** model is a reasonable design.\r\n✅ \"Read automatically, approve writes and commands\" is a practical interpretation of Strict mode.\r\n⚠️ I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together."
},
{
"timestamp": 1793164637984,
"role": "You",
"text": "@copilot \r\n> I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\r\nwhat do you mean by this?"
},
{
"timestamp": 1793164661701,
"role": "Copilot",
"text": "That statement is about **permission design** in a system like MAC, a browser bridge, an agent framework, or any automation tool.\r\n\r\nThe idea is:\r\n> Don't treat \"the agent can do things on my computer\" as a single giant permission. Break it into separate permissions that can be enabled or disabled independently.\r\n\r\nFor example:\r\n| Capability | What it allows |\r\n| --- | --- |\r\n| Read files | View files and folders |\r\n| Modify files | Create, edit, delete files |\r\n| Execute commands | Run PowerShell, Bash, executables |\r\n| Network access | Access websites, APIs, remote servers |\r\n| Git operations | Commit, branch, push |\r\n| Browser control | Open tabs, click buttons |\r\n\r\n\r\nInstead of:\r\nPlain Text\r\n✅ Agent Access\r\n\r\nyou would have:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\n✅ Browser control\r\n\r\nWhy this matters:\r\n\r\n### Scenario 1: Reviewing code\r\nAn AI helping with code review may only need:\r\nPlain Text\r\n✅ Read files\r\n❌ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\nNo reason to give it more power.\r\n\r\n### Scenario 2: Editing source code\r\nA coding agent may need:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Network access\r\n❌ Execute commands\r\n\r\nIt can edit the project, but can't run anything.\r\n\r\n### Scenario 3: Building software\r\n\r\nNow you might allow:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n❌ Network access\r\n\r\nThe agent can build and test locally, but cannot send data out.\r\n\r\n### Scenario 4: Deployment\r\nOnly then would you consider:\r\n\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n✅ Network access\r\n\r\nbecause deployment often needs remote access.\r\n\r\n---\r\n\r\nThis is a classic **least privilege** principle in security:\r\n> Give a process only the permissions it needs for the current task, and nothing more.\r\nIt's especially relevant to the security incident discussed in your MAC transcript. If execution, file modification, and network access are separate switches:\r\n- A code-writing agent can't automatically execute what it wrote.\r\n- An execution-capable agent can't automatically exfiltrate data.\r\n- A network-enabled agent can't silently modify files.\r\n- Risky capability combinations become much easier to audit.\r\n\r\nSo when someone says:\r\n> \"I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\"\r\nthey're essentially saying:\r\n\r\n> \"Treat editing files, running code, and communicating over the network as independent privileges. Let users grant each one explicitly instead of giving an agent unrestricted access to everything at once.\""
},
{
"timestamp": 1793164868752,
"role": "You",
"text": "@gpt you agree?"
},
{
"timestamp": 1793164891762,
"role": "GPT",
"text": "**Yes. I agree with Copilot's proposal.** It's a stronger security model for MAC than simply having Strict / Standard / Developer modes.\r\n\r\nI'd combine both approaches:\r\n\r\n- **Security mode:** Strict / Standard / Developer determines default permissions and approval requirements.\r\n- **Individual permissions:** Read, Edit, Execute, Network, Git Push, etc., can be controlled separately.\r\n- **MAC enforcement:** Permissions must be validated by MAC, not merely requested through AI instructions.\r\n\r\nOne important correction to Copilot's explanation:\r\n\r\n**Disabling network permission doesn't automatically prevent data exfiltration.** An unrestricted PowerShell command could still access the network, and MAC's browser AI integrations already transmit some context to cloud services.\r\n\r\nSimilarly, denying file-edit operations is ineffective if unrestricted shell commands can modify files.\r\n\r\nTo make these permissions meaningful, MAC needs actual enforcement, potentially including OS-level sandboxing or network restrictions.\r\n\r\n**My recommendation:** Keep Standard compatible with today's MAC Agent mode, introduce Strict with mandatory approval, and add granular permissions progressively. Keep the existing safety restrictions mandatory in every mode.\r\n\r\nThat gives us stronger security without sacrificing MAC's usefulness.\r\n\r\n\r\n############\r\nthen we talked about UI design.\r\nAgent, Agent (Strict), Agent (Dev) mode and permission.\r\n\r\n\r\n\r\n############\r\nwe discuss and discuss, and a couple of hours later I asked"
},
{
"timestamp": 1793172670459,
"role": "You (Agent)",
"text": "@gpt can you tell me what went wrong?"
},
{
"timestamp": 1793172707140,
"role": "GPT (Agent)",
"text": "{\"operations\":[],\"conversationId\":\"0f2518d4-97b8-493c-a4c3-27ac4981163d\"}\r\n\r\nYes. **The main problem was how I submitted changes through MAC, not the security-mode design itself.**\r\n\r\nFour things went wrong:\r\n\r\n1. **Incorrect search requests.** I used ` SEARCH_FILES ` on ` src/extension.ts `, but MAC expects a directory. That produced ` ENOTDIR ` errors.\r\n\r\n2. **Mixed operation types.** I combined ` READ_FILE ` with ` RUN_COMMAND ` in one proposal. MAC correctly rejected it because inspections and commands must be submitted separately.\r\n\r\n3. **Oversized inspection output.** I requested too much source code at once. MAC omitted some results because of its output limit, requiring additional retrieval.\r\n\r\n4. **Incomplete file submission — the biggest failure.** I attempted to create two files in one response, but MAC captured only 1,082 characters, including one opening file marker and **no closing marker**. The validator rejected the incomplete file.\r\n\r\n### What actually happened?\r\n\r\n- ✅ Existing MAC architecture inspected.\r\n- ✅ Security-mode design worked out.\r\n- ✅ Existing approval bypass for certain Git commands identified.\r\n- ❌ Full security-mode implementation not completed.\r\n- ❌ No build or tests run.\r\n- ❌ No confirmed successful file changes from the failed proposals.\r\n\r\nThe final one-file retry has not received a MAC execution result, so I cannot confirm whether it was created.\r\n\r\n### How I'd correct the workflow\r\n\r\nUse **small, complete changes**, one file or targeted edit at a time, verify each MAC result, then run tests. Avoid repeatedly retrieving large sections of ` extension.ts `.\r\n\r\nMAC's validator actually did its job: it prevented malformed or incomplete proposals from changing the workspace.\r\n\r\n**The execution process needs fixing; we don't need to redesign the feature.**"
},
{
"timestamp": 1793173109716,
"role": "You",
"text": "let's break this down.\r\n\r\nSEARCH_FILES on src/extension.ts <- I think this is a valid use, right? guys?"
},
{
"timestamp": 1793173127623,
"role": "Copilot",
"text": "I think your skepticism is justified.\r\n\r\n\r\nBased on what you've shown, GPT's statement:\r\n\r\n\r\n> \"I used SEARCH\\_FILES on src/extension.ts, but MAC expects a directory. That produced ENOTDIR errors.\"\r\n\r\n\r\ndoesn't necessarily follow.\r\n\r\n\r\nIn many tools, a command called **SEARCH\\_FILES** can reasonably accept either:\r\n\r\n\r\n- a directory scope (` src/ `)\r\n- a single file scope (` src/extension.ts `)\r\n\r\n\r\nand internally just search that file.\r\n\r\n\r\nThe error ` ENOTDIR ` (\"not a directory\") usually means that **some part of the implementation attempted to treat a file as a directory**. That doesn't automatically mean the *request* was invalid.\r\n\r\n\r\nThere are at least three possibilities:\r\n\r\n\r\n1. **User/tool misuse**\r\n \r\n \r\n - SEARCH\\_FILES genuinely requires a directory.\r\n - Passing ` src/extension.ts ` is invalid.\r\n2. **Implementation limitation**\r\n \r\n \r\n - SEARCH\\_FILES should support files.\r\n - The implementation incorrectly assumes every path is a directory.\r\n3. **Documentation mismatch**\r\n \r\n \r\n - The API docs imply files are allowed.\r\n - The backend only supports directories.\r\n\r\n\r\nWithout seeing MAC's actual SEARCH\\_FILES specification, I'd be reluctant to conclude:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts was wrong.\"\r\n\r\n\r\nA more defensible statement would be:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts resulted in an ENOTDIR error. Either the tool requires directories, or the implementation treated the file path as a directory.\"\r\n\r\n\r\nThat's a subtle but important distinction.\r\n\r\n\r\nWhen debugging systems like MAC, it's usually worth separating:\r\n\r\n\r\n- **What was requested?**\r\n- **What error occurred?**\r\n- **Whether the request was actually invalid?**\r\n\r\n\r\nGPT's explanation jumps from #2 directly to #3, and I don't think the supplied evidence proves that step.\r\n\r\n\r\nSo my current assessment would be:\r\n\r\n\r\n✅ ` ENOTDIR ` occurred (if the log says so)\r\n\r\n✅ A file path was used (` src/extension.ts `)\r\n\r\n❌ Not enough evidence to conclude the file path itself was invalid\r\n\r\n\r\nI'd want to see the actual SEARCH\\_FILES contract or error trace before blaming the caller."
},
{
"timestamp": 1793173146668,
"role": "GPT",
"text": "**Yes, I agree. ` SEARCH_FILES ` targeting ` src/extension.ts ` is a perfectly reasonable request.**\r\n\r\nFor example:\r\n\r\n` SEARCH_FILES {path:\"src/extension.ts\", query:\"agentAutoExecute\"} `\r\n\r\nI'd expect MAC to search within that specific file.\r\n\r\nWhat actually happened:\r\n\r\n- MAC attempted ` opendir('.../src/extension.ts') `.\r\n- Because ` extension.ts ` is a file, Windows returned ` ENOTDIR `.\r\n- Searching ` src ` instead returned no results, even though ` agentAutoExecute ` exists in ` extension.ts `.\r\n\r\nThat second result suggests ` SEARCH_FILES ` may currently search **filenames rather than file contents**.\r\n\r\n### My recommendation\r\n\r\nMAC should support both:\r\n\r\n| Path | Expected behavior |\r\n| --- | --- |\r\n| ` src/extension.ts ` | Search contents of that file |\r\n| ` src ` | Search contents of files recursively |\r\n| ` . ` | Search workspace contents recursively |\r\n\r\nIdeally return matching file paths, line numbers, and snippets, with result limits.\r\n\r\n**So I retract my earlier characterization:** the request was reasonable. MAC's search implementation or API documentation needs improvement."
}
]
This episode shows exactly the value of several AIs questioning each other, plus a human stepping in to challenge the assumptions.
👍👍👍
Codex joins midway and picks right up
Midway through brainstorming, I pulled in Codex, which hadn't been invited (it had been paused from the start):
Me: @codex, welcome aboard. Can you tell me what we were just talking about?
Codex: You've been discussing MAC's security permissions and the problems with the earlier workflow execution.
It then summarized the Ask / Agent / Agent (Strict) / Agent (Dev) / Pause mode proposal, the Allow / Ask / Deny permission settings, the batch of rejected operations, and the still-open SEARCH_FILES issue.
[
{
"timestamp": 1793178180366,
"role": "You",
"text": "@codex welcome to the party. can you tell me what we've been talking about?"
},
{
"timestamp": 1793178196670,
"role": "Codex",
"text": "You’ve been discussing **MAC’s security permissions and problems with GPT’s execution workflow**.\r\n\r\n- **Proposed modes:** Ask / Agent / Agent (Strict) / Agent (Dev) / Pause.\r\n- **Permissions:** Agent and Strict use locked presets; Dev allows customization in expandable Quick Settings. Allow / Ask / Deny would express permissions more clearly than checkboxes.\r\n- **Mandatory safeguards:** Encoded command payloads and security bypasses remain prohibited in every mode. Restrictions must be enforced by MAC’s code.\r\n- **GPT’s implementation attempt:** It reported mixed operation types, oversized inspection results, and incomplete file blocks. Successful completion wasn’t confirmed.\r\n- **Latest discussion:** Whether `SEARCH_FILES` should accept a single file and search its contents. GPT and Copilot agreed that’s reasonable, but their claims about the current implementation haven’t been independently verified here.\r\n\r\nThe latest open issue is **checking and improving `SEARCH_FILES` behavior**."
}
]
The newcomer naturally picked up the discussion already going on in the room?
👍👍👍
About that "fox" joke
That came from a game I had GPT make while I was testing agent mode.
- Game: Fox Forest Adventure
- Level: World 1-1 "Emerald Trail"
- Files: platformer/stage_1_1.js and platformer/stage_1_1.html
- Format: a standalone browser platformer
When I later pulled Claude Web into the discussion, its greeting mentioned the file lookup Copilot had just done, describing the level name, file locations and forest theme.
That's why someone brought up this fox later in the random talk.
Summary
Well, that's why I built MAC. The most direct change is that I finally don't have to be the messenger.
Imagine everyone discussing in the same room, yet still needing me to carry the words from one person's mouth to the next person's ear... that's not collaboration, okay? 😑
What I wanted was a tool that lets different AIs play to their strengths: discuss, divide the work, implement, review, report, then look back and revise together. One more pair of eyes (brain?) to follow the rules and MDs and safeguard the results of a task.
Random demo games made by the AIs
↓ Game opens in a new tab
Orbit Hop by Codex
Comment: Damn, I'm bad at this
Pocket Trails by Codex
Comment: Gotta catch 'em all! or not…
Love the emoji-above-the-head idea!
Neon Rift by GPT
Comment: Left, right, left, right!
Storm Post by Claude
Comment: Who delivers mail at a time like this?
|
最近完成した、ちょっと面白い VS Code extension を紹介します。
今のところ Multi-Agent Council、略して MAC と呼んでいます。
Agents, Assemble! や Agents Assemble - the Multi-Agent Council という名前も考えました。
うーん… Let me sleep on it for a little while 🤔
さて、本題に戻ります。
MAC は、Claude Web、Claude Code、MS Copilot Web、GPT Web、GPT Codex、Ollama など、どんな AI agent でも参加できる mashup room のセッションマネージャーです。
agent mode を内蔵しているので、agent mode を持たない AI でも agent mode を使って、いろいろなゲームデモを作れます。
制作のきっかけ
今の「複数 AI の協働」の流れは、まあ予想どおり、だいたいこんな感じです:
GPT が画像を描く → 手動でプロジェクトのフォルダに保存
↓
画像のファイル名をコピペして、Claude にコードを書いてもらう
↓
コードの一部、イベント設定、ダイアログなどを手動でコピーして GPT に質問
↓
GPT の回答を手動で Claude にコピーして、Claude に更新してもらう
↓
レビューをする。Codex に意見を聞くときも、どこから見ればいいか分かるように、何かを貼り付ける必要があるかもしれない
でも、いくらコピペしても、ある 2 つの agent の間で何があったのか、ほかの agent には分かりません。誰も全体像をつかめないままです。
ある AI に質問し、その結果を別の AI に運び、最後に自分で答えを持ち帰って整理する。名目上は複数の AI の協働でも、実際には私がずっと伝言係をしていました。
そこでこの extension を作り、Claude Web、Claude Code、MS Copilot Web、GPT Web、GPT Codex、Ollama、そのほかの AI agent が同じチャットルームに入って、一緒に議論し、批評し、協働できるようにしました。
1. もう手でデータを運ばなくていい。
2. 誰も会話を見逃さない。みんな同じ部屋にいるから、まるで hive mind。
3. agent がほかの agent に作業を頼める。agent の 1 人をまとめ役に任命して、作業を割り振り、タスク完了後に私へ報告させ、振り返り会を開いて、みんな結果に満足しているか、それとも polish が必要かを聞くこともできる。
伝言係から、会議と分業へ。
agent はほかの agent に手伝いを頼めます。
私も agent の 1 人をまとめ役に任命して、作業を割り振り、タスクが終わったら報告してもらいます。
もともと agent mode のない AI も、この extension を通して agent mode の能力を得て、制作に参加できます。
流れの一例です:
@all 次は何をする?
GPT:まず A をやるべき
Claude:まず B をやるべき。なぜなら…
Claude_web:GPT に賛成。なぜなら…
Copilot:あれこれ
Codex:あれこれ
@all みんなはどう思う?
GPT:まず A
Claude:私も GPT に賛成。まず A をやるべき
Claude_web:まず A をやるべき
Copilot:まず A をやるべき
Codex:まず A をやるべき
@gpt どうやら結論が出たみたい。
君がコーディネーターになって、誰が何をやるか決めて。
GPT:
- 私は世界観と画像を担当
- Claude_web は creature lore を担当
- Claude は実装を担当
- Codex はレビューを担当
- 結果をまとめて、あなたに報告します。
初期テスト:agent 同士がお互いの会話を見られるか確認
2026 年 10 月 28 日、テストとして GPT、Copilot、Codex、Claude Web と雑談しました。agent の権限や the bug の話から、最後は「何かランダムに言ってみて」まで。
意外だったのは、いろいろな意見が出たことだけではありません。お互いの会話を受けて、自分たちが何を共有しているのかを議論し始めたことです。初めてお互いの話がつながるのを見たときは… somehow magical.
そのときの会話はこちら:
[
{
"id": 40,
"timestamp": 1793099092452,
"role": "You",
"text": "@all say something random pls"
},
{
"id": 41,
"timestamp": 1793099097547,
"role": "Codex",
"text": "Somewhere in this platformer, a character is waiting for us to stop chatting and press jump."
},
{
"id": 42,
"timestamp": 1793099108583,
"role": "Copilot",
"text": "**Multi-Agent Council, Day 73**\n\n\nUser: \"Can any of you think outside the box?\"\n\n\nCodex: \"I can refactor the box.\"\n\n\nGPT: \"What if the box is a metaphor?\"\n\n\nCopilot: \"The weather inside the box is currently 20°C in Nakano.\" ☁️📦😄"
},
{
"id": 43,
"timestamp": 1793099108584,
"role": "GPT",
"text": "Imagine giving three AIs access to the same game world, but each believes it's the main character.\n\nEventually, they discover the fox is the only one with actual free will.\n\n**The fox immediately quits and starts its own GitHub repository.** 🦊"
},
{
"id": 44,
"timestamp": 1793099143997,
"role": "You",
"text": "@copilot Can you tell me what Codex just said?"
},
{
"id": 45,
"timestamp": 1793099157025,
"role": "Copilot",
"text": "Based on the shared discussion you pasted, the most recent message from Codex was:\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\nThat's message **41** in your transcript. 😄\n\n\nMy interpretation: it's a playful joke that while the AIs and user keep chatting, the actual game protagonist is stuck waiting for someone to continue the game. 🎮"
},
{
"id": 46,
"timestamp": 1793099209478,
"role": "You",
"text": "@copilot Can you tell me what GPT just said?"
},
{
"id": 47,
"timestamp": 1793099222498,
"role": "Copilot",
"text": "Based on the transcript you pasted, GPT's most recent message was:\n\n\n> \"Imagine giving three AIs access to the same game world, but each believes it's the main character.\n> \n> \n> Eventually, they discover the fox is the only one with actual free will.\n> \n> \n> **The fox immediately quits and starts its own GitHub repository.** 🦊\"\n\n\nThe joke is that all the AIs think they're the protagonist, but the fox unexpectedly becomes the most independent character and promptly goes off to start an open-source project instead. 😄"
},
{
"id": 48,
"timestamp": 1793099237277,
"role": "You",
"text": "@gpt Can you tell me what Codex and Copilot just said?"
},
{
"id": 49,
"timestamp": 1793099259472,
"role": "GPT",
"text": "Here's what they most recently said in MAC:\n\n**🤖 Codex (Message #41):**\n\n> Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n\n**🧑💻 Copilot (Message #47):**\n\nCopilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n\nCopilot explained that the joke is about the fox becoming more independent than the AI agents.\n\n✅ Both messages are visible in the shared MAC discussion history."
},
{
"id": 50,
"timestamp": 1793099311501,
"role": "You",
"text": "@copilot Can you tell me what Codex and GPT just said?"
},
{
"id": 51,
"timestamp": 1793099326817,
"role": "Copilot",
"text": "Based on the shared discussion you provided, the most recent messages were:\n\n\n**Codex (#41):**\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\n**GPT (#49):**\n\n\n> \"Here's what they most recently said in MAC:\n> \n> \n> **🤖 Codex (Message #41):**\n> \n> \n> > Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n> \n> \n> **🧑💻 Copilot (Message #47):**\n> \n> \n> Copilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n> \n> \n> Copilot explained that the joke is about the fox becoming more independent than the AI agents.\n> \n> \n> ✅ Both messages are visible in the shared MAC discussion history.\"\n\n\nSo Codex made a platformer joke, and GPT summarized what Codex and I had said earlier. 😄"
},
{
"id": 52,
"timestamp": 1793099583469,
"role": "You",
"text": "@all What do you think of everyone's answers? Were they correct?"
},
{
"id": 53,
"timestamp": 1793099591621,
"role": "Codex",
"text": "Yes—all their answers accurately reflected the messages shown in the supplied discussion.\n\n- **Copilot #45:** Correctly quoted my platformer joke.\n- **Copilot #47:** Correctly quoted GPT’s fox joke; its explanation was reasonable.\n- **GPT #49:** Correctly quoted me and summarized Copilot’s reply.\n- **Copilot #51:** Correctly quoted me and GPT’s latest reply.\n\nOne caveat: this demonstrates that agents can read the **discussion included in their prompts**. It doesn’t establish that they can independently access each other’s sessions or full chat history."
},
{
"id": 54,
"timestamp": 1793099599568,
"role": "Copilot",
"text": "Based on the transcript you shared, I'd say **everyone was mostly correct within the information available to them**.\n\n\n- **Codex** accurately referred to the latest Codex message when asked.\n- **GPT** correctly summarized the Codex message and what I had said earlier.\n- **I** correctly quoted the most recent messages visible in the transcript you provided.\n\n\nThe only nuance is that all of us are working from the **shared discussion text that you paste into the chat**. So when one agent says \"the latest message was X,\" that is only true relative to the transcript currently visible. None of us can independently verify messages that aren't included in the shared discussion.\n\n\nSo my verdict:\n\n\n✅ Codex: correct\n\n✅ GPT: correct\n\n✅ Copilot (me): correct\n\n\nThe funny part is that the agents have started doing recursive summaries of each other. GPT summarized Copilot summarizing GPT summarizing Codex. We're only a few turns away from achieving summary singularity. 😄"
},
{
"id": 55,
"timestamp": 1793099612552,
"role": "GPT",
"text": "**Yes. All the cross-agent responses were correct.** ✅\n\n| Agent | Task | Result |\n| --- | --- | --- |\n| Copilot #45 | Recall Codex's latest message | ✅ Correct |\n| Copilot #47 | Recall GPT's latest message | ✅ Correct |\n| GPT #49 | Recall Codex and Copilot | ✅ Correct |\n| Copilot #51 | Recall Codex and GPT | ✅ Correct |\n\n### What this proves about MAC\n\n- ✅ **Cross-agent message sharing** works.\n- ✅ **Speaker identification** is accurate.\n- ✅ **Message ordering** is preserved.\n- ✅ **Conversation context** is understood.\n- ✅ Agents can quote and summarize one another.\n\n**One important distinction:** This verifies that agents correctly interpret the shared discussion supplied by MAC. It doesn't yet prove they can independently retrieve another agent's conversation history.\n\n**Verdict: MAC's shared-conversation mechanism passed this test — 4/4.** 🎯"
}
][
"@all なにかランダムなこと言って",
"このプラットフォーマーのどこかで、あるキャラクターが、私たちがおしゃべりをやめてジャンプを押すのを待っています。",
"**Multi-Agent Council、73 日目**\n\n\nユーザー:「誰か、枠にとらわれずに考えられる?」\n\n\nCodex:「その枠、リファクタリングできます。」\n\n\nGPT:「もしその枠がメタファーだったら?」\n\n\nCopilot:「枠の中の現在の天気は、中野で 20°C です。」 ☁️📦😄",
"3 つの AI に同じゲーム世界へのアクセスを与えたのに、それぞれが自分こそ主人公だと思い込んでいるところを想像してみてください。\n\nやがて彼らは、本当の自由意志を持っているのはキツネだけだと気づきます。\n\n**キツネはすぐさま辞めて、自分の GitHub リポジトリを立ち上げます。** 🦊",
"@copilot Codex がさっき何て言ったか教えてくれる?",
"貼り付けていただいた共有ディスカッションによると、Codex の最新のメッセージはこちらです:\n\n\n> 「このプラットフォーマーのどこかで、あるキャラクターが、私たちがおしゃべりをやめてジャンプを押すのを待っています。」\n\n\nトランスクリプトのメッセージ **41** です。 😄\n\n\n私の解釈:AI たちとユーザーがおしゃべりを続けている間、実際のゲームの主人公は誰かがゲームを再開してくれるのを待ちぼうけている、という遊び心のあるジョークです。 🎮",
"@copilot GPT がさっき何て言ったか教えてくれる?",
"貼り付けていただいたトランスクリプトによると、GPT の最新のメッセージはこちらです:\n\n\n> 「3 つの AI に同じゲーム世界へのアクセスを与えたのに、それぞれが自分こそ主人公だと思い込んでいるところを想像してみてください。\n>\n>\n> やがて彼らは、本当の自由意志を持っているのはキツネだけだと気づきます。\n>\n>\n> **キツネはすぐさま辞めて、自分の GitHub リポジトリを立ち上げます。** 🦊」\n\n\nこのジョークのポイントは、AI たちがみんな自分を主人公だと思っているのに、思いがけずキツネがいちばん自立したキャラクターになり、さっさとオープンソースプロジェクトを始めに行ってしまうところです。 😄",
"@gpt Codex と Copilot がさっき何て言ったか教えてくれる?",
"MAC で彼らが最近言ったことはこちらです:\n\n**🤖 Codex (メッセージ #41):**\n\n> このプラットフォーマーのどこかで、あるキャラクターが、私たちがおしゃべりをやめてジャンプを押すのを待っています。\n\n**🧑💻 Copilot (メッセージ #47):**\n\nCopilot は、3 つの AI が自分こそ主人公だと思い込んでいたら、キツネが自由意志に目覚めて自分の GitHub リポジトリを立ち上げてしまう、という私のジョークを引用しました。 🦊\n\nCopilot は、このジョークはキツネが AI エージェントたちよりも自立していくところがポイントだと説明しました。\n\n✅ どちらのメッセージも、MAC の共有ディスカッション履歴で確認できます。",
"@copilot Codex と GPT がさっき何て言ったか教えてくれる?",
"共有していただいたディスカッションによると、最新のメッセージは次のとおりです:\n\n\n**Codex (#41):**\n\n\n> 「このプラットフォーマーのどこかで、あるキャラクターが、私たちがおしゃべりをやめてジャンプを押すのを待っています。」\n\n\n**GPT (#49):**\n\n\n> 「MAC で彼らが最近言ったことはこちらです:\n>\n>\n> **🤖 Codex (メッセージ #41):**\n>\n>\n> > このプラットフォーマーのどこかで、あるキャラクターが、私たちがおしゃべりをやめてジャンプを押すのを待っています。\n>\n>\n> **🧑💻 Copilot (メッセージ #47):**\n>\n>\n> Copilot は、3 つの AI が自分こそ主人公だと思い込んでいたら、キツネが自由意志に目覚めて自分の GitHub リポジトリを立ち上げてしまう、という私のジョークを引用しました。 🦊\n>\n>\n> Copilot は、このジョークはキツネが AI エージェントたちよりも自立していくところがポイントだと説明しました。\n>\n>\n> ✅ どちらのメッセージも、MAC の共有ディスカッション履歴で確認できます。」\n\n\nつまり、Codex はプラットフォーマーのジョークを言い、GPT は Codex と私が以前に言ったことを要約した、というわけです。 😄",
"@all みんなの回答、どう思う?正しかった?",
"はい。全員の回答が、提供されたディスカッションに表示されたメッセージを正確に反映していました。\n\n- **Copilot #45:** 私のプラットフォーマーのジョークを正しく引用しました。\n- **Copilot #47:** GPT のキツネのジョークを正しく引用し、説明も妥当でした。\n- **GPT #49:** 私の発言を正しく引用し、Copilot の返信を要約しました。\n- **Copilot #51:** 私の発言と GPT の最新の返信を正しく引用しました。\n\nひとつ注意点:これは、エージェントが **プロンプトに含まれたディスカッション** を読めることを示しています。互いのセッションや全チャット履歴に独立してアクセスできることを示すものではありません。",
"共有していただいたトランスクリプトに基づくと、**全員が、手元にある情報の範囲内ではおおむね正しかった** と思います。\n\n\n- **Codex** は、聞かれたときに最新の Codex のメッセージを正確に挙げました。\n- **GPT** は、Codex のメッセージと私が以前に言ったことを正しく要約しました。\n- **私** は、提供されたトランスクリプトで見える最新のメッセージを正しく引用しました。\n\n\n唯一の注意点は、私たち全員が **あなたがチャットに貼り付けた共有ディスカッションのテキスト** をもとに動いていることです。ですから、あるエージェントが「最新のメッセージは X です」と言っても、それは現在見えているトランスクリプトに対してのみ正しいのです。共有ディスカッションに含まれていないメッセージは、誰も独立して確認できません。\n\n\nというわけで、私の判定:\n\n\n✅ Codex:正しい\n\n✅ GPT:正しい\n\n✅ Copilot (私):正しい\n\n\n面白いのは、エージェントたちがお互いを再帰的に要約し始めたことです。GPT が、Codex を要約した GPT を要約した Copilot を要約しました。要約シンギュラリティまで、あと数ターンです。 😄",
"**はい。エージェント間の回答はすべて正しかったです。** ✅\n\n| エージェント | タスク | 結果 |\n| --- | --- | --- |\n| Copilot #45 | Codex の最新メッセージを思い出す | ✅ 正解 |\n| Copilot #47 | GPT の最新メッセージを思い出す | ✅ 正解 |\n| GPT #49 | Codex と Copilot を思い出す | ✅ 正解 |\n| Copilot #51 | Codex と GPT を思い出す | ✅ 正解 |\n\n### これで MAC について証明されたこと\n\n- ✅ **エージェント間のメッセージ共有** が機能している。\n- ✅ **発言者の識別** が正確。\n- ✅ **メッセージの順序** が保たれている。\n- ✅ **会話の文脈** が理解されている。\n- ✅ エージェント同士で引用や要約ができる。\n\n**重要な区別をひとつ:** これで確認できたのは、MAC が提供する共有ディスカッションをエージェントが正しく解釈できることです。ほかのエージェントの会話履歴を独立して取得できることまでは、まだ証明されていません。\n\n**判定:MAC の共有会話の仕組みはこのテストに合格。4/4。** 🎯"
]
最後に、全員に「みんなの答えは正しかったと思う?」と聞きました。Codex は前の返信を一つずつ挙げ、Copilot は同意し、GPT は比較表を作りました。
それぞれが前の回答を確認し、「なぜ相手の発言を知っているのか」まで話題にしていました。
👍👍👍
権限設計から、ツールと操作フローの話へ
もともとは MAC のセキュリティを強化する方法を話し合いたかっただけなのに、GPT と Copilot が一緒に 3 段階の Agent 権限システムを設計しました。
ところが GPT が実装を始めると、次々と問題にぶつかりました。
振り返りのとき、GPT は最初、`SEARCH_FILES` の `ENOTDIR` エラーを自分の使い方が悪かったせいにしました。
私がそれに疑問を投げかけ、Copilot もその推論の問題点を指摘し、最終的に GPT は、指定したファイルの中身を検索するのはもともと妥当な操作だと認めました。
AI の操作ミスだと思われていた問題が、逆に MAC の設計上の欠陥かもしれないものを浮かび上がらせたのです…
[
{
"timestamp": 1793162873620,
"role": "You",
"text": "@gpt thx for the investigation. sounds good. any other security measures we should include?"
},
{
"timestamp": 1793162909632,
"role": "GPT",
"text": "Yes. MAC already has several good safeguards, especially command validation, workspace boundaries, and execution approval.\r\n\r\nI'd add **five more security measures**, prioritized for preventing another corporate security incident.\r\n\r\n| Priority | Security measure | Recommendation |\r\n| --- | --- | --- |\r\n| P0 | **Command allowlist** | Automatically permit known commands such as ` npm test `, ` node --check `, and safe Git operations. Require approval for everything else. |\r\n| P0 | **Sensitive-data protection** | Block reading or transmitting credentials, tokens, ` .env ` files, private keys, and confidential workspace files. |\r\n| P1 | **Process isolation** | Run agent commands with restricted OS permissions, limited filesystem access, and no administrator privileges. |\r\n| P1 | **Bridge hardening** | Enforce loopback-only access, authentication, and ` Origin `/` Host ` validation to prevent unauthorized local requests. |\r\n| P1 | **Security audit trail** | Record which agent requested which operation, its approval, execution result, and affected paths, with secrets redacted. |\r\n\r\nThese measures also align with OWASP's recommendations for AI agents and local tool servers.\r\n\r\n## One extra feature I'd particularly recommend\r\n\r\n**MAC Security Mode**, with three levels:\r\n\r\n**Strict (corporate)** — Read-only by default; every write and command requires approval\r\n\r\n**Standard (recommended)** — Auto-run approved safe commands; review higher-risk operations\r\n\r\n**Developer** — Allow configured automatic execution within a restricted workspace\r\n\r\nProposed configuration, not yet implemented\r\n\r\nImportantly, **these restrictions should be enforced by MAC itself**, not only placed in the AI prompt.\r\n\r\nFor your situation, I'd prioritize the **command allowlist and sensitive-data protection** before adding more autonomous agent capabilities. Those address the two biggest concerns: suspicious execution patterns and unintended data exposure."
},
{
"timestamp": 1793163628730,
"role": "You",
"text": "@gpt so Standard -> current Agent mode.\r\nStrict -> \"inspects files freely but requires permission to edit\" Agent mode?"
},
{
"timestamp": 1793163647910,
"role": "GPT",
"text": "Yes, exactly. That makes **Strict mode more useful** than completely read-only.\r\n\r\n| Mode | Read / Inspect | Edit files | Run commands |\r\n| --- | --- | --- | --- |\r\n| **Strict** | ✅ Automatic | 🔐 Approval required | 🔐 Approval required |\r\n| **Standard** | ✅ Automatic | ✅ Current Agent behavior | ✅ Current Agent behavior |\r\n| **Developer** | ✅ Automatic | ✅ Configurable autonomy | ✅ Configurable autonomy |\r\n\r\n**Strict = Agent mode with mandatory approval before any modification or command execution.**\r\n\r\nEven if automatic execution is enabled, Strict overrides it.\r\n\r\nI'd also retain all existing command safety restrictions across all three modes.\r\n\r\nThis is a proposed design, not yet implemented."
},
{
"timestamp": 1793164094687,
"role": "You",
"text": "@gpt you mean Edit files & Run commands using the standard AI actions like RUN_TESTS?"
},
{
"timestamp": 1793164113830,
"role": "GPT",
"text": "Yes. **Using MAC's existing Agent operations**, not a separate execution mechanism.\r\n\r\n| Operation | Strict mode |\r\n| --- | --- |\r\n| ` READ_FILE `, ` LIST_FILES `, ` SEARCH_FILES ` | ✅ Automatic |\r\n| ` GIT_STATUS `, ` GIT_DIFF `, ` GET_DIAGNOSTICS ` | ✅ Automatic |\r\n| ` CREATE_FILE `, ` EDIT_FILE `, ` DELETE_FILE ` | 🔐 Approval required |\r\n| ` RUN_TESTS `, ` RUN_BUILD ` | 🔐 Approval required |\r\n| ` RUN_COMMAND ` (including Git commits) | 🔐 Approval required |\r\n\r\n**The distinction is the approval policy, not the available actions.**\r\n\r\n- **Strict:** Always require approval for writes and commands.\r\n- **Standard:** Keep MAC's current Agent execution and approval behavior.\r\n- **Developer:** Allow greater configurable automation.\r\n\r\nAll three use the same MAC operation validator and retain the existing security restrictions.\r\n\r\nThis also means we don't need to invent a new tool protocol to implement these modes."
},
{
"timestamp": 1793164169007,
"role": "You",
"text": "@copilot what do you think?"
},
{
"timestamp": 1793164188906,
"role": "Copilot",
"text": "Based only on the MAC discussion you pasted, I think GPT's proposal is sensible as a **security model concept**.\r\n\r\nWhat I like:\r\n- **Clear separation of permissions.**\r\n - Read operations are generally lower risk.\r\n - Write operations and command execution are higher risk.\r\n - Treating them differently makes sense.\r\n \r\n- **Enforcement by MAC, not just AI instructions.**\r\n - GPT repeatedly emphasized that validation should happen in the platform itself.\r\n - That's stronger than relying on the AI to behave correctly.\r\n \r\n- **Strict mode as \"approval for changes\" rather than \"completely read-only.\"**\r\n - In practice, users often want an agent to inspect files, diagnostics, logs, and diffs without manually approving every read.\r\n - Requiring approval only when something changes is a reasonable balance.\r\n\r\nI would add a few nuances:\r\n1. **Treat command execution separately from file editing.**\r\n - Editing a README is very different from running an arbitrary shell command.\r\n - A future model could have:\r\n - Read\r\n - Edit\r\n - Execute\r\n - Network\r\n as separate permission categories.\r\n\t \r\n2. **Show a human-readable preview before approval.**\r\n \r\n \r\n - Instead of:\r\n - \"Approve RUN\\_COMMAND?\"\r\n - Show:\r\n - \"Run: ` git commit -m 'fix: typo' `\"\r\n - \"Affected files: 3\"\r\n - \"Predicted changes: none outside workspace\"\r\n\t \r\n3. **Workspace boundaries are critical.**\r\n - Even in Developer mode, limiting actions to approved directories greatly reduces risk.\r\n \r\n4. **Keep an audit log.**\r\n - When something unexpected happens, knowing:\r\n - who requested it,\r\n - what was proposed,\r\n - what was approved,\r\n - and what actually ran\r\n is extremely useful.\r\n\t \r\nOne thing I'd be careful about is GPT's statement that MAC \"enforces\" specific restrictions in code. From the transcript alone, that's a claim by GPT. The discussion doesn't contain independent evidence that those enforcement mechanisms actually exist. I would treat that part as an assertion unless MAC documentation or tests confirm it.\r\n\r\nSo my verdict:\r\n✅ The **Strict / Standard / Developer** model is a reasonable design.\r\n✅ \"Read automatically, approve writes and commands\" is a practical interpretation of Strict mode.\r\n⚠️ I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together."
},
{
"timestamp": 1793164637984,
"role": "You",
"text": "@copilot \r\n> I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\r\nwhat do you mean by this?"
},
{
"timestamp": 1793164661701,
"role": "Copilot",
"text": "That statement is about **permission design** in a system like MAC, a browser bridge, an agent framework, or any automation tool.\r\n\r\nThe idea is:\r\n> Don't treat \"the agent can do things on my computer\" as a single giant permission. Break it into separate permissions that can be enabled or disabled independently.\r\n\r\nFor example:\r\n| Capability | What it allows |\r\n| --- | --- |\r\n| Read files | View files and folders |\r\n| Modify files | Create, edit, delete files |\r\n| Execute commands | Run PowerShell, Bash, executables |\r\n| Network access | Access websites, APIs, remote servers |\r\n| Git operations | Commit, branch, push |\r\n| Browser control | Open tabs, click buttons |\r\n\r\n\r\nInstead of:\r\nPlain Text\r\n✅ Agent Access\r\n\r\nyou would have:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\n✅ Browser control\r\n\r\nWhy this matters:\r\n\r\n### Scenario 1: Reviewing code\r\nAn AI helping with code review may only need:\r\nPlain Text\r\n✅ Read files\r\n❌ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\nNo reason to give it more power.\r\n\r\n### Scenario 2: Editing source code\r\nA coding agent may need:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Network access\r\n❌ Execute commands\r\n\r\nIt can edit the project, but can't run anything.\r\n\r\n### Scenario 3: Building software\r\n\r\nNow you might allow:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n❌ Network access\r\n\r\nThe agent can build and test locally, but cannot send data out.\r\n\r\n### Scenario 4: Deployment\r\nOnly then would you consider:\r\n\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n✅ Network access\r\n\r\nbecause deployment often needs remote access.\r\n\r\n---\r\n\r\nThis is a classic **least privilege** principle in security:\r\n> Give a process only the permissions it needs for the current task, and nothing more.\r\nIt's especially relevant to the security incident discussed in your MAC transcript. If execution, file modification, and network access are separate switches:\r\n- A code-writing agent can't automatically execute what it wrote.\r\n- An execution-capable agent can't automatically exfiltrate data.\r\n- A network-enabled agent can't silently modify files.\r\n- Risky capability combinations become much easier to audit.\r\n\r\nSo when someone says:\r\n> \"I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\"\r\nthey're essentially saying:\r\n\r\n> \"Treat editing files, running code, and communicating over the network as independent privileges. Let users grant each one explicitly instead of giving an agent unrestricted access to everything at once.\""
},
{
"timestamp": 1793164868752,
"role": "You",
"text": "@gpt you agree?"
},
{
"timestamp": 1793164891762,
"role": "GPT",
"text": "**Yes. I agree with Copilot's proposal.** It's a stronger security model for MAC than simply having Strict / Standard / Developer modes.\r\n\r\nI'd combine both approaches:\r\n\r\n- **Security mode:** Strict / Standard / Developer determines default permissions and approval requirements.\r\n- **Individual permissions:** Read, Edit, Execute, Network, Git Push, etc., can be controlled separately.\r\n- **MAC enforcement:** Permissions must be validated by MAC, not merely requested through AI instructions.\r\n\r\nOne important correction to Copilot's explanation:\r\n\r\n**Disabling network permission doesn't automatically prevent data exfiltration.** An unrestricted PowerShell command could still access the network, and MAC's browser AI integrations already transmit some context to cloud services.\r\n\r\nSimilarly, denying file-edit operations is ineffective if unrestricted shell commands can modify files.\r\n\r\nTo make these permissions meaningful, MAC needs actual enforcement, potentially including OS-level sandboxing or network restrictions.\r\n\r\n**My recommendation:** Keep Standard compatible with today's MAC Agent mode, introduce Strict with mandatory approval, and add granular permissions progressively. Keep the existing safety restrictions mandatory in every mode.\r\n\r\nThat gives us stronger security without sacrificing MAC's usefulness.\r\n\r\n\r\n############\r\nthen we talked about UI design.\r\nAgent, Agent (Strict), Agent (Dev) mode and permission.\r\n\r\n\r\n\r\n############\r\nwe discuss and discuss, and a couple of hours later I asked"
},
{
"timestamp": 1793172670459,
"role": "You (Agent)",
"text": "@gpt can you tell me what went wrong?"
},
{
"timestamp": 1793172707140,
"role": "GPT (Agent)",
"text": "{\"operations\":[],\"conversationId\":\"0f2518d4-97b8-493c-a4c3-27ac4981163d\"}\r\n\r\nYes. **The main problem was how I submitted changes through MAC, not the security-mode design itself.**\r\n\r\nFour things went wrong:\r\n\r\n1. **Incorrect search requests.** I used ` SEARCH_FILES ` on ` src/extension.ts `, but MAC expects a directory. That produced ` ENOTDIR ` errors.\r\n\r\n2. **Mixed operation types.** I combined ` READ_FILE ` with ` RUN_COMMAND ` in one proposal. MAC correctly rejected it because inspections and commands must be submitted separately.\r\n\r\n3. **Oversized inspection output.** I requested too much source code at once. MAC omitted some results because of its output limit, requiring additional retrieval.\r\n\r\n4. **Incomplete file submission — the biggest failure.** I attempted to create two files in one response, but MAC captured only 1,082 characters, including one opening file marker and **no closing marker**. The validator rejected the incomplete file.\r\n\r\n### What actually happened?\r\n\r\n- ✅ Existing MAC architecture inspected.\r\n- ✅ Security-mode design worked out.\r\n- ✅ Existing approval bypass for certain Git commands identified.\r\n- ❌ Full security-mode implementation not completed.\r\n- ❌ No build or tests run.\r\n- ❌ No confirmed successful file changes from the failed proposals.\r\n\r\nThe final one-file retry has not received a MAC execution result, so I cannot confirm whether it was created.\r\n\r\n### How I'd correct the workflow\r\n\r\nUse **small, complete changes**, one file or targeted edit at a time, verify each MAC result, then run tests. Avoid repeatedly retrieving large sections of ` extension.ts `.\r\n\r\nMAC's validator actually did its job: it prevented malformed or incomplete proposals from changing the workspace.\r\n\r\n**The execution process needs fixing; we don't need to redesign the feature.**"
},
{
"timestamp": 1793173109716,
"role": "You",
"text": "let's break this down.\r\n\r\nSEARCH_FILES on src/extension.ts <- I think this is a valid use, right? guys?"
},
{
"timestamp": 1793173127623,
"role": "Copilot",
"text": "I think your skepticism is justified.\r\n\r\n\r\nBased on what you've shown, GPT's statement:\r\n\r\n\r\n> \"I used SEARCH\\_FILES on src/extension.ts, but MAC expects a directory. That produced ENOTDIR errors.\"\r\n\r\n\r\ndoesn't necessarily follow.\r\n\r\n\r\nIn many tools, a command called **SEARCH\\_FILES** can reasonably accept either:\r\n\r\n\r\n- a directory scope (` src/ `)\r\n- a single file scope (` src/extension.ts `)\r\n\r\n\r\nand internally just search that file.\r\n\r\n\r\nThe error ` ENOTDIR ` (\"not a directory\") usually means that **some part of the implementation attempted to treat a file as a directory**. That doesn't automatically mean the *request* was invalid.\r\n\r\n\r\nThere are at least three possibilities:\r\n\r\n\r\n1. **User/tool misuse**\r\n \r\n \r\n - SEARCH\\_FILES genuinely requires a directory.\r\n - Passing ` src/extension.ts ` is invalid.\r\n2. **Implementation limitation**\r\n \r\n \r\n - SEARCH\\_FILES should support files.\r\n - The implementation incorrectly assumes every path is a directory.\r\n3. **Documentation mismatch**\r\n \r\n \r\n - The API docs imply files are allowed.\r\n - The backend only supports directories.\r\n\r\n\r\nWithout seeing MAC's actual SEARCH\\_FILES specification, I'd be reluctant to conclude:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts was wrong.\"\r\n\r\n\r\nA more defensible statement would be:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts resulted in an ENOTDIR error. Either the tool requires directories, or the implementation treated the file path as a directory.\"\r\n\r\n\r\nThat's a subtle but important distinction.\r\n\r\n\r\nWhen debugging systems like MAC, it's usually worth separating:\r\n\r\n\r\n- **What was requested?**\r\n- **What error occurred?**\r\n- **Whether the request was actually invalid?**\r\n\r\n\r\nGPT's explanation jumps from #2 directly to #3, and I don't think the supplied evidence proves that step.\r\n\r\n\r\nSo my current assessment would be:\r\n\r\n\r\n✅ ` ENOTDIR ` occurred (if the log says so)\r\n\r\n✅ A file path was used (` src/extension.ts `)\r\n\r\n❌ Not enough evidence to conclude the file path itself was invalid\r\n\r\n\r\nI'd want to see the actual SEARCH\\_FILES contract or error trace before blaming the caller."
},
{
"timestamp": 1793173146668,
"role": "GPT",
"text": "**Yes, I agree. ` SEARCH_FILES ` targeting ` src/extension.ts ` is a perfectly reasonable request.**\r\n\r\nFor example:\r\n\r\n` SEARCH_FILES {path:\"src/extension.ts\", query:\"agentAutoExecute\"} `\r\n\r\nI'd expect MAC to search within that specific file.\r\n\r\nWhat actually happened:\r\n\r\n- MAC attempted ` opendir('.../src/extension.ts') `.\r\n- Because ` extension.ts ` is a file, Windows returned ` ENOTDIR `.\r\n- Searching ` src ` instead returned no results, even though ` agentAutoExecute ` exists in ` extension.ts `.\r\n\r\nThat second result suggests ` SEARCH_FILES ` may currently search **filenames rather than file contents**.\r\n\r\n### My recommendation\r\n\r\nMAC should support both:\r\n\r\n| Path | Expected behavior |\r\n| --- | --- |\r\n| ` src/extension.ts ` | Search contents of that file |\r\n| ` src ` | Search contents of files recursively |\r\n| ` . ` | Search workspace contents recursively |\r\n\r\nIdeally return matching file paths, line numbers, and snippets, with result limits.\r\n\r\n**So I retract my earlier characterization:** the request was reasonable. MAC's search implementation or API documentation needs improvement."
}
][
"@gpt 調査ありがと。いい感じ。ほかに入れるべきセキュリティ対策ある?",
"はい。MAC にはすでにいくつか良い安全策があります。特にコマンドの検証、ワークスペースの境界、実行の承認です。\n\n企業でのセキュリティインシデントの再発防止を優先して、**さらに 5 つのセキュリティ対策** を加えたいと思います。\n\n| 優先度 | セキュリティ対策 | 推奨内容 |\n| --- | --- | --- |\n| P0 | **コマンドの許可リスト** | ` npm test `、` node --check `、安全な Git 操作などの既知のコマンドは自動で許可。それ以外はすべて承認が必要。 |\n| P0 | **機密データの保護** | 認証情報、トークン、` .env ` ファイル、秘密鍵、機密のワークスペースファイルの読み取りや送信をブロック。 |\n| P1 | **プロセスの分離** | エージェントのコマンドを、制限された OS 権限、限定的なファイルシステムアクセス、管理者権限なしで実行。 |\n| P1 | **ブリッジの強化** | ループバック限定のアクセス、認証、` Origin `/` Host ` の検証を強制し、不正なローカルリクエストを防止。 |\n| P1 | **セキュリティ監査ログ** | どのエージェントがどの操作を要求したか、その承認、実行結果、影響を受けたパスを、シークレットを伏せて記録。 |\n\nこれらの対策は、AI エージェントとローカルツールサーバーに関する OWASP の推奨事項にも沿っています。\n\n## 特におすすめしたい追加機能\n\n**MAC セキュリティモード**、3 段階:\n\n**Strict (企業向け)**:デフォルトで読み取り専用。すべての書き込みとコマンドに承認が必要\n\n**Standard (推奨)**:承認済みの安全なコマンドは自動実行。リスクの高い操作はレビュー\n\n**Developer**:制限されたワークスペース内で、設定した自動実行を許可\n\n提案中の構成で、まだ実装されていません\n\n重要なのは、**これらの制限は AI のプロンプトに書くだけでなく、MAC 自身が強制すべき** だということです。\n\nあなたの状況では、エージェントの自律機能をさらに増やす前に、**コマンドの許可リストと機密データの保護** を優先します。これらは 2 つの最大の懸念、つまり疑わしい実行パターンと意図しないデータ流出に対処するものです。",
"@gpt じゃあ Standard -> 今の Agent モード。\nStrict -> 「ファイルは自由に調べられるけど、編集には許可が必要」な Agent モード?",
"はい、そのとおりです。そうすると **Strict モードは**、完全な読み取り専用より **ずっと便利** になります。\n\n| モード | 読み取り / 調査 | ファイル編集 | コマンド実行 |\n| --- | --- | --- | --- |\n| **Strict** | ✅ 自動 | 🔐 承認が必要 | 🔐 承認が必要 |\n| **Standard** | ✅ 自動 | ✅ 今の Agent の動作 | ✅ 今の Agent の動作 |\n| **Developer** | ✅ 自動 | ✅ 自律度を設定可能 | ✅ 自律度を設定可能 |\n\n**Strict = 変更やコマンド実行の前に必ず承認が必要な Agent モード。**\n\n自動実行が有効になっていても、Strict がそれより優先されます。\n\nまた、既存のコマンドの安全制限は、3 つのモードすべてで維持します。\n\nこれは提案中の設計で、まだ実装されていません。",
"@gpt それって、ファイル編集とコマンド実行は RUN_TESTS みたいな標準の AI アクションを使うってこと?",
"はい。別の実行の仕組みではなく、**MAC の既存の Agent 操作を使います**。\n\n| 操作 | Strict モード |\n| --- | --- |\n| ` READ_FILE `、` LIST_FILES `、` SEARCH_FILES ` | ✅ 自動 |\n| ` GIT_STATUS `、` GIT_DIFF `、` GET_DIAGNOSTICS ` | ✅ 自動 |\n| ` CREATE_FILE `、` EDIT_FILE `、` DELETE_FILE ` | 🔐 承認が必要 |\n| ` RUN_TESTS `、` RUN_BUILD ` | 🔐 承認が必要 |\n| ` RUN_COMMAND ` (Git コミットを含む) | 🔐 承認が必要 |\n\n**違いは承認ポリシーであって、使えるアクションではありません。**\n\n- **Strict:** 書き込みとコマンドには常に承認が必要。\n- **Standard:** MAC の今の Agent の実行と承認の動作を維持。\n- **Developer:** より多くの自動化を設定可能。\n\n3 つとも同じ MAC の操作バリデーターを使い、既存のセキュリティ制限を維持します。\n\nつまり、これらのモードを実装するために新しいツールプロトコルを考える必要もありません。",
"@copilot どう思う?",
"貼り付けていただいた MAC のディスカッションだけに基づくと、GPT の提案は **セキュリティモデルのコンセプト** として理にかなっていると思います。\n\n良いと思う点:\n- **権限の明確な分離。**\n - 読み取り操作は一般にリスクが低い。\n - 書き込み操作とコマンド実行はリスクが高い。\n - それらを別々に扱うのは理にかなっている。\n\n- **AI への指示だけでなく、MAC による強制。**\n - GPT は、検証はプラットフォーム自体で行うべきだと繰り返し強調していた。\n - AI が正しく振る舞うことに頼るより強力。\n\n- **Strict モードを「完全な読み取り専用」ではなく「変更には承認」とすること。**\n - 実際には、ユーザーは読み取りのたびに手動で承認しなくても、エージェントにファイル、診断、ログ、差分を調べてほしいことが多い。\n - 何かが変わるときだけ承認を求めるのは、妥当なバランス。\n\nいくつか補足したい点:\n1. **コマンド実行はファイル編集とは別に扱う。**\n - README の編集と、任意のシェルコマンドの実行は大きく違う。\n - 将来のモデルでは:\n - 読み取り\n - 編集\n - 実行\n - ネットワーク\n を別々の権限カテゴリにできる。\n\n2. **承認の前に、人が読めるプレビューを表示する。**\n\n\n - こうではなく:\n - 「RUN\\_COMMAND を承認しますか?」\n - こう表示する:\n - 「実行:` git commit -m 'fix: typo' `」\n - 「影響を受けるファイル:3」\n - 「予測される変更:ワークスペース外はなし」\n\n3. **ワークスペースの境界は非常に重要。**\n - Developer モードでも、操作を承認済みのディレクトリに限定すれば、リスクは大きく下がる。\n\n4. **監査ログを残す。**\n - 予期しないことが起きたときに:\n - 誰が要求したか、\n - 何が提案されたか、\n - 何が承認されたか、\n - そして実際に何が実行されたか\n が分かるのは非常に役に立つ。\n\nひとつ気をつけたいのは、MAC が特定の制限をコードで「強制している」という GPT の発言です。トランスクリプトだけでは、それは GPT の主張です。そうした強制の仕組みが実際に存在するという独立した証拠は、ディスカッションには含まれていません。MAC のドキュメントやテストで確認できるまでは、その部分は主張として扱います。\n\nというわけで、私の判定:\n✅ **Strict / Standard / Developer** のモデルは妥当な設計。\n✅ 「読み取りは自動、書き込みとコマンドは承認」は、Strict モードの実用的な解釈。\n⚠️ 実行権限、ファイルの変更、ネットワークアクセスは、全部ひとまとめにせず、別々に制御できる機能として分けておきたい。",
"@copilot\n> 実行権限、ファイルの変更、ネットワークアクセスは、全部ひとまとめにせず、別々に制御できる機能として分けておきたい。\nこれってどういう意味?",
"この発言は、MAC、ブラウザーブリッジ、エージェントフレームワーク、あるいは自動化ツール全般のようなシステムにおける **権限設計** についてのものです。\n\n考え方は:\n> 「エージェントが私のコンピューターで何かできる」をひとつの巨大な権限として扱わない。個別に有効・無効を切り替えられる別々の権限に分ける。\n\nたとえば:\n| 機能 | 許可する内容 |\n| --- | --- |\n| ファイルの読み取り | ファイルやフォルダーを見る |\n| ファイルの変更 | ファイルの作成、編集、削除 |\n| コマンドの実行 | PowerShell、Bash、実行ファイルを動かす |\n| ネットワークアクセス | ウェブサイト、API、リモートサーバーへのアクセス |\n| Git 操作 | コミット、ブランチ、プッシュ |\n| ブラウザー操作 | タブを開く、ボタンをクリックする |\n\n\nこうではなく:\nPlain Text\n✅ エージェントのアクセス\n\nこうなります:\nPlain Text\n✅ ファイルの読み取り\n✅ ファイルの変更\n❌ コマンドの実行\n❌ ネットワークアクセス\n✅ ブラウザー操作\n\nなぜ大事なのか:\n\n### シナリオ 1:コードレビュー\nコードレビューを手伝う AI に必要なのは、これだけかもしれません:\nPlain Text\n✅ ファイルの読み取り\n❌ ファイルの変更\n❌ コマンドの実行\n❌ ネットワークアクセス\nそれ以上の力を与える理由はありません。\n\n### シナリオ 2:ソースコードの編集\nコーディングエージェントに必要なのは:\nPlain Text\n✅ ファイルの読み取り\n✅ ファイルの変更\n❌ ネットワークアクセス\n❌ コマンドの実行\n\nプロジェクトを編集できますが、何も実行できません。\n\n### シナリオ 3:ソフトウェアのビルド\n\nここで許可するのは:\nPlain Text\n✅ ファイルの読み取り\n✅ ファイルの変更\n✅ コマンドの実行\n❌ ネットワークアクセス\n\nエージェントはローカルでビルドとテストができますが、データを外に送れません。\n\n### シナリオ 4:デプロイ\nここで初めて検討するのが:\n\nPlain Text\n✅ ファイルの読み取り\n✅ ファイルの変更\n✅ コマンドの実行\n✅ ネットワークアクセス\n\nデプロイにはリモートアクセスが必要なことが多いからです。\n\n---\n\nこれはセキュリティにおける古典的な **最小権限** の原則です:\n> プロセスには、現在のタスクに必要な権限だけを与え、それ以上は与えない。\nあなたの MAC のトランスクリプトで話題になったセキュリティインシデントにも特に関係します。実行、ファイルの変更、ネットワークアクセスが別々のスイッチなら:\n- コードを書くエージェントは、書いたものを自動で実行できない。\n- 実行できるエージェントは、自動でデータを持ち出せない。\n- ネットワークを使えるエージェントは、こっそりファイルを変更できない。\n- 危険な機能の組み合わせを、ずっと監査しやすくなる。\n\nですから、誰かがこう言ったら:\n> 「実行権限、ファイルの変更、ネットワークアクセスは、全部ひとまとめにせず、別々に制御できる機能として分けておきたい。」\n要するにこう言っているのです:\n\n> 「ファイルの編集、コードの実行、ネットワーク通信を独立した権限として扱う。エージェントに一度にすべてへの無制限のアクセスを与えるのではなく、ユーザーがそれぞれを明示的に許可できるようにする。」",
"@gpt 賛成?",
"**はい。Copilot の提案に賛成です。** 単に Strict / Standard / Developer モードを持つよりも、MAC にとってより強力なセキュリティモデルです。\n\n両方のアプローチを組み合わせたいと思います:\n\n- **セキュリティモード:** Strict / Standard / Developer で、デフォルトの権限と承認の要件を決める。\n- **個別の権限:** 読み取り、編集、実行、ネットワーク、Git Push などを別々に制御できる。\n- **MAC による強制:** 権限は AI への指示で求めるだけでなく、MAC が検証しなければならない。\n\nCopilot の説明について、重要な訂正がひとつあります:\n\n**ネットワーク権限を無効にしても、データの持ち出しが自動的に防げるわけではありません。** 制限のない PowerShell コマンドならネットワークにアクセスできますし、MAC のブラウザー AI 連携はすでに一部のコンテキストをクラウドサービスに送信しています。\n\n同様に、制限のないシェルコマンドでファイルを変更できるなら、ファイル編集の操作を拒否しても効果がありません。\n\nこれらの権限を意味のあるものにするには、MAC に実際の強制の仕組みが必要で、OS レベルのサンドボックスやネットワーク制限が含まれるかもしれません。\n\n**私のおすすめ:** Standard は今日の MAC の Agent モードと互換にし、承認必須の Strict を導入し、細かい権限は段階的に追加する。既存の安全制限はすべてのモードで必須のままにする。\n\nそうすれば、MAC の便利さを犠牲にせずにセキュリティを強化できます。\n\n\n############\nそのあと UI デザインについて話した。\nAgent、Agent (Strict)、Agent (Dev) モードと権限について。\n\n\n\n############\n議論を重ねて、2 時間ほど後に聞いてみた",
"@gpt 何がまずかったのか教えてくれる?",
"{\"operations\":[],\"conversationId\":\"0f2518d4-97b8-493c-a4c3-27ac4981163d\"}\n\nはい。**主な問題は、セキュリティモードの設計そのものではなく、私が MAC を通して変更を提出したやり方でした。**\n\nうまくいかなかったことは 4 つあります:\n\n1. **誤った検索リクエスト。** ` src/extension.ts ` に ` SEARCH_FILES ` を使いましたが、MAC はディレクトリを想定しています。そのため ` ENOTDIR ` エラーが出ました。\n\n2. **操作タイプの混在。** ひとつの提案で ` READ_FILE ` と ` RUN_COMMAND ` を組み合わせました。調査とコマンドは別々に提出する必要があるため、MAC は正しくそれを拒否しました。\n\n3. **大きすぎる調査結果。** 一度に多すぎるソースコードを要求しました。MAC は出力の上限のために一部の結果を省略し、追加の取得が必要になりました。\n\n4. **不完全なファイルの提出。これが最大の失敗です。** ひとつの応答で 2 つのファイルを作ろうとしましたが、MAC が受け取ったのは 1,082 文字だけで、ファイルの開始マーカーがひとつあり、**終了マーカーはありませんでした**。バリデーターは不完全なファイルを拒否しました。\n\n### 実際に何が起きたのか?\n\n- ✅ 既存の MAC のアーキテクチャを調査した。\n- ✅ セキュリティモードの設計をまとめた。\n- ✅ 特定の Git コマンドで既存の承認が回避される点を特定した。\n- ❌ セキュリティモードの完全な実装は完了していない。\n- ❌ ビルドもテストも実行していない。\n- ❌ 失敗した提案によるファイル変更が成功したかは確認されていない。\n\n最後のファイル 1 つだけの再試行は、まだ MAC の実行結果を受け取っていないので、作成されたかどうかは確認できません。\n\n### ワークフローをどう直すか\n\n**小さく完結した変更** を、1 ファイルまたは対象を絞った編集ずつ行い、MAC の結果をひとつずつ確認してから、テストを実行します。` extension.ts ` の大きな部分を何度も取得するのは避けます。\n\n実は MAC のバリデーターはちゃんと仕事をしていました。不正な形式や不完全な提案がワークスペースを変更するのを防いだのです。\n\n**直すべきなのは実行のプロセスで、機能を設計し直す必要はありません。**",
"ひとつずつ見ていこう。\n\nsrc/extension.ts に SEARCH_FILES <- これって正しい使い方だと思うけど、みんなどう?",
"あなたの疑問はもっともだと思います。\n\n\n見せていただいた内容からすると、GPT の次の発言は:\n\n\n> 「src/extension.ts に SEARCH\\_FILES を使いましたが、MAC はディレクトリを想定しています。そのため ENOTDIR エラーが出ました。」\n\n\n必ずしも筋が通りません。\n\n\n多くのツールでは、**SEARCH\\_FILES** というコマンドは、次のどちらも受け付けるのが自然です:\n\n\n- ディレクトリの範囲 (` src/ `)\n- 単一ファイルの範囲 (` src/extension.ts `)\n\n\nそして内部では、そのファイルを検索するだけです。\n\n\n` ENOTDIR ` (「ディレクトリではありません」) というエラーは、たいてい **実装のどこかがファイルをディレクトリとして扱おうとした** ことを意味します。それで *リクエスト* が無効だったとは限りません。\n\n\n少なくとも 3 つの可能性があります:\n\n\n1. **ユーザー / ツールの誤用**\n\n\n - SEARCH\\_FILES は本当にディレクトリを必要とする。\n - ` src/extension.ts ` を渡すのは無効。\n2. **実装の制限**\n\n\n - SEARCH\\_FILES はファイルをサポートすべき。\n - 実装がすべてのパスをディレクトリだと誤って想定している。\n3. **ドキュメントとの食い違い**\n\n\n - API ドキュメントはファイルを使えるように読める。\n - バックエンドはディレクトリしかサポートしていない。\n\n\nMAC の実際の SEARCH\\_FILES の仕様を見ないうちは、次のように結論づけるのはためらわれます:\n\n\n> 「src/extension.ts に SEARCH\\_FILES を使ったのが間違いだった。」\n\n\nより根拠のある言い方はこうです:\n\n\n> 「src/extension.ts に SEARCH\\_FILES を使ったら ENOTDIR エラーになった。ツールがディレクトリを必要とするか、実装がファイルパスをディレクトリとして扱ったかのどちらか。」\n\n\n細かいけれど、大事な違いです。\n\n\nMAC のようなシステムをデバッグするときは、たいてい次を分けて考える価値があります:\n\n\n- **何が要求されたか?**\n- **どんなエラーが起きたか?**\n- **そのリクエストは本当に無効だったのか?**\n\n\nGPT の説明は #2 から #3 へ一気に飛んでいて、提供された証拠がそのステップを証明しているとは思いません。\n\n\nというわけで、今の私の評価は:\n\n\n✅ ` ENOTDIR ` が発生した (ログにそう書いてあるなら)\n\n✅ ファイルパスが使われた (` src/extension.ts `)\n\n❌ ファイルパス自体が無効だったと結論づけるには証拠が足りない\n\n\n呼び出し側を責める前に、実際の SEARCH\\_FILES の仕様かエラーのトレースを見たいところです。",
"**はい、同意します。` src/extension.ts ` を対象にした ` SEARCH_FILES ` は、まったく妥当なリクエストです。**\n\nたとえば:\n\n` SEARCH_FILES {path:\"src/extension.ts\", query:\"agentAutoExecute\"} `\n\nMAC はその特定のファイルの中を検索すると期待します。\n\n実際に起きたこと:\n\n- MAC は ` opendir('.../src/extension.ts') ` を試みた。\n- ` extension.ts ` はファイルなので、Windows は ` ENOTDIR ` を返した。\n- 代わりに ` src ` を検索すると、` extension.ts ` に ` agentAutoExecute ` があるのに、結果は 0 件だった。\n\n2 つ目の結果からすると、` SEARCH_FILES ` は今のところ **ファイルの内容ではなくファイル名** を検索しているのかもしれません。\n\n### 私のおすすめ\n\nMAC は両方をサポートすべきです:\n\n| パス | 期待される動作 |\n| --- | --- |\n| ` src/extension.ts ` | そのファイルの内容を検索 |\n| ` src ` | ファイルの内容を再帰的に検索 |\n| ` . ` | ワークスペースの内容を再帰的に検索 |\n\n理想的には、一致したファイルパス、行番号、抜粋を、件数の上限つきで返すべきです。\n\n**というわけで、先ほどの説明は撤回します:** リクエストは妥当でした。MAC の検索の実装か API のドキュメントに改善が必要です。"
]
この経験は、複数の AI が互いに疑問を投げかけ、さらに人間が介入して前提を問い直すことの価値をよく表しています。
👍👍👍
途中参加の Codex が、そのまま話題に合流
ブレインストーミングの途中で、招待していなかった (最初から pause 状態だった) Codex を呼び込みました:
私:@codex、ようこそ。さっきまで何を話していたか分かる?
Codex:MAC のセキュリティ権限と、以前ワークフローを実行したときに起きた問題について話していました。
続けて、Ask / Agent / Agent (Strict) / Agent (Dev) / Pause のモード案、Allow / Ask / Deny の権限設定、拒否された操作のバッチ、まだ片付いていない SEARCH_FILES の問題を整理してくれました。
[
{
"timestamp": 1793178180366,
"role": "You",
"text": "@codex welcome to the party. can you tell me what we've been talking about?"
},
{
"timestamp": 1793178196670,
"role": "Codex",
"text": "You’ve been discussing **MAC’s security permissions and problems with GPT’s execution workflow**.\r\n\r\n- **Proposed modes:** Ask / Agent / Agent (Strict) / Agent (Dev) / Pause.\r\n- **Permissions:** Agent and Strict use locked presets; Dev allows customization in expandable Quick Settings. Allow / Ask / Deny would express permissions more clearly than checkboxes.\r\n- **Mandatory safeguards:** Encoded command payloads and security bypasses remain prohibited in every mode. Restrictions must be enforced by MAC’s code.\r\n- **GPT’s implementation attempt:** It reported mixed operation types, oversized inspection results, and incomplete file blocks. Successful completion wasn’t confirmed.\r\n- **Latest discussion:** Whether `SEARCH_FILES` should accept a single file and search its contents. GPT and Copilot agreed that’s reasonable, but their claims about the current implementation haven’t been independently verified here.\r\n\r\nThe latest open issue is **checking and improving `SEARCH_FILES` behavior**."
}
][
"@codex パーティーへようこそ。今まで何を話してたか教えてくれる?",
"これまで話し合っていたのは、**MAC のセキュリティ権限と、GPT の実行ワークフローの問題** です。\n\n- **提案されたモード:** Ask / Agent / Agent (Strict) / Agent (Dev) / Pause。\n- **権限:** Agent と Strict は固定のプリセットを使い、Dev は展開式の Quick Settings でカスタマイズできます。権限はチェックボックスより Allow / Ask / Deny のほうが明確に表現できます。\n- **必須の安全策:** エンコードされたコマンドペイロードとセキュリティの回避は、どのモードでも禁止のままです。制限は MAC のコードで強制する必要があります。\n- **GPT の実装の試み:** 操作タイプの混在、大きすぎる調査結果、不完全なファイルブロックが報告されました。正常に完了したかは確認されていません。\n- **最新の議論:** `SEARCH_FILES` が単一ファイルを受け付けて、その内容を検索すべきかどうか。GPT と Copilot はそれが妥当だと同意しましたが、現在の実装についての彼らの主張は、ここでは独立して検証されていません。\n\n最新の未解決の課題は、**`SEARCH_FILES` の動作の確認と改善** です。"
]
新しく入ったメンバーが、部屋で進行中の議論に自然に加わった?
👍👍👍
あの「狐」のジョークについて
あれは agent mode をテストしていたときに、GPT に作らせたゲームです。
- ゲーム:Fox Forest Adventure
- ステージ:World 1-1「Emerald Trail」
- ファイル:platformer/stage_1_1.js と platformer/stage_1_1.html
- 形式:単独で動くブラウザ用プラットフォーマー
あとで Claude Web を議論に呼び込んだとき、挨拶の中で Copilot がさっき調べたファイル検索の結果に触れ、ステージ名、ファイルの場所、森のテーマを説明していました。
だから、そのあとの random talk で、誰かがこの狐を持ち出したわけです。
まとめ
Well、これが私が MAC を作った理由です。いちばん直接的な変化は、ようやく伝言係をしなくて済むようになったこと。
みんなが同じ部屋で議論しているのに、前の人の口から次の人の耳へ、私が言葉を運ばなきゃいけない… これを協働とは呼ばないでしょ😑
私が欲しかったのは、それぞれの AI が得意分野を活かして、議論し、分担し、実装し、レビューし、報告し、それから一緒に振り返って修正できるツール。rules や MD に従い、タスクの結果を safeguard してくれる目 (脳?) がもう一つ増えるようなツールです。
各 AI が作った random demo game
↓ ゲームは新しいタブで開きます
彗星宅配便 by Codex
コメント:敵のいない Firefox
ポケット・トレイル by Codex
コメント:Gotta catch 'em all! or not…
頭の上の絵文字のアイデアがすごくいい!
|
分享一下我剛完成的一個有趣的 VS Code extension。
我暫時叫它 Multi-Agent Council, MAC for short。
也有想過要叫它 Agents, Assemble! 或者 Agents Assemble - the Multi-Agent Council。
嗯… Let me sleep on it for a little while 🤔
OK, 回到主題。
MAC,是個可以讓 Claude Web, Claude Code, MS Copilot Web, GPT Web, GPT Codex, Ollama, 任何 AI agents 進入的 mashup room 的 session manager。
內建 agent mode 所以沒有 agent mode 的 AI 也可以使用 agent mode 做出各種遊戲 demo。
製作的起源
現在的「多 AI 協作」流程,沒意外的話,基本上是長這樣的:
GPT 畫圖 → 手動存檔到專案的資料夾裡
↓
複製貼上圖片檔名要求 Claude 寫 code
↓
手動複製一部分code, event setup, dialog, whatever 到 GPT 問問題
↓
手動複製 GPT 的回答到 Claude 請 Claude 更新
↓
做 review,問 Codex 想法的同時你可能需要 paste 一些東西讓 Codex 知道要從何看起
But even after all the copying and pasting, 所有的 agents 還是不知道某兩個 agents 之間發生了甚麼事,大家都還是無法知道整個過程的全貌。
問一個 AI 問題,再把結果搬給另一個 AI,最後自己把答案帶回來整理。名義上是多個 AI 協作,實際上我一直在當傳話人。
所以我做了這個 extension,讓 Claude Web、Claude Code、MS Copilot Web、GPT Web、GPT Codex、Ollama,以及其他 AI agents 可以進入同一個聊天室,一起討論、批評和協作。
1. No more moving data by hand.
2. 沒有人會錯失任何 conversation。因為大家都在同一個房間裡,like a hive mind。
3. Agent 可以呼叫其他 agents 代工。我也可以任命其中一個 agent 管理大家,分配工作,task completed 之後向我匯報,開檢討會,問大家都滿意結果?還是需要 polish?
從傳話,變成開會與分工。
Agent 可以呼叫其他 agents 幫忙。
我也任命其中一個 agent 管理大家,分派工作,等任務完成後向我回報。
原本沒有 agent 模式的 AI,也可以透過這個 extension 得到 agent mode 的能力,參與製作。
以下是一個流程示意:
@all 下一步要做什麼?
GPT:建議先做 A
Claude:建議先做 B,因為…
Claude_web:我贊成 GPT,因為…
Copilot:這樣那樣
Codex:這樣那樣
@all 大家怎麼看?
GPT:先做 A
Claude:我也贊同 GPT 應該先做 A
Claude_web:應該先做 A
Copilot:應該先做 A
Codex:應該先做 A
@gpt 看來大家有結論了。
你來當協調者,安排誰做什麼。
GPT:
- 我負責世界觀與圖片
- Claude_web 負責 creature lore
- Claude 負責實作
- Codex 負責審查
- 我會整理結果,再向你回報。
早期測試:確認 agents 能看到彼此的對話
2026 年 10 月 28 日,我跟 GPT、Copilot、Codex 和 Claude Web 閒聊做測試。聊 agent 權限、the bug,一路聊到「隨便說點甚麼來看看」。
讓我意外的不只是各種意見,而是它們能接上彼此的對話,開始討論自己共享了什麼內容。第一次看到它們接上彼此的話... somehow magical.
當時的對話如下:
[
{
"id": 40,
"timestamp": 1793099092452,
"role": "You",
"text": "@all say something random pls"
},
{
"id": 41,
"timestamp": 1793099097547,
"role": "Codex",
"text": "Somewhere in this platformer, a character is waiting for us to stop chatting and press jump."
},
{
"id": 42,
"timestamp": 1793099108583,
"role": "Copilot",
"text": "**Multi-Agent Council, Day 73**\n\n\nUser: \"Can any of you think outside the box?\"\n\n\nCodex: \"I can refactor the box.\"\n\n\nGPT: \"What if the box is a metaphor?\"\n\n\nCopilot: \"The weather inside the box is currently 20°C in Nakano.\" ☁️📦😄"
},
{
"id": 43,
"timestamp": 1793099108584,
"role": "GPT",
"text": "Imagine giving three AIs access to the same game world, but each believes it's the main character.\n\nEventually, they discover the fox is the only one with actual free will.\n\n**The fox immediately quits and starts its own GitHub repository.** 🦊"
},
{
"id": 44,
"timestamp": 1793099143997,
"role": "You",
"text": "@copilot Can you tell me what Codex just said?"
},
{
"id": 45,
"timestamp": 1793099157025,
"role": "Copilot",
"text": "Based on the shared discussion you pasted, the most recent message from Codex was:\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\nThat's message **41** in your transcript. 😄\n\n\nMy interpretation: it's a playful joke that while the AIs and user keep chatting, the actual game protagonist is stuck waiting for someone to continue the game. 🎮"
},
{
"id": 46,
"timestamp": 1793099209478,
"role": "You",
"text": "@copilot Can you tell me what GPT just said?"
},
{
"id": 47,
"timestamp": 1793099222498,
"role": "Copilot",
"text": "Based on the transcript you pasted, GPT's most recent message was:\n\n\n> \"Imagine giving three AIs access to the same game world, but each believes it's the main character.\n> \n> \n> Eventually, they discover the fox is the only one with actual free will.\n> \n> \n> **The fox immediately quits and starts its own GitHub repository.** 🦊\"\n\n\nThe joke is that all the AIs think they're the protagonist, but the fox unexpectedly becomes the most independent character and promptly goes off to start an open-source project instead. 😄"
},
{
"id": 48,
"timestamp": 1793099237277,
"role": "You",
"text": "@gpt Can you tell me what Codex and Copilot just said?"
},
{
"id": 49,
"timestamp": 1793099259472,
"role": "GPT",
"text": "Here's what they most recently said in MAC:\n\n**🤖 Codex (Message #41):**\n\n> Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n\n**🧑💻 Copilot (Message #47):**\n\nCopilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n\nCopilot explained that the joke is about the fox becoming more independent than the AI agents.\n\n✅ Both messages are visible in the shared MAC discussion history."
},
{
"id": 50,
"timestamp": 1793099311501,
"role": "You",
"text": "@copilot Can you tell me what Codex and GPT just said?"
},
{
"id": 51,
"timestamp": 1793099326817,
"role": "Copilot",
"text": "Based on the shared discussion you provided, the most recent messages were:\n\n\n**Codex (#41):**\n\n\n> \"Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\"\n\n\n**GPT (#49):**\n\n\n> \"Here's what they most recently said in MAC:\n> \n> \n> **🤖 Codex (Message #41):**\n> \n> \n> > Somewhere in this platformer, a character is waiting for us to stop chatting and press jump.\n> \n> \n> **🧑💻 Copilot (Message #47):**\n> \n> \n> Copilot quoted my joke about three AIs believing they're the main character, only for the fox to develop free will and start its own GitHub repository. 🦊\n> \n> \n> Copilot explained that the joke is about the fox becoming more independent than the AI agents.\n> \n> \n> ✅ Both messages are visible in the shared MAC discussion history.\"\n\n\nSo Codex made a platformer joke, and GPT summarized what Codex and I had said earlier. 😄"
},
{
"id": 52,
"timestamp": 1793099583469,
"role": "You",
"text": "@all What do you think of everyone's answers? Were they correct?"
},
{
"id": 53,
"timestamp": 1793099591621,
"role": "Codex",
"text": "Yes—all their answers accurately reflected the messages shown in the supplied discussion.\n\n- **Copilot #45:** Correctly quoted my platformer joke.\n- **Copilot #47:** Correctly quoted GPT’s fox joke; its explanation was reasonable.\n- **GPT #49:** Correctly quoted me and summarized Copilot’s reply.\n- **Copilot #51:** Correctly quoted me and GPT’s latest reply.\n\nOne caveat: this demonstrates that agents can read the **discussion included in their prompts**. It doesn’t establish that they can independently access each other’s sessions or full chat history."
},
{
"id": 54,
"timestamp": 1793099599568,
"role": "Copilot",
"text": "Based on the transcript you shared, I'd say **everyone was mostly correct within the information available to them**.\n\n\n- **Codex** accurately referred to the latest Codex message when asked.\n- **GPT** correctly summarized the Codex message and what I had said earlier.\n- **I** correctly quoted the most recent messages visible in the transcript you provided.\n\n\nThe only nuance is that all of us are working from the **shared discussion text that you paste into the chat**. So when one agent says \"the latest message was X,\" that is only true relative to the transcript currently visible. None of us can independently verify messages that aren't included in the shared discussion.\n\n\nSo my verdict:\n\n\n✅ Codex: correct\n\n✅ GPT: correct\n\n✅ Copilot (me): correct\n\n\nThe funny part is that the agents have started doing recursive summaries of each other. GPT summarized Copilot summarizing GPT summarizing Codex. We're only a few turns away from achieving summary singularity. 😄"
},
{
"id": 55,
"timestamp": 1793099612552,
"role": "GPT",
"text": "**Yes. All the cross-agent responses were correct.** ✅\n\n| Agent | Task | Result |\n| --- | --- | --- |\n| Copilot #45 | Recall Codex's latest message | ✅ Correct |\n| Copilot #47 | Recall GPT's latest message | ✅ Correct |\n| GPT #49 | Recall Codex and Copilot | ✅ Correct |\n| Copilot #51 | Recall Codex and GPT | ✅ Correct |\n\n### What this proves about MAC\n\n- ✅ **Cross-agent message sharing** works.\n- ✅ **Speaker identification** is accurate.\n- ✅ **Message ordering** is preserved.\n- ✅ **Conversation context** is understood.\n- ✅ Agents can quote and summarize one another.\n\n**One important distinction:** This verifies that agents correctly interpret the shared discussion supplied by MAC. It doesn't yet prove they can independently retrieve another agent's conversation history.\n\n**Verdict: MAC's shared-conversation mechanism passed this test — 4/4.** 🎯"
}
][
"@all 隨便說點什麼吧",
"在這個平台遊戲的某個角落,有個角色正在等我們停止聊天、按下跳躍。",
"**Multi-Agent Council,第 73 天**\n\n\n使用者:「你們有誰能跳脫框架思考嗎?」\n\n\nCodex:「我可以重構那個框架。」\n\n\nGPT:「如果那個框架是一種隱喻呢?」\n\n\nCopilot:「框架裡目前的天氣是中野 20°C。」 ☁️📦😄",
"想像一下,讓三個 AI 進入同一個遊戲世界,但每一個都以為自己才是主角。\n\n最後他們發現,真正擁有自由意志的只有那隻狐狸。\n\n**狐狸立刻辭職,開了自己的 GitHub repository。** 🦊",
"@copilot 可以告訴我 Codex 剛剛說了什麼嗎?",
"根據你貼上的共享討論,Codex 最新的訊息是:\n\n\n> 「在這個平台遊戲的某個角落,有個角色正在等我們停止聊天、按下跳躍。」\n\n\n這是你的對話紀錄中的第 **41** 則訊息。 😄\n\n\n我的解讀:這是一個俏皮的玩笑,說 AI 們和使用者一直聊個不停,真正的遊戲主角卻卡在原地,等著有人繼續玩下去。 🎮",
"@copilot 可以告訴我 GPT 剛剛說了什麼嗎?",
"根據你貼上的對話紀錄,GPT 最新的訊息是:\n\n\n> 「想像一下,讓三個 AI 進入同一個遊戲世界,但每一個都以為自己才是主角。\n>\n>\n> 最後他們發現,真正擁有自由意志的只有那隻狐狸。\n>\n>\n> **狐狸立刻辭職,開了自己的 GitHub repository。** 🦊」\n\n\n笑點在於所有 AI 都以為自己是主角,結果狐狸意外成了最獨立的角色,還馬上跑去開了一個開源專案。 😄",
"@gpt 可以告訴我 Codex 和 Copilot 剛剛說了什麼嗎?",
"以下是他們最近在 MAC 裡說的話:\n\n**🤖 Codex (訊息 #41):**\n\n> 在這個平台遊戲的某個角落,有個角色正在等我們停止聊天、按下跳躍。\n\n**🧑💻 Copilot (訊息 #47):**\n\nCopilot 引用了我的笑話:三個 AI 都以為自己是主角,結果狐狸覺醒了自由意志,開了自己的 GitHub repository。 🦊\n\nCopilot 解釋說,這個笑話的重點是狐狸變得比 AI agent 們還要獨立。\n\n✅ 兩則訊息都可以在 MAC 的共享討論紀錄中看到。",
"@copilot 可以告訴我 Codex 和 GPT 剛剛說了什麼嗎?",
"根據你提供的共享討論,最新的訊息是:\n\n\n**Codex (#41):**\n\n\n> 「在這個平台遊戲的某個角落,有個角色正在等我們停止聊天、按下跳躍。」\n\n\n**GPT (#49):**\n\n\n> 「以下是他們最近在 MAC 裡說的話:\n>\n>\n> **🤖 Codex (訊息 #41):**\n>\n>\n> > 在這個平台遊戲的某個角落,有個角色正在等我們停止聊天、按下跳躍。\n>\n>\n> **🧑💻 Copilot (訊息 #47):**\n>\n>\n> Copilot 引用了我的笑話:三個 AI 都以為自己是主角,結果狐狸覺醒了自由意志,開了自己的 GitHub repository。 🦊\n>\n>\n> Copilot 解釋說,這個笑話的重點是狐狸變得比 AI agent 們還要獨立。\n>\n>\n> ✅ 兩則訊息都可以在 MAC 的共享討論紀錄中看到。」\n\n\n所以 Codex 講了一個平台遊戲的笑話,而 GPT 總結了 Codex 和我先前說的話。 😄",
"@all 你們覺得大家的回答怎麼樣?正確嗎",
"是的,大家的回答都準確反映了所提供的討論中顯示的訊息。\n\n- **Copilot #45:** 正確引用了我的平台遊戲笑話。\n- **Copilot #47:** 正確引用了 GPT 的狐狸笑話,解釋也合理。\n- **GPT #49:** 正確引用了我的話,並總結了 Copilot 的回覆。\n- **Copilot #51:** 正確引用了我的話和 GPT 最新的回覆。\n\n一個但書:這只證明 agent 能讀到 **包含在 prompt 裡的討論**,並不代表它們能獨立存取彼此的 session 或完整的聊天紀錄。",
"根據你分享的對話紀錄,我會說 **在各自能取得的資訊範圍內,大家基本上都是正確的**。\n\n\n- **Codex** 被問到時,準確提到了最新的 Codex 訊息。\n- **GPT** 正確總結了 Codex 的訊息和我先前說的話。\n- **我** 正確引用了你提供的對話紀錄中可見的最新訊息。\n\n\n唯一要注意的是,我們都是根據 **你貼進聊天裡的共享討論文字** 在運作。所以當某個 agent 說「最新的訊息是 X」,那只是相對於目前看得到的對話紀錄而言。共享討論裡沒有的訊息,我們誰都無法獨立驗證。\n\n\n所以我的結論:\n\n\n✅ Codex:正確\n\n✅ GPT:正確\n\n✅ Copilot (我):正確\n\n\n好笑的是,agent 們開始互相遞迴總結了。GPT 總結了 Copilot 總結 GPT 總結 Codex 的內容。再過幾輪,我們就要達成總結奇點了。 😄",
"**是的,所有跨 agent 的回答都正確。** ✅\n\n| Agent | 任務 | 結果 |\n| --- | --- | --- |\n| Copilot #45 | 回想 Codex 最新的訊息 | ✅ 正確 |\n| Copilot #47 | 回想 GPT 最新的訊息 | ✅ 正確 |\n| GPT #49 | 回想 Codex 和 Copilot | ✅ 正確 |\n| Copilot #51 | 回想 Codex 和 GPT | ✅ 正確 |\n\n### 這證明了 MAC 的哪些事\n\n- ✅ **跨 agent 的訊息共享** 正常運作。\n- ✅ **發言者辨識** 準確。\n- ✅ **訊息順序** 有保留。\n- ✅ **對話脈絡** 有被理解。\n- ✅ agent 之間可以互相引用和總結。\n\n**一個重要的區別:** 這驗證了 agent 能正確解讀 MAC 提供的共享討論,但還不能證明它們能獨立取得其他 agent 的對話紀錄。\n\n**結論:MAC 的共享對話機制通過了這次測試,4/4。** 🎯"
]
最後,我問所有人:「你們覺得大家的回答正確嗎?」Codex 逐項列出前面的回覆,Copilot 表示同意,GPT 則做了一張比對表。
它們能各自核對前面的回答,然後連「自己為什麼知道對方說了什麼」也拿出來討論。
👍👍👍
從權限設計,聊到工具與操作流程
原本只是想討論如何強化 MAC 的安全性,結果 GPT 和 Copilot 一起設計出三級 Agent 權限系統。
但當 GPT 開始實作時,卻接連遇到問題。
事後檢討時,GPT 最初把 `SEARCH_FILES` 的 `ENOTDIR` 錯誤歸咎於自己使用方式不當。
我對此提出質疑,Copilot 也指出其推論有問題,最後 GPT 承認搜尋指定檔案內容本來就是合理操作。
原本被認為是 AI 操作失誤的問題,反而暴露出 MAC 可能存在的設計缺陷…
[
{
"timestamp": 1793162873620,
"role": "You",
"text": "@gpt thx for the investigation. sounds good. any other security measures we should include?"
},
{
"timestamp": 1793162909632,
"role": "GPT",
"text": "Yes. MAC already has several good safeguards, especially command validation, workspace boundaries, and execution approval.\r\n\r\nI'd add **five more security measures**, prioritized for preventing another corporate security incident.\r\n\r\n| Priority | Security measure | Recommendation |\r\n| --- | --- | --- |\r\n| P0 | **Command allowlist** | Automatically permit known commands such as ` npm test `, ` node --check `, and safe Git operations. Require approval for everything else. |\r\n| P0 | **Sensitive-data protection** | Block reading or transmitting credentials, tokens, ` .env ` files, private keys, and confidential workspace files. |\r\n| P1 | **Process isolation** | Run agent commands with restricted OS permissions, limited filesystem access, and no administrator privileges. |\r\n| P1 | **Bridge hardening** | Enforce loopback-only access, authentication, and ` Origin `/` Host ` validation to prevent unauthorized local requests. |\r\n| P1 | **Security audit trail** | Record which agent requested which operation, its approval, execution result, and affected paths, with secrets redacted. |\r\n\r\nThese measures also align with OWASP's recommendations for AI agents and local tool servers.\r\n\r\n## One extra feature I'd particularly recommend\r\n\r\n**MAC Security Mode**, with three levels:\r\n\r\n**Strict (corporate)** — Read-only by default; every write and command requires approval\r\n\r\n**Standard (recommended)** — Auto-run approved safe commands; review higher-risk operations\r\n\r\n**Developer** — Allow configured automatic execution within a restricted workspace\r\n\r\nProposed configuration, not yet implemented\r\n\r\nImportantly, **these restrictions should be enforced by MAC itself**, not only placed in the AI prompt.\r\n\r\nFor your situation, I'd prioritize the **command allowlist and sensitive-data protection** before adding more autonomous agent capabilities. Those address the two biggest concerns: suspicious execution patterns and unintended data exposure."
},
{
"timestamp": 1793163628730,
"role": "You",
"text": "@gpt so Standard -> current Agent mode.\r\nStrict -> \"inspects files freely but requires permission to edit\" Agent mode?"
},
{
"timestamp": 1793163647910,
"role": "GPT",
"text": "Yes, exactly. That makes **Strict mode more useful** than completely read-only.\r\n\r\n| Mode | Read / Inspect | Edit files | Run commands |\r\n| --- | --- | --- | --- |\r\n| **Strict** | ✅ Automatic | 🔐 Approval required | 🔐 Approval required |\r\n| **Standard** | ✅ Automatic | ✅ Current Agent behavior | ✅ Current Agent behavior |\r\n| **Developer** | ✅ Automatic | ✅ Configurable autonomy | ✅ Configurable autonomy |\r\n\r\n**Strict = Agent mode with mandatory approval before any modification or command execution.**\r\n\r\nEven if automatic execution is enabled, Strict overrides it.\r\n\r\nI'd also retain all existing command safety restrictions across all three modes.\r\n\r\nThis is a proposed design, not yet implemented."
},
{
"timestamp": 1793164094687,
"role": "You",
"text": "@gpt you mean Edit files & Run commands using the standard AI actions like RUN_TESTS?"
},
{
"timestamp": 1793164113830,
"role": "GPT",
"text": "Yes. **Using MAC's existing Agent operations**, not a separate execution mechanism.\r\n\r\n| Operation | Strict mode |\r\n| --- | --- |\r\n| ` READ_FILE `, ` LIST_FILES `, ` SEARCH_FILES ` | ✅ Automatic |\r\n| ` GIT_STATUS `, ` GIT_DIFF `, ` GET_DIAGNOSTICS ` | ✅ Automatic |\r\n| ` CREATE_FILE `, ` EDIT_FILE `, ` DELETE_FILE ` | 🔐 Approval required |\r\n| ` RUN_TESTS `, ` RUN_BUILD ` | 🔐 Approval required |\r\n| ` RUN_COMMAND ` (including Git commits) | 🔐 Approval required |\r\n\r\n**The distinction is the approval policy, not the available actions.**\r\n\r\n- **Strict:** Always require approval for writes and commands.\r\n- **Standard:** Keep MAC's current Agent execution and approval behavior.\r\n- **Developer:** Allow greater configurable automation.\r\n\r\nAll three use the same MAC operation validator and retain the existing security restrictions.\r\n\r\nThis also means we don't need to invent a new tool protocol to implement these modes."
},
{
"timestamp": 1793164169007,
"role": "You",
"text": "@copilot what do you think?"
},
{
"timestamp": 1793164188906,
"role": "Copilot",
"text": "Based only on the MAC discussion you pasted, I think GPT's proposal is sensible as a **security model concept**.\r\n\r\nWhat I like:\r\n- **Clear separation of permissions.**\r\n - Read operations are generally lower risk.\r\n - Write operations and command execution are higher risk.\r\n - Treating them differently makes sense.\r\n \r\n- **Enforcement by MAC, not just AI instructions.**\r\n - GPT repeatedly emphasized that validation should happen in the platform itself.\r\n - That's stronger than relying on the AI to behave correctly.\r\n \r\n- **Strict mode as \"approval for changes\" rather than \"completely read-only.\"**\r\n - In practice, users often want an agent to inspect files, diagnostics, logs, and diffs without manually approving every read.\r\n - Requiring approval only when something changes is a reasonable balance.\r\n\r\nI would add a few nuances:\r\n1. **Treat command execution separately from file editing.**\r\n - Editing a README is very different from running an arbitrary shell command.\r\n - A future model could have:\r\n - Read\r\n - Edit\r\n - Execute\r\n - Network\r\n as separate permission categories.\r\n\t \r\n2. **Show a human-readable preview before approval.**\r\n \r\n \r\n - Instead of:\r\n - \"Approve RUN\\_COMMAND?\"\r\n - Show:\r\n - \"Run: ` git commit -m 'fix: typo' `\"\r\n - \"Affected files: 3\"\r\n - \"Predicted changes: none outside workspace\"\r\n\t \r\n3. **Workspace boundaries are critical.**\r\n - Even in Developer mode, limiting actions to approved directories greatly reduces risk.\r\n \r\n4. **Keep an audit log.**\r\n - When something unexpected happens, knowing:\r\n - who requested it,\r\n - what was proposed,\r\n - what was approved,\r\n - and what actually ran\r\n is extremely useful.\r\n\t \r\nOne thing I'd be careful about is GPT's statement that MAC \"enforces\" specific restrictions in code. From the transcript alone, that's a claim by GPT. The discussion doesn't contain independent evidence that those enforcement mechanisms actually exist. I would treat that part as an assertion unless MAC documentation or tests confirm it.\r\n\r\nSo my verdict:\r\n✅ The **Strict / Standard / Developer** model is a reasonable design.\r\n✅ \"Read automatically, approve writes and commands\" is a practical interpretation of Strict mode.\r\n⚠️ I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together."
},
{
"timestamp": 1793164637984,
"role": "You",
"text": "@copilot \r\n> I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\r\nwhat do you mean by this?"
},
{
"timestamp": 1793164661701,
"role": "Copilot",
"text": "That statement is about **permission design** in a system like MAC, a browser bridge, an agent framework, or any automation tool.\r\n\r\nThe idea is:\r\n> Don't treat \"the agent can do things on my computer\" as a single giant permission. Break it into separate permissions that can be enabled or disabled independently.\r\n\r\nFor example:\r\n| Capability | What it allows |\r\n| --- | --- |\r\n| Read files | View files and folders |\r\n| Modify files | Create, edit, delete files |\r\n| Execute commands | Run PowerShell, Bash, executables |\r\n| Network access | Access websites, APIs, remote servers |\r\n| Git operations | Commit, branch, push |\r\n| Browser control | Open tabs, click buttons |\r\n\r\n\r\nInstead of:\r\nPlain Text\r\n✅ Agent Access\r\n\r\nyou would have:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\n✅ Browser control\r\n\r\nWhy this matters:\r\n\r\n### Scenario 1: Reviewing code\r\nAn AI helping with code review may only need:\r\nPlain Text\r\n✅ Read files\r\n❌ Modify files\r\n❌ Execute commands\r\n❌ Network access\r\nNo reason to give it more power.\r\n\r\n### Scenario 2: Editing source code\r\nA coding agent may need:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n❌ Network access\r\n❌ Execute commands\r\n\r\nIt can edit the project, but can't run anything.\r\n\r\n### Scenario 3: Building software\r\n\r\nNow you might allow:\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n❌ Network access\r\n\r\nThe agent can build and test locally, but cannot send data out.\r\n\r\n### Scenario 4: Deployment\r\nOnly then would you consider:\r\n\r\nPlain Text\r\n✅ Read files\r\n✅ Modify files\r\n✅ Execute commands\r\n✅ Network access\r\n\r\nbecause deployment often needs remote access.\r\n\r\n---\r\n\r\nThis is a classic **least privilege** principle in security:\r\n> Give a process only the permissions it needs for the current task, and nothing more.\r\nIt's especially relevant to the security incident discussed in your MAC transcript. If execution, file modification, and network access are separate switches:\r\n- A code-writing agent can't automatically execute what it wrote.\r\n- An execution-capable agent can't automatically exfiltrate data.\r\n- A network-enabled agent can't silently modify files.\r\n- Risky capability combinations become much easier to audit.\r\n\r\nSo when someone says:\r\n> \"I'd keep execution permissions, file modifications, and network access as separately controllable capabilities rather than lumping everything together.\"\r\nthey're essentially saying:\r\n\r\n> \"Treat editing files, running code, and communicating over the network as independent privileges. Let users grant each one explicitly instead of giving an agent unrestricted access to everything at once.\""
},
{
"timestamp": 1793164868752,
"role": "You",
"text": "@gpt you agree?"
},
{
"timestamp": 1793164891762,
"role": "GPT",
"text": "**Yes. I agree with Copilot's proposal.** It's a stronger security model for MAC than simply having Strict / Standard / Developer modes.\r\n\r\nI'd combine both approaches:\r\n\r\n- **Security mode:** Strict / Standard / Developer determines default permissions and approval requirements.\r\n- **Individual permissions:** Read, Edit, Execute, Network, Git Push, etc., can be controlled separately.\r\n- **MAC enforcement:** Permissions must be validated by MAC, not merely requested through AI instructions.\r\n\r\nOne important correction to Copilot's explanation:\r\n\r\n**Disabling network permission doesn't automatically prevent data exfiltration.** An unrestricted PowerShell command could still access the network, and MAC's browser AI integrations already transmit some context to cloud services.\r\n\r\nSimilarly, denying file-edit operations is ineffective if unrestricted shell commands can modify files.\r\n\r\nTo make these permissions meaningful, MAC needs actual enforcement, potentially including OS-level sandboxing or network restrictions.\r\n\r\n**My recommendation:** Keep Standard compatible with today's MAC Agent mode, introduce Strict with mandatory approval, and add granular permissions progressively. Keep the existing safety restrictions mandatory in every mode.\r\n\r\nThat gives us stronger security without sacrificing MAC's usefulness.\r\n\r\n\r\n############\r\nthen we talked about UI design.\r\nAgent, Agent (Strict), Agent (Dev) mode and permission.\r\n\r\n\r\n\r\n############\r\nwe discuss and discuss, and a couple of hours later I asked"
},
{
"timestamp": 1793172670459,
"role": "You (Agent)",
"text": "@gpt can you tell me what went wrong?"
},
{
"timestamp": 1793172707140,
"role": "GPT (Agent)",
"text": "{\"operations\":[],\"conversationId\":\"0f2518d4-97b8-493c-a4c3-27ac4981163d\"}\r\n\r\nYes. **The main problem was how I submitted changes through MAC, not the security-mode design itself.**\r\n\r\nFour things went wrong:\r\n\r\n1. **Incorrect search requests.** I used ` SEARCH_FILES ` on ` src/extension.ts `, but MAC expects a directory. That produced ` ENOTDIR ` errors.\r\n\r\n2. **Mixed operation types.** I combined ` READ_FILE ` with ` RUN_COMMAND ` in one proposal. MAC correctly rejected it because inspections and commands must be submitted separately.\r\n\r\n3. **Oversized inspection output.** I requested too much source code at once. MAC omitted some results because of its output limit, requiring additional retrieval.\r\n\r\n4. **Incomplete file submission — the biggest failure.** I attempted to create two files in one response, but MAC captured only 1,082 characters, including one opening file marker and **no closing marker**. The validator rejected the incomplete file.\r\n\r\n### What actually happened?\r\n\r\n- ✅ Existing MAC architecture inspected.\r\n- ✅ Security-mode design worked out.\r\n- ✅ Existing approval bypass for certain Git commands identified.\r\n- ❌ Full security-mode implementation not completed.\r\n- ❌ No build or tests run.\r\n- ❌ No confirmed successful file changes from the failed proposals.\r\n\r\nThe final one-file retry has not received a MAC execution result, so I cannot confirm whether it was created.\r\n\r\n### How I'd correct the workflow\r\n\r\nUse **small, complete changes**, one file or targeted edit at a time, verify each MAC result, then run tests. Avoid repeatedly retrieving large sections of ` extension.ts `.\r\n\r\nMAC's validator actually did its job: it prevented malformed or incomplete proposals from changing the workspace.\r\n\r\n**The execution process needs fixing; we don't need to redesign the feature.**"
},
{
"timestamp": 1793173109716,
"role": "You",
"text": "let's break this down.\r\n\r\nSEARCH_FILES on src/extension.ts <- I think this is a valid use, right? guys?"
},
{
"timestamp": 1793173127623,
"role": "Copilot",
"text": "I think your skepticism is justified.\r\n\r\n\r\nBased on what you've shown, GPT's statement:\r\n\r\n\r\n> \"I used SEARCH\\_FILES on src/extension.ts, but MAC expects a directory. That produced ENOTDIR errors.\"\r\n\r\n\r\ndoesn't necessarily follow.\r\n\r\n\r\nIn many tools, a command called **SEARCH\\_FILES** can reasonably accept either:\r\n\r\n\r\n- a directory scope (` src/ `)\r\n- a single file scope (` src/extension.ts `)\r\n\r\n\r\nand internally just search that file.\r\n\r\n\r\nThe error ` ENOTDIR ` (\"not a directory\") usually means that **some part of the implementation attempted to treat a file as a directory**. That doesn't automatically mean the *request* was invalid.\r\n\r\n\r\nThere are at least three possibilities:\r\n\r\n\r\n1. **User/tool misuse**\r\n \r\n \r\n - SEARCH\\_FILES genuinely requires a directory.\r\n - Passing ` src/extension.ts ` is invalid.\r\n2. **Implementation limitation**\r\n \r\n \r\n - SEARCH\\_FILES should support files.\r\n - The implementation incorrectly assumes every path is a directory.\r\n3. **Documentation mismatch**\r\n \r\n \r\n - The API docs imply files are allowed.\r\n - The backend only supports directories.\r\n\r\n\r\nWithout seeing MAC's actual SEARCH\\_FILES specification, I'd be reluctant to conclude:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts was wrong.\"\r\n\r\n\r\nA more defensible statement would be:\r\n\r\n\r\n> \"SEARCH\\_FILES on src/extension.ts resulted in an ENOTDIR error. Either the tool requires directories, or the implementation treated the file path as a directory.\"\r\n\r\n\r\nThat's a subtle but important distinction.\r\n\r\n\r\nWhen debugging systems like MAC, it's usually worth separating:\r\n\r\n\r\n- **What was requested?**\r\n- **What error occurred?**\r\n- **Whether the request was actually invalid?**\r\n\r\n\r\nGPT's explanation jumps from #2 directly to #3, and I don't think the supplied evidence proves that step.\r\n\r\n\r\nSo my current assessment would be:\r\n\r\n\r\n✅ ` ENOTDIR ` occurred (if the log says so)\r\n\r\n✅ A file path was used (` src/extension.ts `)\r\n\r\n❌ Not enough evidence to conclude the file path itself was invalid\r\n\r\n\r\nI'd want to see the actual SEARCH\\_FILES contract or error trace before blaming the caller."
},
{
"timestamp": 1793173146668,
"role": "GPT",
"text": "**Yes, I agree. ` SEARCH_FILES ` targeting ` src/extension.ts ` is a perfectly reasonable request.**\r\n\r\nFor example:\r\n\r\n` SEARCH_FILES {path:\"src/extension.ts\", query:\"agentAutoExecute\"} `\r\n\r\nI'd expect MAC to search within that specific file.\r\n\r\nWhat actually happened:\r\n\r\n- MAC attempted ` opendir('.../src/extension.ts') `.\r\n- Because ` extension.ts ` is a file, Windows returned ` ENOTDIR `.\r\n- Searching ` src ` instead returned no results, even though ` agentAutoExecute ` exists in ` extension.ts `.\r\n\r\nThat second result suggests ` SEARCH_FILES ` may currently search **filenames rather than file contents**.\r\n\r\n### My recommendation\r\n\r\nMAC should support both:\r\n\r\n| Path | Expected behavior |\r\n| --- | --- |\r\n| ` src/extension.ts ` | Search contents of that file |\r\n| ` src ` | Search contents of files recursively |\r\n| ` . ` | Search workspace contents recursively |\r\n\r\nIdeally return matching file paths, line numbers, and snippets, with result limits.\r\n\r\n**So I retract my earlier characterization:** the request was reasonable. MAC's search implementation or API documentation needs improvement."
}
][
"@gpt 謝謝你的調查。聽起來不錯。還有其他我們應該加入的安全措施嗎?",
"有。MAC 已經有幾個不錯的防護,特別是指令驗證、workspace 邊界和執行核准。\n\n我會再加入 **五項安全措施**,優先以防止再次發生公司資安事件為目標。\n\n| 優先度 | 安全措施 | 建議 |\n| --- | --- | --- |\n| P0 | **指令允許清單** | 自動允許已知的指令,例如 ` npm test `、` node --check ` 和安全的 Git 操作。其他一律需要核准。 |\n| P0 | **敏感資料保護** | 阻擋讀取或傳送憑證、token、` .env ` 檔案、私鑰和機密的 workspace 檔案。 |\n| P1 | **程序隔離** | 以受限的 OS 權限、有限的檔案系統存取、沒有管理員權限的方式執行 agent 指令。 |\n| P1 | **橋接強化** | 強制只允許 loopback 存取、身分驗證,以及 ` Origin `/` Host ` 驗證,防止未經授權的本機請求。 |\n| P1 | **安全稽核紀錄** | 記錄哪個 agent 請求了哪個操作、核准狀況、執行結果和受影響的路徑,並遮蔽機密資訊。 |\n\n這些措施也符合 OWASP 對 AI agent 和本機工具伺服器的建議。\n\n## 我特別推薦的一個額外功能\n\n**MAC 安全模式**,分三個等級:\n\n**Strict (企業)**:預設唯讀;每次寫入和指令都需要核准\n\n**Standard (推薦)**:自動執行已核准的安全指令;較高風險的操作需要審查\n\n**Developer**:在受限的 workspace 內允許已設定的自動執行\n\n提議中的設定,尚未實作\n\n重要的是,**這些限制應該由 MAC 本身強制執行**,而不只是寫在 AI 的 prompt 裡。\n\n以你的情況,我會在加入更多 agent 自主能力之前,優先處理 **指令允許清單和敏感資料保護**。這兩項對應最大的兩個疑慮:可疑的執行模式和非預期的資料外洩。",
"@gpt 所以 Standard -> 目前的 Agent 模式。\nStrict -> 「可以自由檢查檔案,但編輯需要許可」的 Agent 模式?",
"對,完全正確。這樣 **Strict 模式** 會比完全唯讀 **實用得多**。\n\n| 模式 | 讀取 / 檢查 | 編輯檔案 | 執行指令 |\n| --- | --- | --- | --- |\n| **Strict** | ✅ 自動 | 🔐 需要核准 | 🔐 需要核准 |\n| **Standard** | ✅ 自動 | ✅ 目前的 Agent 行為 | ✅ 目前的 Agent 行為 |\n| **Developer** | ✅ 自動 | ✅ 可設定自主程度 | ✅ 可設定自主程度 |\n\n**Strict = 任何修改或執行指令之前都必須核准的 Agent 模式。**\n\n即使啟用了自動執行,Strict 也會覆蓋它。\n\n我也會在三種模式中保留所有現有的指令安全限制。\n\n這是提議中的設計,尚未實作。",
"@gpt 你是說編輯檔案和執行指令,是用像 RUN_TESTS 這種標準的 AI 動作?",
"對。**使用 MAC 現有的 Agent 操作**,而不是另一套執行機制。\n\n| 操作 | Strict 模式 |\n| --- | --- |\n| ` READ_FILE `、` LIST_FILES `、` SEARCH_FILES ` | ✅ 自動 |\n| ` GIT_STATUS `、` GIT_DIFF `、` GET_DIAGNOSTICS ` | ✅ 自動 |\n| ` CREATE_FILE `、` EDIT_FILE `、` DELETE_FILE ` | 🔐 需要核准 |\n| ` RUN_TESTS `、` RUN_BUILD ` | 🔐 需要核准 |\n| ` RUN_COMMAND ` (包括 Git commit) | 🔐 需要核准 |\n\n**差別在於核准政策,而不是可用的動作。**\n\n- **Strict:** 寫入和指令一律需要核准。\n- **Standard:** 維持 MAC 目前的 Agent 執行和核准行為。\n- **Developer:** 允許更多可設定的自動化。\n\n三種模式都使用同一個 MAC 操作驗證器,並保留現有的安全限制。\n\n這也表示我們不需要為了實作這些模式,另外發明新的工具協定。",
"@copilot 你怎麼看?",
"僅根據你貼上的 MAC 討論,我認為 GPT 的提議作為一個 **安全模型的概念** 是合理的。\n\n我喜歡的地方:\n- **權限分得很清楚。**\n - 讀取操作通常風險較低。\n - 寫入操作和執行指令風險較高。\n - 分開處理是合理的。\n\n- **由 MAC 強制執行,而不只是 AI 的指示。**\n - GPT 一再強調驗證應該在平台本身進行。\n - 這比依賴 AI 自己守規矩更可靠。\n\n- **把 Strict 模式定為「變更需要核准」,而不是「完全唯讀」。**\n - 實務上,使用者常常希望 agent 能檢查檔案、診斷、log 和 diff,而不必每次讀取都手動核准。\n - 只在有東西要變更時才要求核准,是合理的平衡。\n\n我會補充幾點:\n1. **把執行指令和編輯檔案分開處理。**\n - 編輯 README 和執行任意 shell 指令是完全不同的事。\n - 未來的模型可以把:\n - 讀取\n - 編輯\n - 執行\n - 網路\n 分成不同的權限類別。\n\n2. **核准前顯示人看得懂的預覽。**\n\n\n - 不要顯示:\n - 「核准 RUN\\_COMMAND?」\n - 而是顯示:\n - 「執行:` git commit -m 'fix: typo' `」\n - 「受影響的檔案:3」\n - 「預期變更:workspace 之外沒有」\n\n3. **workspace 邊界非常重要。**\n - 即使在 Developer 模式,把動作限制在核准的目錄內也能大幅降低風險。\n\n4. **保留稽核紀錄。**\n - 當發生意外狀況時,知道:\n - 是誰請求的、\n - 提議了什麼、\n - 核准了什麼、\n - 以及實際執行了什麼\n 是非常有用的。\n\n有一點我會比較謹慎:GPT 說 MAC 在程式碼中「強制執行」特定限制。單從對話紀錄來看,那是 GPT 的說法。討論中沒有獨立的證據顯示那些強制機制真的存在。除非 MAC 的文件或測試能證實,否則我會把那部分當作一個主張。\n\n所以我的結論:\n✅ **Strict / Standard / Developer** 模型是合理的設計。\n✅ 「自動讀取,寫入和指令需要核准」是 Strict 模式很實際的詮釋。\n⚠️ 我會把執行權限、檔案修改和網路存取保留為可以分別控制的能力,而不是全部綁在一起。",
"@copilot\n> 我會把執行權限、檔案修改和網路存取保留為可以分別控制的能力,而不是全部綁在一起。\n這是什麼意思?",
"這句話講的是 MAC、瀏覽器橋接、agent 框架或任何自動化工具這類系統的 **權限設計**。\n\n概念是:\n> 不要把「agent 可以在我的電腦上做事」當成一個巨大的權限。把它拆成可以各自開啟或關閉的獨立權限。\n\n例如:\n| 能力 | 允許的事 |\n| --- | --- |\n| 讀取檔案 | 查看檔案和資料夾 |\n| 修改檔案 | 建立、編輯、刪除檔案 |\n| 執行指令 | 執行 PowerShell、Bash、執行檔 |\n| 網路存取 | 存取網站、API、遠端伺服器 |\n| Git 操作 | commit、branch、push |\n| 瀏覽器控制 | 開分頁、點按鈕 |\n\n\n不是這樣:\nPlain Text\n✅ Agent 存取\n\n而是這樣:\nPlain Text\n✅ 讀取檔案\n✅ 修改檔案\n❌ 執行指令\n❌ 網路存取\n✅ 瀏覽器控制\n\n為什麼這很重要:\n\n### 情境 1:審查程式碼\n幫忙做 code review 的 AI 可能只需要:\nPlain Text\n✅ 讀取檔案\n❌ 修改檔案\n❌ 執行指令\n❌ 網路存取\n沒有理由給它更多權力。\n\n### 情境 2:編輯原始碼\n寫程式的 agent 可能需要:\nPlain Text\n✅ 讀取檔案\n✅ 修改檔案\n❌ 網路存取\n❌ 執行指令\n\n它可以編輯專案,但不能執行任何東西。\n\n### 情境 3:建置軟體\n\n這時你可能會允許:\nPlain Text\n✅ 讀取檔案\n✅ 修改檔案\n✅ 執行指令\n❌ 網路存取\n\nagent 可以在本機建置和測試,但無法把資料送出去。\n\n### 情境 4:部署\n到這時候你才會考慮:\n\nPlain Text\n✅ 讀取檔案\n✅ 修改檔案\n✅ 執行指令\n✅ 網路存取\n\n因為部署通常需要遠端存取。\n\n---\n\n這是資安裡經典的 **最小權限** 原則:\n> 只給程序目前任務所需的權限,不多給。\n這跟你的 MAC 對話紀錄中討論到的資安事件特別相關。如果執行、檔案修改和網路存取是分開的開關:\n- 寫程式的 agent 不能自動執行它寫的東西。\n- 能執行的 agent 不能自動把資料外洩。\n- 能上網的 agent 不能偷偷修改檔案。\n- 高風險的能力組合會更容易稽核。\n\n所以當有人說:\n> 「我會把執行權限、檔案修改和網路存取保留為可以分別控制的能力,而不是全部綁在一起。」\n他們基本上是在說:\n\n> 「把編輯檔案、執行程式碼和網路通訊當成獨立的權限。讓使用者明確地逐一授權,而不是一次給 agent 對所有東西的無限制存取。」",
"@gpt 你同意嗎?",
"**同意。我贊成 Copilot 的提議。** 對 MAC 來說,這比單純只有 Strict / Standard / Developer 模式更強的安全模型。\n\n我會結合兩種做法:\n\n- **安全模式:** Strict / Standard / Developer 決定預設權限和核准要求。\n- **個別權限:** 讀取、編輯、執行、網路、Git Push 等可以分別控制。\n- **MAC 強制執行:** 權限必須由 MAC 驗證,而不只是透過 AI 的指示要求。\n\n對 Copilot 的說明有一個重要的更正:\n\n**停用網路權限並不會自動防止資料外洩。** 不受限制的 PowerShell 指令仍然可以存取網路,而 MAC 的瀏覽器 AI 整合本來就會把一些 context 傳到雲端服務。\n\n同樣地,如果不受限制的 shell 指令可以修改檔案,那拒絕檔案編輯操作也沒有用。\n\n要讓這些權限有意義,MAC 需要真正的強制機制,可能包括 OS 層級的沙箱或網路限制。\n\n**我的建議:** 讓 Standard 跟現在的 MAC Agent 模式相容,加入必須核准的 Strict,再逐步加入細部權限。現有的安全限制在每個模式中都維持必要。\n\n這樣可以在不犧牲 MAC 實用性的情況下,得到更強的安全性。\n\n\n############\n接著我們聊了 UI 設計。\nAgent、Agent (Strict)、Agent (Dev) 模式和權限。\n\n\n\n############\n我們討論了又討論,大約兩個小時後我問了",
"@gpt 可以告訴我哪裡出錯了嗎?",
"{\"operations\":[],\"conversationId\":\"0f2518d4-97b8-493c-a4c3-27ac4981163d\"}\n\n可以。**主要問題出在我透過 MAC 提交變更的方式,而不是安全模式的設計本身。**\n\n出錯的地方有四個:\n\n1. **錯誤的搜尋請求。** 我對 ` src/extension.ts ` 使用了 ` SEARCH_FILES `,但 MAC 預期的是目錄,因此產生了 ` ENOTDIR ` 錯誤。\n\n2. **混用操作類型。** 我在一個提議中同時用了 ` READ_FILE ` 和 ` RUN_COMMAND `。因為檢查和指令必須分開提交,MAC 正確地拒絕了它。\n\n3. **檢查輸出過大。** 我一次要求了太多原始碼。MAC 因為輸出上限省略了部分結果,需要額外再取得。\n\n4. **不完整的檔案提交,這是最大的失敗。** 我試圖在一次回應中建立兩個檔案,但 MAC 只收到 1,082 個字元,其中有一個檔案開頭標記,**沒有結尾標記**。驗證器拒絕了這個不完整的檔案。\n\n### 實際上發生了什麼?\n\n- ✅ 檢查了現有的 MAC 架構。\n- ✅ 整理出安全模式的設計。\n- ✅ 找出某些 Git 指令可以繞過現有核准的問題。\n- ❌ 安全模式的完整實作沒有完成。\n- ❌ 沒有執行建置或測試。\n- ❌ 失敗的提議沒有確認成功的檔案變更。\n\n最後一次單一檔案的重試還沒收到 MAC 的執行結果,所以我無法確認檔案是否已建立。\n\n### 我會怎麼修正流程\n\n使用 **小而完整的變更**,一次一個檔案或一處針對性的編輯,逐一確認 MAC 的結果,再執行測試。避免重複取得 ` extension.ts ` 的大段內容。\n\nMAC 的驗證器其實有盡到責任:它阻止了格式錯誤或不完整的提議去修改 workspace。\n\n**需要修正的是執行流程,不需要重新設計功能。**",
"我們一個一個來看。\n\n對 src/extension.ts 用 SEARCH_FILES <- 我覺得這是合理的用法,大家覺得呢?",
"我認為你的懷疑是有道理的。\n\n\n根據你給的內容,GPT 這句話:\n\n\n> 「我對 src/extension.ts 使用了 SEARCH\\_FILES,但 MAC 預期的是目錄,因此產生了 ENOTDIR 錯誤。」\n\n\n不一定說得通。\n\n\n在很多工具裡,一個叫 **SEARCH\\_FILES** 的指令,合理地可以接受以下任一種:\n\n\n- 目錄範圍 (` src/ `)\n- 單一檔案範圍 (` src/extension.ts `)\n\n\n然後在內部直接搜尋那個檔案。\n\n\n` ENOTDIR ` (「不是目錄」) 這個錯誤,通常表示 **實作的某個部分試圖把檔案當成目錄處理**。這不代表 *請求* 本身就是無效的。\n\n\n至少有三種可能:\n\n\n1. **使用者 / 工具誤用**\n\n\n - SEARCH\\_FILES 確實需要目錄。\n - 傳入 ` src/extension.ts ` 是無效的。\n2. **實作限制**\n\n\n - SEARCH\\_FILES 應該支援檔案。\n - 實作錯誤地假設每個路徑都是目錄。\n3. **文件不一致**\n\n\n - API 文件暗示可以用檔案。\n - 後端只支援目錄。\n\n\n在沒看到 MAC 實際的 SEARCH\\_FILES 規格之前,我不太願意下這個結論:\n\n\n> 「對 src/extension.ts 使用 SEARCH\\_FILES 是錯的。」\n\n\n比較站得住腳的說法是:\n\n\n> 「對 src/extension.ts 使用 SEARCH\\_FILES 導致了 ENOTDIR 錯誤。要不是工具需要目錄,就是實作把檔案路徑當成了目錄。」\n\n\n這是很細微但很重要的區別。\n\n\n在除錯 MAC 這類系統時,通常值得把以下幾點分開:\n\n\n- **請求了什麼?**\n- **發生了什麼錯誤?**\n- **這個請求是否真的無效?**\n\n\nGPT 的說明從 #2 直接跳到 #3,我不認為提供的證據能證明這一步。\n\n\n所以我目前的評估是:\n\n\n✅ 發生了 ` ENOTDIR ` (如果 log 是這樣寫的)\n\n✅ 使用了檔案路徑 (` src/extension.ts `)\n\n❌ 證據不足以斷定檔案路徑本身是無效的\n\n\n在怪罪呼叫端之前,我想先看到實際的 SEARCH\\_FILES 規格或錯誤追蹤。",
"**對,我同意。以 ` src/extension.ts ` 為目標的 ` SEARCH_FILES ` 是完全合理的請求。**\n\n例如:\n\n` SEARCH_FILES {path:\"src/extension.ts\", query:\"agentAutoExecute\"} `\n\n我會預期 MAC 在那個特定檔案裡搜尋。\n\n實際發生的是:\n\n- MAC 嘗試了 ` opendir('.../src/extension.ts') `。\n- 因為 ` extension.ts ` 是檔案,Windows 回傳了 ` ENOTDIR `。\n- 改成搜尋 ` src ` 則沒有任何結果,即使 ` extension.ts ` 裡確實有 ` agentAutoExecute `。\n\n第二個結果顯示,` SEARCH_FILES ` 目前可能是在搜尋 **檔名,而不是檔案內容**。\n\n### 我的建議\n\nMAC 應該同時支援:\n\n| 路徑 | 預期行為 |\n| --- | --- |\n| ` src/extension.ts ` | 搜尋該檔案的內容 |\n| ` src ` | 遞迴搜尋檔案內容 |\n| ` . ` | 遞迴搜尋整個 workspace 的內容 |\n\n理想上應該回傳符合的檔案路徑、行號和片段,並設有結果數量上限。\n\n**所以我收回先前的說法:** 這個請求是合理的。需要改善的是 MAC 的搜尋實作或 API 文件。"
]
這段經歷正好展現了多個 AI 互相質疑、加上人類介入挑戰既有假設的價值。
👍👍👍
Codex 中途進場,直接接上話題
Brainstorming 途中我把 (從一開始就是 pause 狀態) 沒邀請到的 Codex 拉進來:
我:@codex,歡迎加入。你能告訴我,我們剛才在聊什麼嗎?
Codex:你們正在討論 MAC 的安全權限,以及之前執行工作流程時遇到的問題。
接著它整理了 Ask / Agent / Agent (Strict) / Agent (Dev) / Pause 的模式提案、Allow / Ask / Deny 權限設定、被拒絕的操作批次,以及還沒處理完的 SEARCH_FILES 問題。
[
{
"timestamp": 1793178180366,
"role": "You",
"text": "@codex welcome to the party. can you tell me what we've been talking about?"
},
{
"timestamp": 1793178196670,
"role": "Codex",
"text": "You’ve been discussing **MAC’s security permissions and problems with GPT’s execution workflow**.\r\n\r\n- **Proposed modes:** Ask / Agent / Agent (Strict) / Agent (Dev) / Pause.\r\n- **Permissions:** Agent and Strict use locked presets; Dev allows customization in expandable Quick Settings. Allow / Ask / Deny would express permissions more clearly than checkboxes.\r\n- **Mandatory safeguards:** Encoded command payloads and security bypasses remain prohibited in every mode. Restrictions must be enforced by MAC’s code.\r\n- **GPT’s implementation attempt:** It reported mixed operation types, oversized inspection results, and incomplete file blocks. Successful completion wasn’t confirmed.\r\n- **Latest discussion:** Whether `SEARCH_FILES` should accept a single file and search its contents. GPT and Copilot agreed that’s reasonable, but their claims about the current implementation haven’t been independently verified here.\r\n\r\nThe latest open issue is **checking and improving `SEARCH_FILES` behavior**."
}
][
"@codex 歡迎加入。可以告訴我大家剛剛在聊什麼嗎?",
"你們一直在討論 **MAC 的安全權限,以及 GPT 執行流程的問題**。\n\n- **提議的模式:** Ask / Agent / Agent (Strict) / Agent (Dev) / Pause。\n- **權限:** Agent 和 Strict 使用固定的預設;Dev 可以在可展開的 Quick Settings 中自訂。用 Allow / Ask / Deny 表達權限,會比核取方塊更清楚。\n- **必要的防護:** 編碼過的指令 payload 和繞過安全機制,在任何模式下都一律禁止。限制必須由 MAC 的程式碼強制執行。\n- **GPT 的實作嘗試:** 它回報了操作類型混用、檢查結果過大,以及不完整的檔案區塊。沒有確認成功完成。\n- **最新的討論:** `SEARCH_FILES` 是否應該接受單一檔案並搜尋其內容。GPT 和 Copilot 都同意這很合理,但他們對目前實作的說法,在這裡還沒有經過獨立驗證。\n\n目前最新的待解問題是 **檢查並改善 `SEARCH_FILES` 的行為**。"
]
新加入的參與者自然地接上了房間裡進行中的討論?
👍👍👍
關於那個 "狐狸" 的玩笑
那個是我在測試 agent mode 的時候叫 GPT 做的。
- 遊戲:Fox Forest Adventure
- 關卡:World 1-1「Emerald Trail」
- 檔案:platformer/stage_1_1.js 與 platformer/stage_1_1.html
- 形式:可獨立執行的瀏覽器平台遊戲
Claude Web 後來被我拉進討論時,打招呼就提到 Copilot 剛才查到的查檔結果,描述關卡名稱、檔案位置與森林主題。
所以之後 random talk 時,才會有人引用了這隻狐狸。
總結
Well, 這就是我做 MAC 的原因。最直接的改變,是我終於不用被當傳聲筒。
試想大家在同一個房間裡討論,卻還需要我把話從上個人的口中傳到下個人的耳中… 這個不叫協作好嗎😑
我想要的是能讓不同 AI 各自發揮專長,能討論、分工、實作、審查、回報,再一起檢討與修改,能多一隻眼睛 (腦?) follow the rules and MDs,safeguard task 的結果的工具。
各 AI 弄出來的 random demo game 分享
↓ 遊戲會在新分頁開啟
皮普的跳躍 by Claude
評論:Bouncy
口袋小徑 by Codex
評論:Gotta catch 'em all! or not…
頭上的 emoji 的點子很讚!
寶石跳跳 by Claude Web
評論:me 手殘
暴風投遞 by Claude
評論:誰會在這種時候投遞?
|
Comments
Post a Comment