{
  "schema": "article-experiment-source/v1",
  "description": "Verbatim same-day analysis probe sources; not executed during Production.",
  "sources": [
    {
      "name": "probe-context.py",
      "sha256": "5eb4d7a9d3197cbd93b879d6d463893dc4fe3e050959af5c83c803c4986d25d1",
      "language": "python",
      "source": "\"\"\"Execute unchanged upstream class ASTs with explicit minimal dependency stubs.\"\"\"\nfrom __future__ import annotations\nimport sys, pathlib, ast, asyncio, json, hashlib, datetime, importlib.metadata\nB=pathlib.Path(__file__).resolve().parent\nsys.path.insert(0,str(B/'probe-deps'))\nfrom pydantic import BaseModel, ConfigDict, Field, PrivateAttr\nfrom enum import Enum\nfrom typing import List, Type\nfrom asyncio import Queue, QueueEmpty, wait_for\nJSONDecodeError=json.JSONDecodeError\nclass Logger:\n    def debug(self,*args):pass\n    def warning(self,*args):pass\nlogger=Logger()\nclass Message(BaseModel):\n    id:str\n    content:str\n    def dump(self):return self.model_dump_json()\n    @staticmethod\n    def load(data):return Message.model_validate_json(data)\nclass Memory(BaseModel):\n    storage:list[Message]=Field(default_factory=list)\nclass Action:pass\nclass BaseEnvironment:pass\nraw=B/'inputs/sources/github-followups.json'\nschema=json.loads(raw.read_text(encoding='utf8'))[1]['value']['structuredContent']['content']\nrole=(B/'inputs/sources/source-05.txt').read_text(encoding='utf8')\nnodes=[]\nfor source,name in [(schema,'MessageQueue'),(role,'RoleReactMode'),(role,'RoleContext')]:\n    node=next(n for n in ast.parse(source).body if isinstance(n,ast.ClassDef) and n.name==name)\n    nodes.append(node)\n    module=ast.fix_missing_locations(ast.Module(body=[ast.ImportFrom(module='__future__',names=[ast.alias(name='annotations')],level=0),node],type_ignores=[]))\n    exec(compile(module,'source-derived-'+name,'exec'),globals())\nMessageQueue.model_rebuild(); RoleContext.model_rebuild()\nasync def run():\n    records=[]\n    for n in [0,1,3]:\n        context=RoleContext(memory=Memory(storage=[Message(id='observed',content='old')]))\n        for i in range(n):context.msg_buffer.push(Message(id=f'pending-{i}',content=f'body-{i}'))\n        model=context.model_dump()\n        restored=RoleContext.model_validate(model)\n        lost=[m.id for m in restored.msg_buffer.pop_all()]\n        explicit=await context.msg_buffer.dump()\n        helper=MessageQueue.load(explicit)\n        recovered=[m.id for m in helper.pop_all()]\n        assert 'msg_buffer' not in model and lost==[]\n        assert recovered==[f'pending-{i}' for i in range(n)]\n        assert restored.memory.storage[0].id=='observed'\n        records.append(dict(pendingInput=n,serializedKeys=sorted(model),restoredPendingIDs=lost,retainedObservedIDs=[m.id for m in restored.memory.storage],explicitHelperRestoredIDs=recovered))\n    return records\nout=dict(date='2026-11-03',executedAt=datetime.datetime.now(datetime.timezone.utc).isoformat(),topic='SIG-20261103-002',question='Does the unchanged upstream RoleContext Pydantic model-dump/validate roundtrip retain pending inbox contents while retaining observed memory?',method='Source-derived isolated class probe; MessageQueue, RoleReactMode and RoleContext ASTs unchanged. Message, Memory, Action, BaseEnvironment and logger are explicit minimal stubs; not a full MetaGPT Team reproduction.',versions={p:importlib.metadata.version(p) for p in ['pydantic','pydantic-core','annotated-types','typing-extensions','typing-inspection']},sourceHashes={p.name:hashlib.sha256(p.read_bytes()).hexdigest() for p in [raw,B/'inputs/sources/source-05.txt',B/'inputs/sources/source-06.txt']},sourceGitBlobs=dict(role='49b1d1787ecf30616bd670b0e96dca676908ce5e',schema='52badcc21ae4e8372529ec2becf6ee104c39e85c',team='5a9838885070add38a7cdd3ddf034ea40768d4b2'),astSha256=hashlib.sha256(''.join(ast.dump(n) for n in nodes).encode()).hexdigest(),controls=asyncio.run(run()),limitations=['Pydantic 2.12.3 is our pinned probe dependency, not a verified upstream lockfile environment.','No Team, MGX, actual Memory/Message serialization, subclass hooks, LLM or crash execution.','Explicit helper success is quiescent only; it does not establish active checkpoint integration, atomicity, durable storage or exactly-once effects.','No full repository commit is claimed; retained source Git blobs and SHA-256 bytes pin the evaluated classes.'])\n(B/'experiment-context.json').write_text(json.dumps(out,indent=2),encoding='utf8')\nprint(json.dumps(out))\n"
    },
    {
      "name": "probe-queue.py",
      "sha256": "b7d2c6d1b7109c1b9cb92509e8f17aae1104d9256ce5731a9069cc623a72d715",
      "language": "python",
      "source": "import ast, asyncio, json, pathlib, hashlib, sys, datetime\nfrom asyncio import Queue, QueueEmpty, wait_for\nB=pathlib.Path(__file__).resolve().parent\nraw=B/'inputs/sources/github-followups.json'\nsource=json.loads(raw.read_text(encoding='utf8'))[1]['value']['structuredContent']['content']\ntree=ast.parse(source)\nqueue=next(n for n in tree.body if isinstance(n,ast.ClassDef) and n.name=='MessageQueue')\nmethods=[n for n in queue.body if isinstance(n,(ast.FunctionDef,ast.AsyncFunctionDef))]\n# Compile upstream method bodies unchanged; model construction and Message are explicit stubs.\nfrom typing import List\nclass Message:\n    def __init__(self,id,content):self.id,self.content=id,content\n    def dump(self):return json.dumps(dict(id=self.id,content=self.content))\n    @staticmethod\n    def load(data):return Message(**json.loads(data))\nclass Logger:\n    def debug(self,*args):pass\n    def warning(self,*args):pass\nlogger=Logger()\nJSONDecodeError=json.JSONDecodeError\nnode=ast.ClassDef(name='MessageQueue',bases=[],keywords=[],body=methods,decorator_list=[])\nmodule=ast.fix_missing_locations(ast.Module(body=[ast.ImportFrom(module='__future__',names=[ast.alias(name='annotations')],level=0),node],type_ignores=[]))\nexec(compile(module,'source-derived-MessageQueue','exec'),globals())\ndef init(self):self._queue=Queue()\nMessageQueue.__init__=init\nasync def run():\n    out=[]\n    for count in (0,1,3):\n        q=MessageQueue()\n        expected=[dict(id=f'm{i}',content=f'body{i}') for i in range(count)]\n        for x in expected:q.push(Message(**x))\n        dumped=await q.dump()\n        restored=MessageQueue.load(dumped)\n        before=[vars(m) for m in q.pop_all()]\n        after=[vars(m) for m in restored.pop_all()]\n        assert before==after==expected\n        out.append(dict(count=count,originalQueueAfterDump=before,restoredQueue=after,pass_=True))\n    return out\nout=dict(date='2026-11-03',executedAt=datetime.datetime.now(datetime.timezone.utc).isoformat(),question='Do extracted upstream queue dump/load methods preserve IDs, order and original quiescent inbox contents?',method='Source-derived isolated method probe with stdlib asyncio queue, stub Message codec and stub model constructor; no Pydantic, Role, Team or MGX execution.',sourceArtifactSha256=hashlib.sha256(raw.read_bytes()).hexdigest(),sourceGitBlob='52badcc21ae4e8372529ec2becf6ee104c39e85c',methodAstSha256=hashlib.sha256(ast.dump(node).encode()).hexdigest(),controls=asyncio.run(run()),limits=['Quiescent 0/1/3-message helpers only; not checkpoint integration, crash injection, concurrency atomicity or exactly-once effects.','Python import pydantic failed with ModuleNotFoundError. Dependency installation attempt was interrupted after no output/progress; bounded retry logged separately.','Exclusion of RoleContext.msg_buffer and absent Team integration remain source observations, not a measured full-system defect.'])\n(B/'experiment-queue.json').write_text(json.dumps(out,indent=2),encoding='utf8')\nprint(json.dumps(out))\n"
    }
  ]
}
