V0.5 release
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index afc9ff445..3cb03f374 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -30,10 +30,10 @@ To reach version v0.5, approximately 70% of the following tasks need to be compl
    4. Complete the design and implementation of module breakdown
    5. Support various modes of memory: clearly distinguish between long-term and short-term memory
    6. Perfect the test role, and carry out necessary interactions with humans
-   7. Allowing natural communication between roles (expected v0.5.0)
+   7. ~~Allowing natural communication between roles~~ (v0.5.0)
    8. Implement SkillManager and the process of incremental Skill learning (experimentation done with game agents)
    9. Automatically get RPM and configure it by calling the corresponding openai page, so that each key does not need to be manually configured
-   10. IMPORTANT: Support incremental development (expected v0.5.0)
+   10. ~~IMPORTANT: Support incremental development~~ (v0.5.0)
 3. Strategies
    1. Support ReAct strategy (experimentation done with game agents)
    2. Support CoT strategy (experimentation done with game agents)
@@ -45,8 +45,8 @@ To reach version v0.5, approximately 70% of the following tasks need to be compl
    2. Implementation: Knowledge search, supporting 10+ data formats
    3. Implementation: Data EDA (expected v0.6.0)
    4. Implementation: Review
-   5. Implementation: Add Document (expected v0.5.0)
-   6. Implementation: Delete Document (expected v0.5.0)
+   5. ~~Implementation~~: Add Document (v0.5.0)
+   6. ~~Implementation~~: Delete Document (v0.5.0)
    7. Implementation: Self-training
    8. ~~Implementation: DebugError~~ (v0.2.1)
    9. Implementation: Generate reliable unit tests based on YAPI
diff --git a/metagpt/roles/role.py b/metagpt/roles/role.py
index 1e7ebf711..48688ad5f 100644
--- a/metagpt/roles/role.py
+++ b/metagpt/roles/role.py
@@ -25,9 +25,8 @@
 
 from pydantic import BaseModel, Field
 
-from metagpt.actions import Action, ActionOutput
+from metagpt.actions import Action, ActionOutput, UserRequirement
 from metagpt.actions.action_node import ActionNode
-from metagpt.actions.add_requirement import UserRequirement
 from metagpt.llm import LLM, HumanProvider
 from metagpt.logs import logger
 from metagpt.memory import Memory
@@ -127,17 +126,7 @@ def history(self) -> list[Message]:
         return self.memory.get()
 
 
-class _RoleInjector(type):
-    def __call__(cls, *args, **kwargs):
-        instance = super().__call__(*args, **kwargs)
-
-        if not instance._rc.watch:
-            instance._watch([UserRequirement])
-
-        return instance
-
-
-class Role(metaclass=_RoleInjector):
+class Role:
     """Role/Agent"""
 
     def __init__(self, name="", profile="", goal="", constraints="", desc="", is_human=False):
@@ -149,10 +138,9 @@ def __init__(self, name="", profile="", goal="", constraints="", desc="", is_hum
         self._states = []
         self._actions = []
         self._role_id = str(self._setting)
-        self._rc = RoleContext()
+        self._rc = RoleContext(watch={any_to_str(UserRequirement)})
         self._subscription = {any_to_str(self), name} if name else {any_to_str(self)}
 
-
     def _reset(self):
         self._states = []
         self._actions = []
@@ -203,8 +191,7 @@ def _watch(self, actions: Iterable[Type[Action]]):
         """Watch Actions of interest. Role will select Messages caused by these Actions from its personal message
         buffer during _observe.
         """
-        tags = {any_to_str(t) for t in actions}
-        self._rc.watch.update(tags)
+        self._rc.watch = {any_to_str(t) for t in actions}
         # check RoleContext after adding watch actions
         self._rc.check(self._role_id)
 
@@ -401,6 +388,8 @@ async def run(self, with_message=None):
                 msg = with_message
             elif isinstance(with_message, list):
                 msg = Message("\n".join(with_message))
+            if not msg.cause_by:
+                msg.cause_by = UserRequirement
             self.put_message(msg)
 
         if not await self._observe():
diff --git a/metagpt/schema.py b/metagpt/schema.py
index 5aec378e4..758149efa 100644
--- a/metagpt/schema.py
+++ b/metagpt/schema.py
@@ -121,10 +121,6 @@ def __init__(
         :param send_to: Specifies the target recipient or consumer for message delivery in the environment.
         :param role: Message meta info tells who sent this message.
         """
-        if not cause_by:
-            from metagpt.actions import UserRequirement
-            cause_by = UserRequirement
-
         super().__init__(
             id=uuid.uuid4().hex,
             content=content,
diff --git a/metagpt/startup.py b/metagpt/startup.py
index f930c386b..e886ad2a4 100644
--- a/metagpt/startup.py
+++ b/metagpt/startup.py
@@ -26,7 +26,7 @@ def startup(
     ),
     reqa_file: str = typer.Option(default="", help="Specify the source file name for rewriting the quality test code."),
     max_auto_summarize_code: int = typer.Option(
-        default=-1,
+        default=0,
         help="The maximum number of times the 'SummarizeCode' action is automatically invoked, with -1 indicating unlimited. This parameter is used for debugging the workflow.",
     ),
 ):
diff --git a/metagpt/team.py b/metagpt/team.py
index a5c405f80..5ce07ef13 100644
--- a/metagpt/team.py
+++ b/metagpt/team.py
@@ -3,10 +3,11 @@
 """
 @Time    : 2023/5/12 00:30
 @Author  : alexanderwu
-@File    : software_company.py
+@File    : team.py
 @Modified By: mashenquan, 2023/11/27. Add an archiving operation after completing the project, as specified in
         Section 2.2.3.3 of RFC 135.
 """
+import warnings
 from pydantic import BaseModel, Field
 
 from metagpt.actions import UserRequirement
@@ -47,7 +48,7 @@ def _check_balance(self):
             raise NoMoneyException(CONFIG.total_cost, f"Insufficient funds: {CONFIG.max_budget}")
 
     def run_project(self, idea, send_to: str = ""):
-        """Start a project from publishing user requirement."""
+        """Run a project from publishing user requirement."""
         self.idea = idea
 
         # Human requirement.
@@ -55,6 +56,16 @@ def run_project(self, idea, send_to: str = ""):
             Message(role="Human", content=idea, cause_by=UserRequirement, send_to=send_to or MESSAGE_ROUTE_TO_ALL)
         )
 
+    def start_project(self, idea, send_to: str = ""):
+        """
+        Deprecated: This method will be removed in the future.
+        Please use the `run_project` method instead.
+        """
+        warnings.warn("The 'start_project' method is deprecated and will be removed in the future. "
+                      "Please use the 'run_project' method instead.",
+                      DeprecationWarning, stacklevel=2)
+        return self.run_project(idea=idea, send_to=send_to)
+
     def _save(self):
         logger.info(self.json(ensure_ascii=False))
 
diff --git a/setup.py b/setup.py
index 730fffd35..57290f4cd 100644
--- a/setup.py
+++ b/setup.py
@@ -30,7 +30,7 @@ def run(self):
 
 setup(
     name="metagpt",
-    version="0.5.0",
+    version="0.5.2",
     description="The Multi-Role Meta Programming Framework",
     long_description=long_description,
     long_description_content_type="text/markdown",
diff --git a/tests/metagpt/test_role.py b/tests/metagpt/test_role.py
index 8fac2503c..611d321fc 100644
--- a/tests/metagpt/test_role.py
+++ b/tests/metagpt/test_role.py
@@ -14,11 +14,11 @@
 import pytest
 from pydantic import BaseModel
 
-from metagpt.actions import Action, ActionOutput
+from metagpt.actions import Action, ActionOutput, UserRequirement
 from metagpt.environment import Environment
 from metagpt.roles import Role
 from metagpt.schema import Message
-from metagpt.utils.common import get_class_name
+from metagpt.utils.common import any_to_str, get_class_name
 
 
 class MockAction(Action):
@@ -60,7 +60,7 @@ class Input(BaseModel):
             name=seed.name, profile=seed.profile, goal=seed.goal, constraints=seed.constraints, desc=seed.desc
         )
         role.subscribe({seed.subscription})
-        assert role._rc.watch == set({})
+        assert role._rc.watch == {any_to_str(UserRequirement)}
         assert role.name == seed.name
         assert role.profile == seed.profile
         assert role._setting.goal == seed.goal

Update version and fix bugs encountered in v0.5