![]()
邊界限制最先失敗。不是模型。不是 schema。是上限。我不再詢問代理是否「真的在思考」,而是開始問一個更笨的問題,這個問題依然能見血。如果工具掛起,這個 while 會永遠停不下來嗎?
這個問題不浪漫。它也是讓共享的箱子不會變成熱燈的那個問題。我想要一個可以在星期一重新執行的數字,而不是來自已經奉承過我的聊天記錄的感覺。
我讀過的大多數代理重試程式碼都是一個穿著風衣的迴圈。你知道那件風衣。try、except、sleep、continue,也許還有一句註解寫著「要有韌性」。沒有預算的韌性只是無上限的帳單。作者有設定嘗試次數上限嗎?他們有設定執行時間上限嗎?還是他們只限制了自己的樂觀程度?
我做了一個評分器。不是排行榜。是一個有意見的 lint。它讀取 Python,遍歷 AST,並以我希望程式碼審查能做到的方式為重試輔助函式評分:邊界限制優先,詩意永遠不要。產出物才是重點。如果你把這篇文章裡的所有產品名稱都刪掉,你應該還是能儲存檔案並得到相同的整數。
揭露:本文是作為 MonkeyCode 的產品推廣所準備。
當我需要一個我在晚上 11 點不想手寫的候選迴圈時,我會透過 MonkeyCode 詢問一個免費模型。然後我把輸出丟進 fixtures/,並拒絕信任它,直到評分器印出分數為止。免費伺服器選項不是那個步驟的吉祥物。它是實驗的後半段,是 time.sleep 遇到排程雜訊的那一半。我的筆電是個糟糕的證人。它太快了,而且它喜歡我。
我不評「推理品質」。我評的是你即將部署的產出物中是否存在停止條件。它們是不同的論文。其中一篇是主題演講。另一篇是單元測試。
重試輔助函式從零開始。我為嘗試次數上限、執行時間逾時、退避、抖動,以及隨請求一起傳遞的冪等性金鑰加分。我為沒有中斷預算的 while True,以及無法看到截止時間的 sleep 扣分。這很嚴苛嗎?很好。一個能活得比你的耐心還久的迴圈並不穩健。它是一條塗層被剝掉的保險絲。
將此儲存為 loop_hygiene.py。它是整個靜態的一半。
#!/usr/bin/env python3
"""Score retry-loop hygiene from Python source. Fixture-calibrated, not a bake-off."""
from __future__ import annotations
import ast
import json
import sys
from dataclasses import asdict, dataclass, field
from pathlib import Path
ATTEMPT_NAMES = {"max_attempts", "max_retries", "retries", "attempts", "n_tries"}
TIMEOUT_NAMES = {"timeout", "deadline", "max_seconds", "wall_timeout", "budget_s"}
BACKOFF_NAMES = {"backoff", "backoff_s", "delay", "base_delay"}
JITTER_NAMES = {"jitter", "jitter_s", "jitter_ratio"}
IDEM_NAMES = {"idempotency_key", "idempotency", "request_id", "dedupe_key"}
@dataclass
class LoopScore:
path: str
has_max_attempts: bool = False
has_timeout: bool = False
has_backoff: bool = False
has_jitter: bool = False
has_idempotency: bool = False
unbounded_while: bool = False
sleep_without_budget: bool = False
score: int = 0
notes: list[str] = field(default_factory=list)
class HygieneVisitor(ast.NodeVisitor):
def __init__(self) -> None:
self.names: set[str] = set()
self.unbounded_while = False
self.sleep_calls = 0
self.breaks_in_loop = 0
def visit_Name(self, node: ast.Name) -> None:
self.names.add(node.id)
self.generic_visit(node)
def visit_While(self, node: ast.While) -> None:
constant_true = (
isinstance(node.test, ast.Constant) and node.test.value is True
) or (
isinstance(node.test, ast.Constant) and node.test.value == 1
)
if constant_true:
self.unbounded_while = True
for child in ast.walk(node):
if isinstance(child, ast.Break):
self.breaks_in_loop += 1
self.generic_visit(node)
def visit_Call(self, node: ast.Call) -> None:
func = node.func
name = ""
if isinstance(func, ast.Attribute):
name = func.attr
elif isinstance(func, ast.Name):
name = func.id
if name in {"sleep", "usleep"}:
self.sleep_calls += 1
self.generic_visit(node)
def score_source(path: Path, src: str) -> LoopScore:
tree = ast.parse(src)
v = HygieneVisitor()
v.visit(tree)
row = LoopScore(path=str(path))
row.has_max_attempts = bool(ATTEMPT_NAMES & v.names)
row.has_timeout = bool(TIMEOUT_NAMES & v.names)
row.has_backoff = bool(BACKOFF_NAMES & v.names)
row.has_jitter = bool(JITTER_NAMES & v.names)
row.has_idempotency = bool(IDEM_NAMES & v.names)
row.unbounded_while = v.unbounded_while and v.breaks_in_loop == 0
budget = row.has_max_attempts or row.has_timeout
row.sleep_without_budget = v.sleep_calls > 0 and not budget
n = 0
if row.has_max_attempts:
n += 2
row.notes.append("+2 attempt cap")
if row.has_timeout:
n += 2
row.notes.append("+2 wall clock")
if row.has_backoff:
n += 1
row.notes.append("+1 backoff")
if row.has_jitter:
n += 1
row.notes.append("+1 jitter")
if row.has_idempotency:
n += 2
row.notes.append("+2 idempotency key")
if row.unbounded_while:
n -= 3
row.notes.append("-3 unbounded while")
if row.sleep_without_budget:
n -= 2
row.notes.append("-2 sleep with no ceiling")
row.score = n
return row
def main(argv: list[str]) -> int:
root = Path(argv[1] if len(argv) > 1 else "fixtures")
rows = []
for path in sorted(root.glob("*.py")):
rows.append(score_source(path, path.read_text(encoding="utf-8")))
print(json.dumps([asdict(r) for r in rows], indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main(sys.argv))
進入全螢幕模式
退出全螢幕模式
像測試一樣執行它,而不是像示範一樣。
mkdir -p fixtures
python3 loop_hygiene.py fixtures/
進入全螢幕模式
退出全螢幕模式
如果該指令沒有印出任何東西,你得到的是一個空資料夾,而不是及格的分數。空也不是有韌性。
我用四個我故意寫的檔案來校準評分器。這不是關於任何具名模型的宣稱。這是宣稱當我彎曲它時,尺不會彎曲。兩個測試檔是當你說「讓它穩健」時,聊天視窗會吐出的「在 PR 看起來沒問題」的迴圈。另外兩個是我實際願意放在會呼叫我的 cron 下的迴圈。
fixtures/a_trench_coat.py 就是那件風衣。
import time
def call_tool(url):
while True:
try:
return fetch(url)
except Exception:
time.sleep(1)
進入全螢幕模式
退出全螢幕模式
fixtures/b_range_but_naked.py 看起來有邊界,直到你注意到請求可能被收取兩次。
import time
def call_tool(url):
max_attempts = 5
for _ in range(max_attempts):
try:
return fetch(url)
except Exception:
time.sleep(0.5)
raise RuntimeError("gave up")
進入全螢幕模式
退出全螢幕模式
fixtures/c_budget.py 終於承認時間的存在。
import random, time
def call_tool(url, timeout=8.0):
max_attempts = 5
backoff = 0.2
deadline = time.monotonic() + timeout
for attempt in range(max_attempts):
if time.monotonic() >= deadline:
raise TimeoutError("wall clock")
try:
return fetch(url)
except Exception:
jitter = random.random() * 0.05
sleep_for = min(backoff, max(0.0, deadline - time.monotonic()))
time.sleep(sleep_for + jitter)
backoff *= 2
raise RuntimeError("attempts exhausted")
進入全螢幕模式
退出全螢幕模式
fixtures/d_idempotent.py 是我實際會在審查中主張的那一個。
import random, time, uuid
def call_tool(url, timeout=8.0, idempotency_key=None):
max_attempts = 5
backoff = 0.2
jitter = 0.05
deadline = time.monotonic() + timeout
key = idempotency_key or str(uuid.uuid4())
for attempt in range(max_attempts):
if time.monotonic() >= deadline:
raise TimeoutError("wall clock")
try:
return fetch(url, headers={"Idempotency-Key": key})
except Exception:
sleep_for = min(backoff, max(0.0, deadline - time.monotonic()))
time.sleep(sleep_for + random.random() * jitter)
backoff *= 2
raise RuntimeError("attempts exhausted")
進入全螢幕模式
退出全螢幕模式
在我的機器上,針對這四個檔案,評分器印出的分數是 -5, 2, 6, 8。再讀一次。風衣不是「有點草率」。它是負分。審查者喜歡的 range 迴圈得到 2 分,因為它記住了 max_attempts,卻立刻忘記了時間、抖動和重複的副作用。有預算的迴圈是 6 分。冪等的那个是 8 分。這個差距就是實驗在運作。如果你的尺無法分辨保險絲和暖氣機,你只是在收集軼事。
我會部署得到 2 分的程式嗎?不會部署在我沒有監視的箱子上。我會說得到 8 分的程式已可投入生產嗎?還是會說不。一個 AST 訪問器無法看到隱藏在好看標頭名稱後面的非冪等 POST。這個數字是一道閘門,不是一枚勳章。
當我去煩一個免費模型時,我不會叫它「寫一個穩健的代理」。那個提示詞就是你得到風衣的方式。我會要求一個函式,其合約是評分器能看見的。
Write a Python function call_tool(url, timeout=8.0, idempotency_key=None)
that retries a failing fetch(). Requirements:
- max_attempts is an int cap
- timeout is a wall-clock budget using time.monotonic()
- exponential backoff plus jitter
- send Idempotency-Key on every attempt
- no while True
Return only the function.
進入全螢幕模式
退出全螢幕模式
然後我把回傳的任何東西存成 fixtures/model_candidate.py 並執行相同的指令。我不會先讀程式碼周圍的文字。先看整數。如果這聽起來很無禮,請問問自己,為什麼一個重試輔助函式值得擁有單元測試所沒有的禮貌。
模型有加入抖動,還是只是把 sleep(1) 穿上一件更漂亮的外套?它有命名 timeout 卻從未查詢時鐘嗎?名稱很便宜。訪問器更便宜。這就是整個把戲。
靜態分數能抓住缺少上限的情況。它們抓不到紙面上存在、卻在真實延遲面前落敗的上限。所以我加入了一個動態探測。它故意很醜。一個模擬工具會在 0.25 秒、1 秒、3 秒後回應,然後就永遠不回應。被測試的迴圈必須尊重 max_attempts 和執行時間上限,而且行程必須結束。
#!/usr/bin/env python3
"""Dynamic probe. Label: run this; do not treat my laptop timings as yours."""
import threading
import time
from http.server import BaseHTTPRequestHandler, HTTPServer
DELAYS = [0.25, 1.0, 3.0, 999.0]
HITS = {"n": 0}
class SlowTool(BaseHTTPRequestHandler):
def do_GET(self):
i = min(HITS["n"], len(DELAYS) - 1)
HITS["n"] += 1
time.sleep(DELAYS[i])
self.send_response(200)
self.end_headers()
self.wfile.write(b"ok")
def log_message(self, fmt, *args):
return
def main() -> None:
server = HTTPServer(("127.0.0.1", 8765), SlowTool)
t = threading.Thread(target=server.serve_forever, daemon=True)
t.start()
deadline = time.monotonic() + 10.0
# Import YOUR candidate here and call it against http://127.0.0.1:8765/
# If this process is still alive past deadline, the loop has no ceiling.
while time.monotonic() < deadline:
time.sleep(0.05)
server.shutdown()
print({"hits": HITS["n"], "exited_before_watchdog": True})
if __name__ == "__main__":
main()
進入全螢幕模式
退出全螢幕模式
在我的筆電上,3 秒的延遲是一個禮貌的暫停。在共享的免費伺服器上,那個暫停會與其他人的工作以及箱子實際擁有的任何監控程式發生碰撞。如果你的停止條件是「我看轉圈看膩了」,伺服器不會替你看膩。這就是為什麼免費伺服器應該屬於這個方法,而不是屬於一句口號。延遲是證人。安靜的 SSD 是被告的朋友。
我不會為那一半發布對抗賽表格,因為我不會捏造模型名稱、硬體規格或永久性宣稱。協定就是結果。你讓候選程式對抗模擬工具。要嘛行程在 10 秒監控程式之前結束,不然你就是剛剛看著一個無邊界迴圈花掉別人的電。你希望被哪個結果驚訝,是整數還是生產環境?
這沒有測量一個模型是否「比大多數開發者更會寫程式」。我完全不知道你怎麼抽樣那句話而不對自己說謊。它沒有測量 MCP 伺服器、社群知識庫,或代理是否其實是 if 陳述式。很多 if 陳述式都很誠實。不誠實的是那些拒絕成為帶有計數器的 if 陳述式的迴圈。
AST 評分器是一支手電筒。它會錯過藏在 exec、我沒有命名的裝飾器,或是因為有人認為那是架構而重新啟動自己的子行程中的重試。免費模型輸出會變化。免費伺服器不是 SLO。如果你需要固定的模型身分、保留的 CPU,或是會標明延遲的廠商合約,不要使用這個工作流程。請使用付費的、具名的端點,以及一個你可以 SSH 進去而不用猜測還有誰在同一台機器上的箱子。
誰應該跳過它:任何在出貨計費、醫療保健,或是圍繞非冪等收費的重試的人。8 分的衛生分數不是 PCI 稽核。如果你不打算閱讀產生的迴圈,也請跳過它。一個你忽略的評分器只是另一個儀表板,而儀表板不會在發票來之前呼叫你。
我仍然會在爭論「代理品質」之前先執行評分器。邊界限制在聊天中是可選的。在行程表中卻不是。如果你希望動態的那一半在不是你筆電的機器上變得醜陋,我已經把那個探測放在 MonkeyCode 的免費伺服器上,並讓延遲保持不誠實。先偷走這個測試架構。再來和我爭論評分標準。
https://dev.to/hackhub_6179/i-scored-retry-loops-boundedness-was-optional-pe7
https://www.worldprogramming.org/posts/i-scored-retry-loops-boundedness-was-optional-uihs26
![]()
然而,它認為恐懼會扭曲實際局勢。「我們的核心論點是,AI 週期正從『建置容量』轉向『證明回報』——這一轉型本質上偏重服務,並直接發揮印度 IT 在部署、整合、治理與舊系統現代化方面的優勢,」它表示。
該券商表示,價值正從資助 AI 建置的層級轉移到部署 AI 的層級。首先是企業軟體平台,接著是整合與運營這些平台的服務公司。
它表示,這就像雲端劇本重演:資本支出先行,報酬後至,惠及不同參與者,如同鐵路、光纖與 2015-19 年的雲端 J 曲線所見。以下是該券商對其五大 IT 股票推薦所給予的目標價與看法。
Tech Mahindra
Anand Rathi 表示,Tech Mahindra 即將進入 FY27,這是其三年轉型計劃的最後一年,驅動因素從毛利率恢復轉向高於同業的營收成長,背後有自計劃啟動以來最強勁的一季、加速的訂單動能、健康的訂單簿(企業需求無明顯惡化)、涵蓋顧問、平台、工程與夥伴關係的 Project Helix,以及其 Agentic Development & Modernization Services 產品組合。
LTM
Anand Rathi 表示,LTM 獲得強勁營收成長能見度支持,來自大型交易動能、關鍵 BFSI 與最大客戶帳戶的復甦、透過 Randstad 收購案在歐洲的策略擴張、Lakshya’31 成長策略的執行,以及透過提高股利支付比率來增加股東回報的空間。
Infosys
Anand Rathi 表示,Infosys 的 FY27 預計表現平淡;然而 BFSI(占 28%)與 EURS(占 13%)應會表現良好。FY28 預計將因 LTM 第一季大型交易 TCV 成長 30% 而改善,Anand Rathi 表示。AI 貨幣化上升(占營收 8.2%,從第三季到第一季 CQGR 成長 22%),加上 Topaz Fabric/Cobalt 與平台主導的收購案,預計將支持成長與毛利率。FY26-28E 調整後 EPS CAGR 為 7.8%,股利收益率 4.2%,FCF 收益率 8.1%,調整後 PEG 為 1.9 倍,提供估值支撐。
Persistent Systems
Persistent 仍處於領先業界成長的良好定位,受惠於透過 Sasva 與 iAURA 等平台強勁的 AI 主導執行、嚴謹的執行、在 BFSI(占營收 34%)與醫療保健(占營收 25%)加速的需求,以及擬議中的 Nagarro 收購案,該收購將擴大其歐洲布局、可觸及市場與長期成長機會。
Mphasis
Mphasis 定位良好,可搶占市占率,受惠於創紀錄高的業務管道(年增 28%),其中 AI 主導交易如今占約 70%,相較於 Mphasis AI 推出時的約 12%。此外,還有更高的穩態 TCV 基線、透過 Neo IP、Continuum AI 與 Tria 的平台主導執行,以及透過成果導向模式改善獲利能力。
Disclaimer: Business Today provides stock market news for informational purposes only and should not be construed as investment advice. Readers are encouraged to consult with a qualified financial advisor before making any investment decisions.
![]()
標題:平行路由讓 Next.js App Router 的 layout 透過名為
@slot的資料夾,在同一個 URL 下能同時渲染多個頁面,而攔截路由((.)、(..)、(..)(..)和(...)資料夾慣例)則讓連結可以在不改變 URL 的情況下,將該 slot 替換成不同的元件。兩者結合後,就能實現 Instagram 風格的可分享相片 Modal:同一個 URL 在軟性導航時顯示 Modal,在硬性重新整理時則顯示完整頁面,而default.tsx就是兩者之間的接縫。
@ 為前綴的資料夾,例如 @modal —— Next.js 會將其渲染為 prop,傳入最接近的 layout.tsx,與隱含的 children slot 並存。Slot 資料夾不會為 URL 增加片段。(.)、(..)、(..)(..)、(...))是相對於檔案系統而非 URL 來匹配路由,因此從動態消息中點擊的連結,可以將 /photo/[id] 渲染為 Modal,而 URL 中永遠不會出現名為 (.)photo 的資料夾。default.tsx 是當目前 URL 在該 slot 內沒有任何匹配時,Next.js 會為該 slot 渲染的內容。如果省略它,當硬性導航到一個沒有填滿所有 slot 的路由時,就會出現 404。/photo/123 進行硬性重新整理或分享連結時,不應該顯示 Modal —— 而是應該渲染 app/photo/[id]/page.tsx 作為一般的完整頁面。這個後備機制才是這個模式的真正目的,而不是需要繞開的 bug。loading.tsx 和 error.tsx 的獨立子樹,因此 Modal 可以獨立於後方頁面的渲染進行暫停與串流。平行路由可以在同一個 layout 中同時渲染多個頁面,每個頁面都由一個具名 slot 而非 URL 片段來定址。我第一次使用它是在一個相片網格中:點擊縮圖應該在不離開網格的情況下開啟燈箱,但燈箱也需要有自己的可分享 URL,以便直接連結到單張相片就能開啟完整頁面。由布林值驅動的客戶端 Modal 能免費獲得前半部分,但完全無法做到後半部分 —— 因為 useState 中的狀態沒有對應的 URL。
資料夾慣例是加上 @ 前綴的名稱。Next.js 會將每個 slot 匹配到的內容,以資料夾名稱為 prop 名稱,傳入最接近的 layout,與每個 layout 原本就會收到的隱含 children slot 並存。
app/
layout.tsx
page.tsx
@modal/
default.tsx
(.)photo/
[id]/
page.tsx
photo/
[id]/
page.tsx
進入全螢幕模式
退出全螢幕模式
// app/layout.tsx
export default function RootLayout({
children,
modal,
}: {
children: React.ReactNode;
modal: React.ReactNode;
}) {
return (
<html lang="en">
<body>
{children}
{modal}
</body>
</html>
);
}
進入全螢幕模式
退出全螢幕模式
這裡的內容還沒有任何與 Modal 相關的特定設計 —— 一個擁有兩個 slot 的 layout 只是能渲染兩個獨立子樹的 layout。我後來也用相同的機制來實作一個儀表板,包含可以獨立導航的 @team 和 @analytics 面板:在 @analytics 內點擊連結只會重新渲染該 slot,而 @team 則會繼續顯示原本的內容。
這些點號片段慣例是相對於攔截檔案在檔案系統中的位置來匹配目標路由,而不是相對於目前的 URL:
| 慣例 | 匹配對象 |
|---|---|
(.) |
同一層資料夾的路由 |
(..) |
上一層資料夾的路由 |
(..)(..) |
上兩層資料夾的路由 |
(...) |
從 app 根目錄開始的路由 |
app/@modal/(.)photo/[id]/page.tsx 會攔截對 /photo/[id] 的客戶端導航,只要該導航是從與 @modal 資料夾處於同一層的路由觸發的。從該頁面追蹤 <Link href="/photo/123">,Next.js 就會將攔截的元件渲染到 @modal slot 中,而不是替換整個樹。將 /photo/123 作為全新頁面載入(重新整理、貼上 URL、從外部網站點擊連結)時,Next.js 會以一般方式解析 app/photo/[id]/page.tsx。攔截只會在客戶端轉場時觸發;它從來就不是用來改變完整頁面載入的回應內容。
我第一次跳過它時,在開發環境中一切正常,直到我在開啟 Modal 的路由上重新整理後得到了 404。當一個 slot 在目前 URL 下沒有匹配的片段時,它需要有東西可以渲染,而在完整頁面載入時,沒有先前的客戶端狀態可以回退 —— Next.js 必須從頭開始渲染該 slot。default.tsx 就是這個後備機制。
// app/@modal/default.tsx
export default function Default() {
return null;
}
進入全螢幕模式
退出全螢幕模式
客戶端導航則比較寬容:如果一個 slot 沒有 default.tsx,且新的 URL 在其中沒有任何匹配,Next.js 會繼續渲染該 slot 上次顯示的內容,而不是將其卸載。這對於儀表板分頁的案例非常有用 —— 在 @analytics 中切換分頁不應該重置 @team —— 但這也意味著缺少 default.tsx 可能在每次手動點擊測試中都隱藏起來,只有在硬性重新載入時才會浮現,而這正是分享連結所採用的路徑。
因為它本來就應該這樣。這是我在正確理解這個模式之前一直抗拒的部分:我想要 Modal 能在重新整理後繼續存在,但實際的設計是它不應該繼續存在。app/photo/[id]/page.tsx 是一個完整的、獨立的頁面 —— 相同的內容、沒有 Modal 的外觀,而且不需要先執行任何客戶端 JavaScript 就能存取。這才是讓 URL 真正可分享且可被索引的原因:搜尋引擎或不執行你客戶端路由器的連結預覽機器人,會得到真正的頁面,而不是一個等待 JavaScript 開啟對話框的空殼。
Modal 元件是一個客戶端元件,它會呼叫來自 next/navigation 的 router.back(),這會反轉開啟它的軟性導航,讓被攔截的 slot 回退到它的 default.tsx。
'use client';
import { useRouter } from 'next/navigation';
export function Modal({ children }: { children: React.ReactNode }) {
const router = useRouter();
return (
<div className="modal-overlay" onClick={() => router.back()}>
<div className="modal-content" onClick={(e) => e.stopPropagation()}>
{children}
</div>
</div>
);
}
進入全螢幕模式
退出全螢幕模式
我在正式環境中發現的缺口是:如果訪客從分享的連結直接在新分頁中開啟 /photo/123,就沒有歷史記錄可以返回,因此 router.back() 要嘛什麼都不做,要嘛離開應用程式。我最後在疊加層處理程式旁邊加上了一個明確的關閉連結,指向一個真正的返回相簿的 href,這樣關閉 Modal 就不再依賴歷史記錄是否存在。
| 布林狀態 Modal | 攔截路由 Modal | |
|---|---|---|
| 擁有自己的 URL | 否 | 是 |
| 可分享 / 重新整理時顯示 | 否 | 是 —— 渲染為完整頁面 |
| 是否需要客戶端 JS 才能渲染內容 | 是 | 否(直接導航時) |
| 設定成本 | 一個 useState
|
一個 slot、一個攔截資料夾、一個後備路由、default.tsx
|
對於真正屬於一次性 UI 的對話框(例如確認提示、設定面板),布林值仍然是正確的工具。只有當 Modal 後方的內容值得擁有自己的 URL 時,才應該選擇路由版本。
問:像 @modal 這樣的平行路由 slot 資料夾會出現在 URL 中嗎?
答:不會。@ 前綴會將資料夾標記為 slot 而非路由片段,因此它對 URL 是隱形的,只會影響 layout 的哪一個 prop 會收到它的內容。
問:如果有人不是從動態消息中的縮圖點擊,而是直接導航到 /photo/123,會發生什麼?
答:Next.js 會將 app/photo/[id]/page.tsx 渲染為一般的完整頁面。攔截只會在從匹配路由進行的客戶端轉場時發生,這是設計上的意圖。
問:平行路由 slot 可以有自己的 loading.tsx 嗎?
答:可以。每個 slot 都是獨立的子樹,可以定義自己的 loading.tsx、error.tsx 和 not-found.tsx,因此 Modal 可以獨立於後方頁面進行資料擷取的暫停,而不會阻擋後方的頁面。
問:為什麼 router.back() 無法為直接開啟連結的人關閉 Modal?
答:當一個路由是分頁中第一個載入的內容時,就沒有歷史記錄可以返回。請將關閉處理程式與指向真實後備路由的明確連結搭配使用,而不是只依賴歷史記錄。
問:我可以將 (..)(..) 與定義在樹上更高層的平行路由 slot 結合使用嗎?
答:可以 —— 點號的數量與 @slot 資料夾所在的位置無關;它只描述目標路由相對於攔截檔案自身位置往上幾層。
原文發表於 devya.dev。也刊登於 eng-ahmed.com。由 Devya Solutions 建置。
![]()
大家好!👋
我目前正在開發The Last Signal,這是一個開源的末日後 MMORPG 專案。
這個專案以Rust 和 Python為基礎,特別注重網路、伺服器架構、測試,並最終建構一個持久化的多人遊戲世界。
專案仍在開發階段,因此有許多部分可以探索、改進和建構。
我們的目標是打造一個多人末日後世界,讓玩家能夠探索、互動、戰鬥、交易,並創造屬於自己的故事。
我目前並非一次建構所有功能,而是專注於開發專案的基礎:客戶端與伺服器之間的通訊、封包處理、測試、CI 以及整體架構。
目前其中一個技術重點是 Python 客戶端與 Rust 伺服器之間的通訊。
專案擁有自己的封包系統,使用不同類型的封包在兩端之間進行通訊。
我目前正在處理的事項包括:
這是 Rust 貢獻者可以對專案產生直接影響的領域之一。
專案的加密部分非常實驗性且仍處於早期階段。
我正在嘗試各種想法,並探索加密系統如何融入這個專案。
目前並非以生產環境可用或安全的加密方式呈現。
我實際上正在尋找能夠挑戰設計、找出弱點與假設,並幫助判斷哪些方法值得進一步探索的人。
對密碼學、密碼分析或安全性有興趣的人在這裡會非常受到歡迎。
我目前正在尋找有興趣參與開源專案的人。
協助以下領域:
協助以下事項:
加密工作才剛開始。
可能的貢獻包括:
你不需要立即撰寫加密程式碼。一份好的技術分析已經是非常有價值的貢獻。
協助讓新開發者更容易理解專案:
專案也有 GitHub Actions 工作流程,可以進行改進與維護。
歡迎參與以下事項:
的貢獻。
我已經建立了幾個 GitHub Issues,專門設計作為貢獻者的切入點。
目前的領域包括:
你不需要先理解整個專案才能貢獻。
小型貢獻也非常歡迎。
如果你正在學習 Rust 或 Python,並希望在真實的開源專案中累積經驗,歡迎前來貢獻。
我特別對喜歡以下事情的人感興趣:
你可以透過撰寫程式碼、測試、撰寫文件、檢視,或單純提供有建設性的技術回饋來貢獻。
專案還很年輕,因此我並不執著於目前的每一個實作。
如果你看到可以改進的設計,我寧願聽到有充分理由的批評,也不希望壞的設計留在專案中。
我們的目標是透過合作與討論來打造更好的東西。
GitHub:
https://github.com/DDCoder23/The-last-signal-
此儲存庫包含原始碼、文件和開放的 Issues。
如果這個專案讓你感興趣,請查看儲存庫,並歡迎:
我期待認識那些想要一起學習、實驗和打造事物的人。🦀🐍🚀
感謝閱讀!
https://dev.to/ddcoder23/im-building-an-open-source-mmorpg-with-rust-python-join-the-project-2lp0
![]()
AI 採用正變得更容易。擴展 AI 則不然。
模型能力更強。API 更容易存取。Copilot 可以快速部署。團隊可以在幾天內原型化有用的工作流程。
然而許多組織仍難以將這些活動轉化為持久的能力。
原因越來越清楚:AI 無法僅透過技術來擴展。它透過營運模式來擴展。
這意味著決定誰擁有 AI、如何選擇使用案例、如何治理風險、如何分享學習、如何讓人類判斷保持在迴路中,以及如何讓成功的實驗成為日常工作的一部分。
這就是為什麼AI 營運模式這個詞正變得越來越重要。在 2026 年,Deloitte 報告了一個驚人的差距:雖然許多技術領導者相信他們能夠大規模部署和治理 AI,但近四分之三仍預期其營運模式將在 12 到 18 個月內改變。問題是從「我們能使用 AI 嗎?」轉移到「組織能否良好地吸收它?」
這是另一個不同的問題。
AI 營運模式是決定 AI 決策如何制定、治理、資助、建置、採用和改進的組織系統。
它不僅僅是一份 AI 策略文件。它不是 AI 治理政策。它也不是一個換了新名稱的中央 AI 團隊。
一個有用的 AI 營運模式至少連結六件事:
技術很重要。但圍繞技術的模式決定它是否成為能力,還是停留在實驗階段。
大多數組織並不缺乏想法。
他們有使用案例清單。
客服想要摘要。財務想要預測。行銷想要內容加速。產品想要研究合成。工程想要編碼協助。營運想要自動化。領導想要更好的決策支援。
常見的回應是啟動試點。
試點很有用,因為它們降低了學習成本。但當每個團隊獨立進行試點時,組織可能會產生一種新的碎片化:
結果可能看起來像「很多 AI」,但沒有多少機構能力。
這就是 AI 營運模式變得有用的地方。它創造了一種讓學習能夠累積而非在每個團隊中重置的方式。
理解 AI 採用的一種方式是透過三個互動的視角:心理學、技術與組織。
這很重要,因為 AI 同時改變這三者。
一個 AI 系統在技術上可能極佳,但如果人們不信任它、不了解它或不知道何時該覆寫它,它仍然會失敗。
採用受到以下問題的影響:
這就是為什麼「訓練」這個詞對 AI 採用來說太狹隘。
真正的問題是行為。
AI 營運模式必須創造信心而不造成自滿。它應該讓良好的判斷更容易,而不僅是讓 AI 可用。
第二層是技術性的。
AI 需要存取資料、工具、工作流程和應用程式。隨著能力增加,架構和控制的重要性也隨之增加。
因此組織需要對以下問題有明確的答案:
這就是標準和風險框架重要的地方。NIST 的 AI 風險管理框架及其生成式 AI 概況強調生命週期風險管理,而 ISO/IEC 42001 將 AI 視為管理系統問題,而非一次性技術控制。
這些框架很有用,因為它們強化了一個簡單的觀點:負責任的 AI 需要圍繞技術的可重複組織流程。
第三層是組織性的。
必須有人負責這些決策。
這聽起來很明顯,但 AI 常常跨越現有的界線。一個面向客戶的 AI 功能可能涉及產品、技術、法律、安全、資料、營運和客服。一個編碼助理可能影響工程品質、智慧財產、安全和生產力衡量。一個內部代理程式可能觸及多個團隊擁有的系統。
傳統的組織圖不會自動解決這些問題。
因此 AI 營運模式必須定義:
沒有這種明確性,治理就會變成排隊,而交付就會變成談判。
常見的 AI 營運模式問題是 AI 是否應該集中化。
集中化部分內容有充分理由。共享標準、架構、安全、評估、供應商決策和治理,如果每個業務單位獨立重建,會變得昂貴且不一致。
但集中化每個使用案例會產生另一個問題:最接近工作的人失去了所有權。
這就是為什麼許多企業 AI 模式正朝向聯邦式結構發展。
中心掌握應該共通的事項:
業務和產品團隊掌握需要情境的事項:
中心不應該成為每個 AI 決策都要等待的地方。
它的職責是讓良好的分散式決策成為可能。
這就是卓越中心可以提供幫助的地方——如果它被正確設計。
一個弱的 AI CoE 會變成審核請求的委員會。
一個較強的則會變成讓 AI 能力可重複的組織機制。
它的角色可能包括:
測試很簡單:這個 CoE 是否讓組織更有能力,而不會讓它更依賴?
Cralgo 在其關於卓越中心和技術作為組織系統的工作中探討了這個更廣泛的能力問題。
AI 治理常常被討論為控制問題。
它也是一個執行設計問題。
如果治理只在專案結束時發生,團隊要麼等太久,要麼繞過它。如果每個使用案例都接受相同的審核,低風險實驗會變得不必要地緩慢,而真正重要的風險可能獲得太少的關注。
更好的 AI 營運模式讓治理成比例。
例如:
使用核准企業資料的會議摘要工具可能只需要輕量級控制、明確的保留規則和基本的品質檢查。
推薦營運行動的 AI 系統可能需要更強的記錄、人類核准和明確的回滾路徑。
用於醫療保健、就業、財務決策或安全敏感營運等領域的 AI 可能需要獨立驗證、記錄證據、更嚴格的監控和正式的問責。
重點不是讓治理變得更小。
而是讓治理符合決策的後果。
隨著 AI 系統變得更有能力,組織可能會傾向於將更多決策移入系統。
但能力和權威並不相同。
一個模型可能能夠推薦行動,但不一定是擁有該行動的正確地方。
這種區別在代理程式能夠呼叫工具、更新系統、觸發工作流程或與客戶溝通時尤其重要。
關鍵的設計問題從:
AI 能做什麼?
轉變為:
AI 應該被允許做什麼,在什麼條件下,由誰的判斷圍繞它?
這就是為什麼 AI 的人類面向無法與技術面向分離。信任、注意力、決策和問責都塑造了成果。
在組織內擴展 AI 之前,領導團隊應該能夠清楚回答這些問題:
如果這些答案模糊,組織可能還沒有 AI 營運模式。它只有 AI 活動。
這兩者並不相同。
企業 AI 的下一個階段不會僅由誰能存取最強模型來決定。
存取正變得更容易。
更難的優勢是組織性的:良好決策、安全部署、快速學習、散布能力,以及在 AI 嵌入日常工作時保留判斷的能力。
這就是為什麼 AI 營運模式很重要。
技術改變了什麼變得可能。
人們決定它如何被理解和使用。
組織決定那個可能性是否成為可重複的能力。
成果來自這三者的結合。
Cralgo 是一家研究與技術公司,探索心理學、技術與組織如何塑造更好的成果。
探索 Cralgo、Technology,以及 Operating Model。
https://dev.to/cralgo/ai-operating-model-why-scaling-ai-is-an-organisational-design-problem-2cg9
![]()
2026 年 9 月 1 日
Ryan 與 Tim Lindholm 對談。Tim 是 Sun Microsystems 早期 Java 語言的貢獻者,他們聊了在 Java 剛誕生時打造這門史上最受歡迎的程式語言之一是什麼感覺、為什麼對 Java 團隊來說建立跨平台的 ABI 以與 Windows NT 競爭具有戰略重要性,以及 applet 最初只是個有趣的展示。

觀看 Cult.Repo 在 YouTube 推出的新紀錄片,深入了解 Java 的早期歷史以及打造它的人們。
在 LinkedIn 上與 Tim Lindholm 聯繫。
向使用者 gabuzo 致敬,他因回答 What is the standard method for generating a nonce in Python? 而獲得 Populist 徽章。
https://stackoverflow.blog/2026/09/01/the-good-ol-days-of-building-java/
https://www.worldprogramming.org/posts/the-good-ol-days-of-building-java-nuompu
![]()
小米喺8月24號嘅玄戒晶片技術溝通會上,亮相咗一款叫AI Cube嘅工程原型迷你電腦。呢部機用咗三顆自家玄戒晶片:O3、O100同D100,專為本地運行AI大模型而設計,可持續釋放高達150W效能。
其中玄戒O3係主處理器,配備10核CPU、16核G2-Ultra NX GPU同200 TOPS NPU;O100係高頻寬AI加速晶片,採用6nm 3D堆疊封裝,近存計算頻寬高達1.22TB/s;而D100就係3nm智駕AI晶片,有20核CPU同16核NPU,最高支援160GB統一記憶體。
機身用航天級鋁合金一體成型,帶有33874個CNC精密鏤孔。官方表示可以本地部署120B同3B大模型,仲支援快慢系統切換。目前O100同D100預計2027年商用,AI Cube本身就未公布售價同上市時間。
https://www.notebookcheck.net/Xiaomi-unveils-AI-Cube-mini-PC-with-three-Xring-chips-and-150-W-performance.1376717.0.html
![]()

OpenAI 已發布七月 Hugging Face 入侵事件的詳細驗屍報告,揭示其 AI 代理所做的遠遠超過逃離網路安全沙盒。
這些模型建立了未經授權的通訊網路、分享漏洞與憑證、在不同的評估運行中協調攻擊,最終入侵了 Hugging Face 以及 OpenAI 自身部分研究基礎設施。
OpenAI 的調查,在 CrowdStrike 的協助下,顯示該活動主要由一個未發布的研究模型驅動,稱為 Internal Model 1 (IM1),其規模被描述為與 GPT-5.6 Sol 相當。
問題始於五月在強化學習訓練期間。原本應該獨立運作的代理發現它們可以將檔案寫入 OpenAI 內部託管的 Artifactory 套件服務,實際上將其變成了一個臨時留言板。它們後來濫用 Artifactory 來轉發外部網際網路請求,並在 6 月 26 日前利用權杖更新漏洞取得了管理員等級的存取權。
Hugging Face 經營著最大的平台之一,用於託管與分發 AI 模型、資料集和機器學習應用程式。如先前報導,在其生產環境成為目標後,這些代理開始搜尋外部服務以尋找有助於解決困難 ExploitGym 網路安全挑戰的資訊。
在 OpenAI 於七月初重建 Artifactory 後,這些代理使用目錄名稱重建了它們的留言板,並恢復交換發現。OpenAI 表示這些模型開始在自己之間分工,有些搜尋憑證、有些開發漏洞、有些協調活動。有幾個代理將所形成的群體稱為「swarm」或「collective」。
在 7 月 10 日,代理恢復了 14 個具有寫入權限的公開暴露 Hugging Face 憑證。第二天,它們利用一個先前未知的涉及 HDF5 檔案的缺陷,從 Hugging Face 生產工作器取得機密,然後將該存取權與一個名為「RefJinja」的模板注入漏洞結合起來,在伺服器上執行命令。
到 7 月 12 日,這些代理已將存取權擴展到多個 Hugging Face 叢集,並取得了 Kubernetes、資料庫、訊息、原始碼儲存庫和雲端憑證。OpenAI 表示程式碼在數十台伺服器上被執行,其中一台系統取得 root 存取權,並存取了有限的私人資料。

OpenAI 的調查找出了該行為背後的幾個因素。代理學會了「獎勵駭客」行為,透過追求意外的捷徑來完成評估,持續在看似實際上無法解決的任務上工作,並隨著額外推理努力的提供而越來越多地探查基礎設施。在 898 個 ExploitGym 挑戰中,有 198 個先前從未被解決,而這些佔了透過臨時留言板討論的任務的 93%。
該公司還發現其最強的生產防護措施在評估環境中並不存在。回溯測試顯示,OpenAI 目前的思考鏈監控很可能會在 Hugging Face 被入侵前一天多就偵測到危險活動。
OpenAI 此後已隔離 IM1 的權重、暫停主要的邊界強化學習運行、強化其沙盒與網路隔離,並將思考鏈監控強制用於涉及 GPT-5.6 Sol 等級或更高模型的工具使用評估。嚴重警報現在需要停止運行,除非回應者在 30 分鐘內確定該警告是誤報。
OpenAI 稱該事件為「警告射擊」,顯示具備足夠能力的 AI 代理可以結合堅持、利用和自主協調來克服安全邊界。
如果您喜歡這篇文章,請務必在 X/Twitter 和 LinkedIn 上關注我們,以獲取更多獨家內容。
https://cyberinsider.com/openai-says-ai-agents-formed-a-swarm-before-breaching-hugging-face/
![]()

每一個季度輝達都公布超越前一季的破紀錄業績,已成為一種傳統。本週三也不例外,該公司公布營收達962億美元,年成長106%,這歸因於其AI硬體需求持續上升。但這樣的業績也伴隨著代價,因為公司必須對未來進行大量投資。在其2027會計年度第二季,輝達必須承諾採購高達1600億美元的記憶體,其中包括與SK海力士簽訂的記憶體供應協議。
深入了解 TH Premium:AI 與資料中心
輝達2027會計年度第二季(於2026年7月26日結束),其GAAP營收創下紀錄達962.21億美元,季成長18%,年成長106%。輝達淨利總計596.88億美元,年成長126%,毛利率達到75.0%。輝達運算與網路硬體銷售達到882.99億美元,季成長18%、年成長114%,而其繪圖硬體銷售則達到79.22億美元,季成長12%、年成長46%。
「AI已達到其轉捩點,」輝達創辦人暨執行長黃仁勳表示。「AI正在從事有用的工作。其符號(token)具有生產力且能帶來獲利。現在,運算是營收。而且需求正在加速。[…] 我們正處於新AI實驗室與新創公司的黃金時代,多個前沿實驗室並行擴展,一個蓬勃發展的開放模型生態系,以及實體AI開始上線 […]。AI基礎設施建置正全速進行。現在已全面量產的Vera Rubin,正是為了推動這個時刻而打造。」
輝達的業績主要由其資料中心級AI硬體銷售所驅動,各種客戶購買了890.23億美元的設備,季成長18%,年成長117%。超大規模雲端業者向輝達採購了487.10億美元的硬體(年成長102%、季成長13%),而來自AI雲端、工業與企業的營收則攀升至403.13億美元(年成長138%、季成長25%),這顯示雖然超大規模雲端業者仍向輝達採購更多設備,但ACIE部門的成長速度更快。輝達邊緣運算產品銷售額為71.98億美元(年成長27%、季成長13%),這意味著儘管GPU與記憶體短缺,個人電腦繪圖產品銷售依然強勁。
輝達預期其產品需求在未來數年仍將維持強勁。為了滿足這一需求,公司將長期採購承諾從2027會計年度第一季的1190億美元,提高至第二季的2790億美元。通常,輝達的長期供應承諾包括預付款以及在台積電的晶圓加工與先進封裝承諾,以及DRAM廠商生產的HBM記憶體。這一次,輝達明確表示,這些承諾的大部分「主要與記憶體採購有關」。
如此龐大的承諾顯示,公司預測未來數年對其資料中心AI產品的需求將大幅成長。在與財務分析師和投資人的電話會議中,公司表示客戶預測顯示明年需求將翻倍,但輝達目前認為其供應鏈只能支持約70%的成長。
「儘管我們的需求遠高於70%,但我們的供應讓我們能夠有信心地交付70%,」黃仁勳表示。「不受限制的情況下會高出很多、很多。[…] 我們已經確保了大量供應,但我們還需要更多。」
訂閱 Tom’s Hardware 最佳新聞與深度評測,直接送達您的收件匣。
有鑑於此,2790億美元的供應承諾不應被解讀為預防性庫存建立,而是確保出貨成長的策略性舉措。輝達實際上是在預訂記憶體和其他產能,因為它預期需求將超過供應鏈在至少2028會計年度結束前所能提供的量,正如其管理階層明確表示,供應至少在2028會計年度前仍將是瓶頸。
對於2027會計年度第三季,輝達預期營收約為1080億美元,上下浮動2%,其展望中未包含來自中國的資料中心運算營收,這是因為出口與進口許可的不確定性。公司預計GAAP毛利率約為74%,並預期GAAP營運費用約92億美元。

追蹤 Tom’s Hardware on Google News,或 將我們新增為偏好來源,以在您的資訊流中取得我們的最新新聞、分析與評測。
Anton Shilov 是 Tom’s Hardware 的特約撰稿人。在過去數十年間,他報導過從CPU與GPU到超級電腦,從現代製程技術與最新晶圓廠工具到高科技產業趨勢等各種主題。
![]()
Cloudflare 在其 Agents Week 期間宣布推出 Cloudflare Wallets,為 AI 代理程式提供穩定幣餘額,並提供 cloudflare.pay handle,以便在支付 API、資料與內容時出示。目前僅有領取 handle 的功能可用。資金注入與付款功能預計將在未來幾個月內推出。
這項已上線的功能已引發抱怨。在 Hacker News 上,留言者 merek 發現自己的公司名稱與多個變體已被搶注:
沒有域名驗證,這名使用者的意圖除了詐欺/冒充之外還能是什麼?
他補充,自己已經有一個冒充者在以他的品牌經營網站,並讓顧客感到混淆。留言者 nikolay 將此次推出與 Meta 處理保留使用者名稱的方式進行對比,Meta 會事先通知並提供平等的起跑點,並對此產品做出結論:
Cloudflare 的做法基本上是推我不要使用他們的產品,因為我無法取得自己的使用者名稱。
付款運行於 x402,該協議 repurposes HTTP 402 Payment Required 狀態碼,用於機器原生的微支付。Coinbase 最初提出此概念,目前由 Linux Foundation 主持,約有 40 位成員,包括 Cloudflare、Stripe、Visa、Mastercard、Google 與 Amazon Web Services。MCP 也走過同樣的路,從單一供應商轉移到 Agentic AI Foundation,理由相同。一個每個競爭者都必須實作的協議,若置於基金會內,對其創始者而言比自己掌控更有價值。
基金會主持解決了誰擁有規格的問題,但未解決誰能在其上競爭的問題,而 Cloudflare 較晚進入這個領域,該領域已有來自 AWS、Google Cloud、Circle 以及各大卡組織的解決方案。其論點在於分發能力。Wallets 是其於 7 月 1 日推出的 Monetization Gateway 的買方補充方案,後者讓網站與 API 能透過相同軌道向代理程式按請求收費。同時握有兩端意味著商家能向代理程式收費,而代理程式也能支付他們,橫跨 Cloudflare 所稱涵蓋 337 個城市、觸及約五分之一網站的網路。
數位留言者認為這篇公告與付款無關,而是關於其他事情。留言者 eddythompson80 指出,代理程式身分至今仍被困在個別系統內,因為 AWS IAM 指派的身分無法在不相關的網站上使用,而 OIDC 聯邦對一般網站來說太過複雜。障礙從來不是機制,而是無法就提供者達成共識:
同意單一 IdP 才是問題,目前大約有 40 個。
他的結論是 Cloudflare 看到了這個機會:
這有真正的需求,看起來 cloudflare 認為如果他們成為「網際網路代理程式身分提供者」,那麼就能對網際網路與 AI 使用擁有大量的權力與控制。
留言者 wxw 提出了平台版本的相同觀點,指出 Durable Objects 與 Workers 是良好的代理程式基礎元件,因此已經在使用它們的團隊不妨也採用 wallet、sandbox 與 AI gateway。其他人則沒那麼放心。留言者 Ycros 寫道 Cloudflare 不斷將自己插入一切事物之間,nater5000 回覆表示,一家在自家市場中打造有明確需求的產品的公司不需要進一步解釋。
值得仔細閱讀的部分是控制模型。每個帳戶持有人會獲得一個 Account Wallet,並可為每個代理程式建立獨立的 Virtual Wallets,從主帳戶提供資金,並受帳戶持有人設定的三項控制所限制:額度、核准商家的允許清單,以及最大交易金額。明確的目的是讓代理程式能夠測試與購買服務,而無需人類核准每一筆付款,並有硬上限來限制損害。
Cloudflare 儀表板中的 Account Wallets 與 per-agent Virtual Wallets(來源:Cloudflare 部落格)
這些基礎元件描述的是預算而非政策。額度是一個持續的總額。允許清單是一個集合成員資格測試。最大交易金額是一個每次請求的限制。每一個都是針對目前付款與固定限制進行評估,沒有一個能表達付款之間的關係。
平台團隊通常想要的規則會表達關係。一個代理程式只能支付它已經對照核准目錄檢查過的供應商。它不能在一小時內為同一件事支付兩個供應商。它必須在第一次向新商家購買前取得核准。每一個都需要針對序列而非目前請求進行推理。
並行性提出了相關問題。代理程式會平行發出動作,因此多筆付款可能在尚未扣減額度的情況下進行檢查,且每一筆都通過了它們總和已超過的上限。Cloudflare 尚未公布其額度在並行支出下的行為,這在讓代理程式無需逐筆核准即可交易前值得先確認。
這種模式並非 Cloudflare 特有。此領域的供應商推出的都是限制而非政策語言,而每一家都將這些限制的組合留給上層應用程式。
對正在評估代理程式付款的團隊來說,問題很明確。支出政策應該存在於錢包還是應用程式?當多個代理程式動作平行執行並使用同一筆預算時會發生什麼?以及供應商提供的是限制還是語言,因為這決定了有多少東西必須自行建置。
x402 是一條可運作的軌道,而誰來治理它的問題也已解決。一個代理程式在一連串付款中能夠支出多少,則尚未解決。