fix: dedup working_mem hint, flush incremental output tail, sche_tasks path, CLI KeyboardInterrupt handling; add Termux instructions to README

This commit is contained in:
Liang Jiaqing
2026-02-18 11:05:40 +08:00
parent b4ee34cbc6
commit 55b5b4f8a3
12 changed files with 252 additions and 35 deletions

View File

@@ -59,6 +59,14 @@ cp mykey_template.py mykey.py
python launch.pyw python launch.pyw
``` ```
**Also runs on Android** — tested successfully on Termux with `python agentmain.py` (CLI frontend):
```bash
# In Termux
cd /sdcard/ga
python agentmain.py
```
Once running, tell the agent: *"Execute web setup SOP to unlock browser tools"* — it handles the rest. See [WELCOME_NEW_USER.md](WELCOME_NEW_USER.md) for the full bootstrap sequence. Once running, tell the agent: *"Execute web setup SOP to unlock browser tools"* — it handles the rest. See [WELCOME_NEW_USER.md](WELCOME_NEW_USER.md) for the full bootstrap sequence.
## vs. Alternatives ## vs. Alternatives
@@ -193,6 +201,14 @@ cp mykey_template.py mykey.py
python launch.pyw python launch.pyw
``` ```
**同样可在 Android 上运行** — 已在 Termux 上测试通过,通过 `python agentmain.py`CLI 前端)启动:
```bash
# 在 Termux 中
cd /sdcard/ga
python agentmain.py
```
启动后告诉 Agent"执行 web setup SOP 解锁浏览器工具"——剩下的它自己搞定。完整引导流程见 [WELCOME_NEW_USER.md](WELCOME_NEW_USER.md)。 启动后告诉 Agent"执行 web setup SOP 解锁浏览器工具"——剩下的它自己搞定。完整引导流程见 [WELCOME_NEW_USER.md](WELCOME_NEW_USER.md)。
## 对比 ## 对比

View File

@@ -80,6 +80,7 @@ class GeneraticAgent:
handler = GenericAgentHandler(None, self.history, './temp') handler = GenericAgentHandler(None, self.history, './temp')
if self.handler and self.handler.key_info: if self.handler and self.handler.key_info:
handler.key_info = self.handler.key_info handler.key_info = self.handler.key_info
if '如你确信任务已经改变' not in handler.key_info:
handler.key_info += '\n如你确信任务已经改变,请先更新工作记忆去除无用部分\n' handler.key_info += '\n如你确信任务已经改变,请先更新工作记忆去除无用部分\n'
self.handler = handler self.handler = handler
self.llmclient.backend = self.llmclient.backends[self.llm_no] self.llmclient.backend = self.llmclient.backends[self.llm_no]
@@ -93,6 +94,7 @@ class GeneraticAgent:
if len(full_resp) - last_pos > 50: if len(full_resp) - last_pos > 50:
display_queue.put({'next': full_resp[last_pos:] if self.inc_out else full_resp, 'source': source}) display_queue.put({'next': full_resp[last_pos:] if self.inc_out else full_resp, 'source': source})
last_pos = len(full_resp) last_pos = len(full_resp)
if self.inc_out and last_pos < len(full_resp): display_queue.put({'next': full_resp[last_pos:], 'source': source})
if '</summary>' in full_resp: full_resp = full_resp.replace('</summary>', '</summary>\n\n') if '</summary>' in full_resp: full_resp = full_resp.replace('</summary>', '</summary>\n\n')
if '</file_content>' in full_resp: full_resp = re.sub(r'<file_content>\s*(.*?)\s*</file_content>', r'\n````\n<file_content>\n\1\n</file_content>\n````', full_resp, flags=re.DOTALL) if '</file_content>' in full_resp: full_resp = re.sub(r'<file_content>\s*(.*?)\s*</file_content>', r'\n````\n<file_content>\n\1\n</file_content>\n````', full_resp, flags=re.DOTALL)
display_queue.put({'done': full_resp, 'source': source}) display_queue.put({'done': full_resp, 'source': source})
@@ -139,17 +141,18 @@ if __name__ == '__main__':
open('./temp/scheduler.log', 'a', encoding='utf-8').write(f'[{datetime.now():%m-%d %H:%M}] {tag}\n{item["done"]}\n\n') open('./temp/scheduler.log', 'a', encoding='utf-8').write(f'[{datetime.now():%m-%d %H:%M}] {tag}\n{item["done"]}\n\n')
while True: while True:
now = datetime.now() now = datetime.now()
for f in os.listdir('./tasks/pending'): for f in os.listdir('./sche_tasks/pending'):
m = re.match(r'(\d{4}-\d{2}-\d{2})_(\d{4})_', f) m = re.match(r'(\d{4}-\d{2}-\d{2})_(\d{4})_', f)
if m and now >= datetime.strptime(f'{m[1]} {m[2]}', '%Y-%m-%d %H%M'): if m and now >= datetime.strptime(f'{m[1]} {m[2]}', '%Y-%m-%d %H%M'):
raw = open(f'./tasks/pending/{f}', encoding='utf-8').read() raw = open(f'./sche_tasks/pending/{f}', encoding='utf-8').read()
dq = agent.put_task(f'按scheduled_task_sop执行任务文件 ../tasks/pending/{f}立刻移到running\n内容:\n{raw}', source='scheduler') dq = agent.put_task(f'按scheduled_task_sop执行任务文件 ../sche_tasks/pending/{f}立刻移到running\n内容:\n{raw}', source='scheduler')
threading.Thread(target=drain, args=(dq, f), daemon=True).start() threading.Thread(target=drain, args=(dq, f), daemon=True).start()
break break
time.sleep(55 + random.random() * 10) time.sleep(55 + random.random() * 10)
else: else:
agent.inc_out = True agent.inc_out = True
while True: while True:
try:
q = input('> ').strip() q = input('> ').strip()
if not q: continue if not q: continue
dq = agent.put_task(q, source='user') dq = agent.put_task(q, source='user')
@@ -157,3 +160,6 @@ if __name__ == '__main__':
item = dq.get() item = dq.get()
if 'next' in item: print(item['next'], end='', flush=True) if 'next' in item: print(item['next'], end='', flush=True)
if 'done' in item: print(); break if 'done' in item: print(); break
except KeyboardInterrupt:
agent.abort()
print('\n[Interrupted]')

View File

@@ -6,4 +6,4 @@ Insight是索引L2/L3变更时同步Insight。写记忆前先读META-SOP(L0)
2. 决策前查记忆库;未查证不断言。 2. 决策前查记忆库;未查证不断言。
3. 分步执行逐步验证3次失败请求干预。 3. 分步执行逐步验证3次失败请求干预。
4. 密钥文件仅引用,不读取/移动。 4. 密钥文件仅引用,不读取/移动。
5. 写任何记忆前读META-SOP核验。 5. 写任何记忆前读META-SOP核验memory下文件只能patch修改除非新建

View File

@@ -13,8 +13,7 @@ def _dump_u2():
import uiautomator2 as u2 import uiautomator2 as u2
d = u2.connect() d = u2.connect()
xml_str = d.dump_hierarchy() xml_str = d.dump_hierarchy()
if xml_str and len(xml_str) > 100: if xml_str and len(xml_str) > 100: return xml_str
return xml_str
except Exception as e: except Exception as e:
print(f"[u2 fallback] {e}") print(f"[u2 fallback] {e}")
return None return None
@@ -24,9 +23,7 @@ def _dump_native():
subprocess.run([ADB, "shell", "rm", "-f", "/sdcard/ui.xml"], capture_output=True) subprocess.run([ADB, "shell", "rm", "-f", "/sdcard/ui.xml"], capture_output=True)
r = subprocess.run([ADB, "shell", "uiautomator", "dump", "--compressed", "/sdcard/ui.xml"], r = subprocess.run([ADB, "shell", "uiautomator", "dump", "--compressed", "/sdcard/ui.xml"],
capture_output=True, text=True, timeout=15) capture_output=True, text=True, timeout=15)
if "dumped" not in r.stdout.lower() and "dumped" not in r.stderr.lower(): if "dumped" not in r.stdout.lower() and "dumped" not in r.stderr.lower(): print(f"dump failed: {r.stdout}{r.stderr}"); return None
print(f"dump failed: {r.stdout}{r.stderr}")
return None
subprocess.run([ADB, "pull", "/sdcard/ui.xml", LOCAL_XML], capture_output=True, timeout=10) subprocess.run([ADB, "pull", "/sdcard/ui.xml", LOCAL_XML], capture_output=True, timeout=10)
with open(LOCAL_XML, "r", encoding="utf-8") as f: with open(LOCAL_XML, "r", encoding="utf-8") as f:
return f.read() return f.read()
@@ -36,6 +33,8 @@ def _parse_xml(xml_str, keyword=None, clickable_only=False, raw=False):
root = ET.fromstring(xml_str) root = ET.fromstring(xml_str)
nodes = [] nodes = []
for n in root.iter("node"): for n in root.iter("node"):
pkg = n.get("package", "")
if "termux" in pkg.lower(): continue
text = n.get("text", "") text = n.get("text", "")
desc = n.get("content-desc", "") desc = n.get("content-desc", "")
bounds = n.get("bounds", "") bounds = n.get("bounds", "")
@@ -43,20 +42,17 @@ def _parse_xml(xml_str, keyword=None, clickable_only=False, raw=False):
cls = n.get("class", "").split(".")[-1] cls = n.get("class", "").split(".")[-1]
rid = n.get("resource-id", "") rid = n.get("resource-id", "")
label = text or desc label = text or desc
if not label and not raw: if not label and not raw: continue
continue if clickable_only and not click: continue
if clickable_only and not click: if keyword and keyword.lower() not in label.lower(): continue
continue
if keyword and keyword.lower() not in (label or "").lower():
continue
cx, cy = 0, 0 cx, cy = 0, 0
if bounds: if bounds:
m = re.findall(r'\[(\d+),(\d+)\]', bounds) m = re.findall(r'\[(\d+),(\d+)\]', bounds)
if len(m) == 2: if len(m) == 2:
cx = (int(m[0][0]) + int(m[1][0])) // 2 cx = (int(m[0][0]) + int(m[1][0])) // 2
cy = (int(m[0][1]) + int(m[1][1])) // 2 cy = (int(m[0][1]) + int(m[1][1])) // 2
nodes.append({"label": label, "click": click, "bounds": bounds, nodes.append({"text": text or desc, "click": click,
"cx": cx, "cy": cy, "class": cls, "id": rid}) "bounds": bounds, "cx": cx, "cy": cy, "class": cls, "id": rid})
return nodes return nodes
def ui(keyword=None, clickable_only=False, raw=False): def ui(keyword=None, clickable_only=False, raw=False):
@@ -66,15 +62,13 @@ def ui(keyword=None, clickable_only=False, raw=False):
raw: 返回原始节点列表而非打印 raw: 返回原始节点列表而非打印
""" """
xml_str = _dump_u2() or _dump_native() xml_str = _dump_u2() or _dump_native()
if not xml_str: if not xml_str: print("dump failed (both u2 and native)"); return []
print("dump failed (both u2 and native)")
return []
nodes = _parse_xml(xml_str, keyword, clickable_only, raw) nodes = _parse_xml(xml_str, keyword, clickable_only, raw)
if not raw: if not raw:
for n in nodes: for n in nodes:
flag = "Y" if n["click"] else " " flag = "Y" if n["click"] else " "
coord = f"({n['cx']},{n['cy']})" if n['cx'] else "" coord = f"({n['cx']},{n['cy']})" if n['cx'] else ""
print(f"[{flag}] {n['label']} {coord} {n['bounds']}") print(f"[{flag}] {n['text']} {coord} {n['bounds']}")
print(f"\ntotal: {len(nodes)} nodes") print(f"\ntotal: {len(nodes)} nodes")
return nodes return nodes

View File

@@ -3,7 +3,7 @@
授权你进行自主行动,只要不对环境造成副作用都可进行。 授权你进行自主行动,只要不对环境造成副作用都可进行。
请先选择核心目标,再选择一个小目标进行。最终探测结果形成报告(含操作申请),待用户回来确认后再进行可能的写入或修改操作。 请先选择核心目标,再选择一个小目标进行。最终探测结果形成报告(含操作申请),待用户回来确认后再进行可能的写入或修改操作。
> **启动时写入工作记忆**`自主探索≤15回合只有cwd内可写用户不在(问题存报告)|收尾:更新history.txt+重读本SOP检查遗漏产出=报告+记忆提案` > **启动时写入工作记忆**`自主探索≤15回合只有cwd内可写用户不在(问题存报告)|收尾:重读本SOP检查遗漏+更新history|产出=报告+记忆提案`
## 🎯 核心目标(按价值优先级排序) ## 🎯 核心目标(按价值优先级排序)
@@ -44,7 +44,8 @@
### 阶段 1自主探测用户离开时 ### 阶段 1自主探测用户离开时
- **启动检查** - **启动检查**
- 读取可能有的 `./autonomous_reports/history.txt` 了解历史记录。 - 读取可能有的 `./autonomous_reports/history.txt` 了解历史记录。
- **不连续选择相同方向** - **TODO优先**若cwd下存在 `TODO.txt`优先从中选择任务执行任务完成后从TODO.txt中移除对应条目
- **不连续选择相同方向**TODO任务除外
- **预期收益声明**:选定任务后,必须先用一句话写明「做这个任务预期带来什么收益」。允许探索失败,但必须事先想清楚为什么值得做。这句话写入报告开头。 - **预期收益声明**:选定任务后,必须先用一句话写明「做这个任务预期带来什么收益」。允许探索失败,但必须事先想清楚为什么值得做。这句话写入报告开头。
- **执行方式**:基于目标自由进行,无需预先批准,直接执行只读或实验性操作。 - **执行方式**:基于目标自由进行,无需预先批准,直接执行只读或实验性操作。
- **约束**小步快跑每次只做一个小任务剩下的下次再做控制在15个回合以内。严禁修改核心记忆/系统设置;严禁读取敏感数据(但可以检测存在性)。 - **约束**小步快跑每次只做一个小任务剩下的下次再做控制在15个回合以内。严禁修改核心记忆/系统设置;严禁读取敏感数据(但可以检测存在性)。

View File

@@ -1,13 +1,13 @@
# 定时任务 SOP # 定时任务 SOP
目录:`../tasks/{pending,running,done}/` 目录:`../sche_tasks/{pending,running,done}/`
文件名:`YYYY-MM-DD_HHMM_描述.md`内容含prompt和schedule 文件名:`YYYY-MM-DD_HHMM_描述.md`内容含prompt和schedule
## 流程 ## 流程
1. [AUTO]唤醒 → `datetime.now()`取当前时间,`ls ../tasks/pending/`,文件名时间≤当前→到期,选择一个 1. [AUTO]唤醒 → `datetime.now()`取当前时间,`ls ../sche_tasks/pending/`,文件名时间≤当前→到期,选择一个
2. **立即rename到running/**(先占再读,防多进程重复领) 2. **立即rename到running/**(先占再读,防多进程重复领)
3. 读文件执行 3. 读文件执行
4. 完成→移到done/**在文件内追加执行报告**供用户查阅 4. 完成→移到done/**在文件内追加执行报告**供用户查阅
5. schedule非once→算下次时间新建文件到pending/ 5. schedule非once→算下次时间新建文件到pending/
注意tasks目录在../即你的code root下 注意sche_tasks目录在../即你的code root下

View File

@@ -40,3 +40,17 @@
- "访问"链接:遍历所有`a``textContent.includes('访问')`的href - "访问"链接:遍历所有`a``textContent.includes('访问')`的href
- 缩略图base64结果中`img[src^="data:image"]`可直接提取保存 - 缩略图base64结果中`img[src^="data:image"]`可直接提取保存
- 下载大图时注意JS返回的src可能被截断`return img.src`获取完整URL - 下载大图时注意JS返回的src可能被截断`return img.src`获取完整URL
## Chrome下载PDFfetch+blob方案
- 场景页面上的PDF链接点击后会在浏览器内预览而非下载
- 方案用JS `fetch(url)` 获取blob → `URL.createObjectURL(blob)` → 创建隐藏`<a>`标签设`download`属性 → 触发click → 自动下载到~/Downloads
- 模板:
```js
fetch('PDF_URL').then(r=>r.blob()).then(b=>{
const a=document.createElement('a');
a.href=URL.createObjectURL(b);
a.download='filename.pdf';
a.click();
});
```
- 注意需同源或CORS允许跨域时可能需要先导航到目标域再执行

View File

@@ -0,0 +1,36 @@
schedule: daily 0800
prompt: 按ezgmail_sop读取所有未读邮件判断是否有重要信息紧急/截止日期/需回复的),将摘要写入执行报告。全部设为已读。
---
执行时间: 2026-02-15 08:01:23
---
## 执行报告
## 未读邮件检查报告
**检查时间**: 2026-02-15 08:02:11
**未读邮件总数**: 3
### 重要邮件 (2封)
- **624215 是你的 X 验证码**
发件人: X <info@x.com>
日期: Sat, 14 Feb 2026 16:34:06 +0000
备注: X平台验证码624215如正在登录请使用
- **CACTER邮件安全海外接收隔离区邮件通知目录摘要/CACTER Safe overseas reception quarantine email notification abstract**
发件人: emailgateway@cacter.com
日期: Fri, 13 Feb 2026 18:06:12 +0800 (CST)
备注: 邮件安全隔离区通知,可能有邮件被隔离
### 普通邮件 (1封)
- COLLABORATION OPPORTUNITY FOR RELIABLE SUPPLY OF PHARMACEUTICAL RAW MATERIALS.
发件人: Karen Lucille Hale <karenlucillehale285@gmail.com>
备注: 可疑商业合作邮件,疑似垃圾邮件
**执行状态**: 成功
**完成时间**: 2026-02-15 08:02:24

View File

@@ -0,0 +1,33 @@
schedule: daily 0800
prompt: 按ezgmail_sop读取所有未读邮件判断是否有重要信息紧急/截止日期/需回复的),将摘要写入执行报告。全部设为已读。
---
# 邮件检查报告 - 2026-02-16 08:01
## 摘要
- 总计未读邮件2 封
- 重要邮件1 封
- 普通邮件1 封
## 重要邮件详情
### 1. ARR January 2026 会议通知
- **发件人**: ARR - January 2026
- **主题**: [ARR January] Author-reviewer discussion phase starts now
- **日期**: 2026-02-15 23:40
- **重要性**: 高 - 有时间限制
- **说明**: 学术会议作者-审稿人讨论阶段已开始,需要及时查看审稿意见并准备回复
- **建议**: 尽快登录 OpenReview 查看审稿意见并准备回复
## 普通邮件
### 1. Academia.edu 引用通知
- **发件人**: Academia Mentions
- **主题**: Are you the "JiaQing Liang" cited in Artificial Intelligence papers?
- **说明**: 营销邮件,通知有论文引用了相关姓名
## 操作记录
- 所有邮件已标记为已读
- 执行时间: 2026-02-16 08:01:18

View File

@@ -0,0 +1,33 @@
# 邮件检查执行报告
**执行时间**: 2026-02-17 08:01:14
**任务**: 检查未读邮件
## 摘要
- 共检查 3 封未读邮件
- 重要邮件: 0 封
- 所有邮件已标记为已读
## 邮件详情
### [1] 普通
- **发件人**: do-not-reply@iclr.cc
- **主题**: ICLR 2026 Update Poster Presentation Details
- **日期**: Mon, 16 Feb 2026 22:47:44 +0000 (UTC)
### [2] 普通
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **主题**: [ARR - January 2026] An author commented on your submission. Paper Number: 4724, Paper Title: "CultureScope: A Dimensional Lens for Probing Cultural Understanding in LLMs"
- **日期**: Mon, 16 Feb 2026 15:02:09 +0000 (UTC)
### [3] 普通
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **主题**: [ARR - January 2026] An author commented on your submission. Paper Number: 4724, Paper Title: "CultureScope: A Dimensional Lens for Probing Cultural Understanding in LLMs"
- **日期**: Mon, 16 Feb 2026 14:43:11 +0000 (UTC)
## 结论
本次检查未发现需要紧急处理的邮件。
- ICLR 2026 会议通知:海报展示细节更新
- ARR论文评审作者评论通知2封
所有邮件已标记为已读。

View File

@@ -0,0 +1,82 @@
# 邮件检查执行报告
**执行时间**: 2026-02-18 08:00:54
**任务**: 检查未读邮件 (daily 0800)
## 执行结果
- **总未读邮件数**: 13 封
- **重要邮件数**: 8 封
- **处理状态**: 所有邮件已标记为已读 ✓
## 重要邮件摘要
### 1. [ARR - January 2026] Official Review posted to your assigned Paper number: 2021, Paper title: "Sparse-RL: Breaking the Memory Wall in LLM Reinforcement Learning via Stable Sparse Rollouts"
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **日期**: Tue, 17 Feb 2026 23:45:24 +0000 (UTC)
- **摘要**: &#39;A submission to ARR - January 2026, for which you are an official area chair, has received a re
### 2. [ARR January/ACL 2026] pending review for submission 5119 please reply!
- **发件人**: acl2026 <acl2026pcs@gmail.com>
- **日期**: Tue, 17 Feb 2026 22:09:57 +0000
- **摘要**: Dear Jiaqing and Nanyun You are the AC and SAC for paper 5119, which still has a missing review. The
### 3. [ARR January/ACL 2026] pending review for submission 4966 please reply!
- **发件人**: acl2026 <acl2026pcs@gmail.com>
- **日期**: Tue, 17 Feb 2026 22:04:02 +0000
- **摘要**: Dear Jiaqing and Nanyun You are the AC and SAC for paper 4966, which still has a missing review. The
### 4. [ICML 2026] clarification regarding emergency reviewing
- **发件人**: OpenReview <noreply@openreview.net>
- **日期**: Tue, 17 Feb 2026 21:40:32 +0000 (UTC)
- **摘要**: Dear Jiaqing Liang, Thanks again for agreeing to act as an emergency reviewer for ICML during the pe
### 5. [ARR - January 2026] An author commented on your submission. Paper Number: 215, Paper Title: "What Makes an Ideal Quote? Recommending “Unexpected yet Rational” Quotations via Novelty"
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **日期**: Tue, 17 Feb 2026 09:29:39 +0000 (UTC)
- **摘要**: An author commented on your submission. Paper number: 215 Paper title: What Makes an Ideal Quote? Re
### 6. [ARR - January 2026] An author commented on your submission. Paper Number: 215, Paper Title: "What Makes an Ideal Quote? Recommending “Unexpected yet Rational” Quotations via Novelty"
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **日期**: Tue, 17 Feb 2026 09:28:56 +0000 (UTC)
- **摘要**: An author commented on your submission. Paper number: 215 Paper title: What Makes an Ideal Quote? Re
### 7. [ARR - January 2026] An author commented on your submission. Paper Number: 215, Paper Title: "What Makes an Ideal Quote? Recommending “Unexpected yet Rational” Quotations via Novelty"
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **日期**: Tue, 17 Feb 2026 09:26:03 +0000 (UTC)
- **摘要**: An author commented on your submission. Paper number: 215 Paper title: What Makes an Ideal Quote? Re
### 8. [ARR - January 2026] An author commented on your submission. Paper Number: 215, Paper Title: "What Makes an Ideal Quote? Recommending “Unexpected yet Rational” Quotations via Novelty"
- **发件人**: ARR - January 2026 <arr-january2026-notifications@openreview.net>
- **日期**: Tue, 17 Feb 2026 09:23:23 +0000 (UTC)
- **摘要**: An author commented on your submission. Paper number: 215 Paper title: What Makes an Ideal Quote? Re
## 重要信息分析
本次检查发现以下需要关注的邮件:
1. **ARR/ACL 2026 审稿相关** (5封)
- Paper 2021 收到新的 Official Review
- Paper 5119 和 4966 有 pending review 需要回复
- Paper 215 收到4条作者评论
2. **ICML 2026 紧急审稿** (1封)
- 关于 emergency reviewing 的说明
**建议行动**:
- 优先处理 Paper 5119 和 4966 的 pending review 回复请求
- 查看 Paper 215 的作者评论并回复
- 查看 Paper 2021 的新 review
## 执行状态
✓ 任务执行成功
✓ 所有未读邮件已标记为已读

View File

@@ -0,0 +1,2 @@
schedule: daily 0800
prompt: 按ezgmail_sop读取所有未读邮件判断是否有重要信息紧急/截止日期/需回复的),将摘要写入执行报告。全部设为已读。