让 Opus 5 输出更简洁的两种方式

让 Opus 5 输出更简洁的两种方式 图片 1

Opus 5 是一款强大的编码模型,但它对每个问题的回答都像一团文字拼凑。我以前的解决办法是基于 ASD‑STE100——即航空维修手册所用的简化英语——自定义一种输出风格。

如今,Claude Code 内置了一种名为Concise的风格,在调整一项配置后就能更好地胜任这一任务。

承重段落

在极高强度下,Opus 5 表现极为出色。随后它会详细地“介绍”自己的工作成果,而且滔滔不绝。比如你让它重命名一个变量,它的回答会解释这个变量位于哪个架构“接缝”上、为什么该接缝是“承重”的,以及在动手之前有哪些“值得了解”的内容。

每个模块都被称作“最有趣的部分”。到了第四段左右,才终于确认了变量的重命名操作。

这些词单独看都没问题,只是数量太多,放在一起往往显得语义不清。

航空英语

ASD‑STE100 是简化技术英语,也是航空航天维修手册的写作标准:一套约900个核准词汇的受控词典,并规定每句话不得超过20个单词,且只包含一条指令。

它的存在是为了避免疲惫的机务人员误读某个步骤,而这正是我在漫长一天结束后所期望的阅读难度。

Claude Code 支持自定义输出风格,它也很乐意为自己编写一种风格。只需一条提示即可:

将输出模式改为使用 ASD‑STE100

Claude 将该风格文件写入~/.claude/output-styles/ASD‑STE100.md,并在配置中指向它,同时又自行设置了两项例外:代码和引用文本保持原样,而专为我的项目编写的部分则遵循我的语言规范,而非航空英语。

全新的 Concise 风格

随着版本 2.1.237 的发布,这种变通方法已不再必要。/output-style 现在列出了五种风格,其中新增的 Concise 风格明确写道:“Claude 回答简明扼要,直奔主题,省略前言与叙述。”

输出风格会替换系统提示中负责控制 Claude 与用户交流方式的部分。回答直接给出结果,简单的问题只需一两句话,而不是一份报告;叙述与总结被大幅删减。

错误信息和失败测试仍保留完整内容,要求细节时也依然会提供细节。唯一改变的是默认风格。

同一问题,三种风格

我在 奥尔森 这个疯狂八牌游戏的仓库里进行了测试,分别让三种风格描述该项目的技术栈。每次仅更换输出风格,其余完全相同。默认风格的篇幅最长:

“以下是项目的真实情况,以 Xcode 工程和源码为准,而非文档。”(663 字)

以下是项目的真实情况,以 Xcode 工程和源码为准,而非文档。

## 整体概貌

一个 Xcode 项目,三个原生目标,约 1.8 万行 Swift 代码:

- `olsen` — iPhone/iPad 应用,启用了 Mac Catalyst(`TARGETED_DEVICE_FAMILY = "1,2"` + `SUPPORTS_MACCATALYST = YES`),`com.hjerpbakk.olsen`,版本 2026.6
- `olsen watchOS Watch App` — `com.hjerpbakk.olsen.watchkitapp`,版本 1.0(6)
- `olsenTests` — 单元测试

部署目标为 iOS 26.2 和 watchOS 26.2。`SWIFT_VERSION = 5.0`,采用 Swift 5 语言模式,但设定了 `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` 和 `SWIFT_APPROACHABLE_CONCURRENCY = YES`:默认所有代码都在主 Actor 上执行,只有显式要求时才会启用并发。`MultiplayerSession.swift:11` 明确指出其后果:GameKit 的回调与发送均在主线程上进行,无需跨线程调用。

## UI 层,两个

手机/iPad/Mac 是一层薄薄的 UIKit 外壳,包裹着 SpriteKit。`AppDelegate` → `SceneDelegate` → 主故事板 → `GameViewController`,之后所有可见内容均为 `SKScene`:`MainMenuScene`、`LobbyScene`、`OlsenGameScene`(1410 行,最大文件)、`SettingsScene`、`HowToPlayScene`、`WelcomeScene`、`TutorialCompletionScene`。在其之下,`olsen/iOS/Nodes/` 中还有手工打造的 `SKNode` 子类:`CardNode`、`HandNode`、`DeckNode`、`SuitSelectorNode`、`ModernButtonNode`、`SFSymbolSprite`,以及唯一使用 `SKShader` 的 `CardGlowNode`。卡牌美术来自 `Cards.spriteatlas`,经由 `CardAtlas.swift` 缓存提取出的纹理。

Mac Catalyst 还有额外功能:菜单栏和独立的“关于”窗口场景(`AboutSceneDelegate`,由 `AppDelegate` 按活动类型路由)。

Watch 应用则纯 SwiftUI 加 WatchKit,没有 SpriteKit,有自己的视图模型和数据模型(`WatchGameViewModel`、`WatchModels`)。它是游戏界面的独立实现,而非场景的移植。

## 游戏引擎

`olsen/Shared/` 是平台无关的部分:GameplayKit ECS,包含实体(玩家、卡牌、牌堆、弃牌堆)、组件(手牌、回合、AI、动画、卡牌、精灵)以及系统(卡牌打出、回合、抽牌、AI)。`GameManager`(878 行)是单例,掌管规则并通过委托向外推送变更。AI 基于协议,`AIStrategy` 分为 Easy/Normal/Hard 三档。

## 两条协议接缝

这是架构中最有趣的部分,两条接缝都有专门的文件记录:

- `GameSession`(`olsen/Shared/Session/GameSession.swift`)介于场景与游戏之间。场景与其交互,而非直接接触 `GameManager.shared`,因此同一场景既能渲染 `LocalGameSession`(引擎的封装层),也能渲染 `RemoteGameSession`(应用宿主快照的来宾)。
- `GameTransport`(`olsen/Shared/Multiplayer/GameTransport.swift`)连接游戏与网络。`MultiplayerSession` 通过 `GKMatch` 实现它;测试则用假对象模拟。这使 GameKit 不侵入引擎,也让快照分发变得可单元测试。

多人模式为主导权威:`SnapshotBroadcaster` 向每个远程席位发送一份带有序号和基准标志的脱敏快照,用于重新连接后的同步;来宾提交意图(`GameIntent`),座位由 `SeatMap` 管理,邀请则经由 `GKLocalPlayerListener` 和 `GameInviteRouter` 到达。

## Apple 服务

游戏中心在应用和手表端均有授权:认证、成就、排行榜、`GKAccessPoint`。手表无法自主提交,因此由 `WatchGameCenterManager` 通过 `WCSession.sendUserInfo` 转发,再由 `GameCenterManager` 作为 `WCSessionDelegate` 接收(`GameCenterManager.swift:399`)。StoreKit 出现在 `ReviewPrompter`、`SettingsScene` 和 `AboutViewController` 中。本地化采用字符串目录(`Localizable.xcstrings`、`InfoPlist.xcstrings`),支持英、挪两种语言。应用图标采用新版 Icon Composer 格式(`AppIcon.icon`)。

## 第三方,全用 SPM

仅有三枚依赖,未使用其他包管理工具:

- Google Mobile Ads 13.6.0 — 仅插屏广告,经由 `InterstitialAdManager`,Mac Catalyst 版本已排除
- Google User Messaging Platform 3.1.0 — 用户同意
- umami-swift 1.6.0 — 自托管分析,导入到双平台共25个文件中,测试及 `-screenshotMode` 运行时跳过

## 测试

`olsenTests`,Swift Testing(`import Testing`),8 个文件,几乎全是多人模式相关:引擎、快照、意图、座位图、广播器、远程会话。单人模式引擎则无直接覆盖。

`AGENTS.md` 中有三点与项目不符:没有 `olsenUITests` 目标(只有上述三个);Swift 版本为 5.0 而非 6;文中推荐的模拟器(iPhone 16 Pro)在此设备上已不再安装,取而代之的是运行 26.2 的 iPhone 17 Pro。另需注意:`Info.plist` 全局启用了 `NSAllowsArbitraryLoads`,这是广告 SDK 的标配,远超应用实际所需。

采用 ASD‑STE100 后,篇幅缩短,结构也更为简洁:

“# Olsen 的技术栈。以下是项目的真实情况,源自源码而非文档。”(525 字)

# Olsen 的技术栈

以下是项目的真实情况,源自源码而非文档。

## 架构与构建

一个 Xcode 项目(`olsen.xcodeproj`),无 `Package.swift`。三个目标:`olsen`(iPhone/iPad/Mac Catalyst)、`olsen watchOS Watch App`、`olsenTests`。两个共享方案。约 1.8 万行 Swift 代码。

语言设置值得注意:`SWIFT_VERSION = 5.0`,但设定了 `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor` 和 `SWIFT_APPROACHABLE_CONCURRENCY = YES`,因此默认所有代码都在主 Actor 上执行,GameKit 的回调也不需要跨线程调用。部署目标为 iOS 26.2 和 watchOS 26.2,Catalyst 已启用。

## 手机/iPad/Mac 应用

一层薄薄的 UIKit 外壳:`AppDelegate` → `SceneDelegate` → 主故事板 → `GameViewController`,后者拥有一个 `SKView`,并根据 `tutorialCompleted` 和 `FirstLaunch.shouldShowWelcome` 决定首个场景。此后全部为 SpriteKit:7 个场景(`WelcomeScene`、`MainMenuScene`、`OlsenGameScene`、`LobbyScene`、`SettingsScene`、`HowToPlayScene`、`TutorialCompletionScene`)以及 11 个节点(`CardNode`、`HandNode`、`DeckNode`、`SuitSelectorNode`、`CardGlowNode`等)。

## 游戏引擎

`olsen/Shared/ECS/` 下的 GameplayKit ECS:

- 实体:`PlayerEntity`、`CardEntity`、`DeckEntity`、`DiscardPileEntity`,均为真正的 `GKEntity` 子类
- 组件:`Hand`、`Turn`、`AI`、`Animation`、`Card`、`Sprite`,均为 `GKComponent`
- 系统:`CardPlaySystem`、`TurnSystem`、`DrawSystem`、`AISystem`,均为 `GameManager` 所有并调用的普通类,而非 `GKComponentSystem` 的更新循环

`GameManager.shared` 是规则引擎,通过 `GameManagerDelegate` 推送变更。`Deck` 的洗牌由 `GKRandomSource` 负责,因此可以设定随机种子。

对文档的一处更正:`CLAUDE.md` 称游戏流程由 `GKStateMachine` 控制。但代码中并无状态机。`GamePhase` 仅为普通枚举,`GameManager.currentPhase` 根据引擎状态按需推导,无存储字段。建议日后修订文档。

AI 基于协议:`AIStrategy` 包括 `EasyAI`、`NormalAI`、`HardAI`。

## 两条接缝

两者均有专门文件记录,是设计中的承重部分:

- `GameSession` 介于场景与游戏之间。场景从不直接接触 `GameManager.shared`。`LocalGameSession` 封装引擎,`RemoteGameSession` 应用宿主快照。`SeatDescriptor` 让同一个头像既能代表 AI,也能代表真人好友。
- `GameTransport` 连接游戏与网络。`MultiplayerSession` 通过 `GKMatch` 实现它,测试则用假对象模拟。GameKit 从未触及引擎。

多人模式为主导权威:`SnapshotBroadcaster` 向每个远程席位发送一份脱敏快照(仅填充该席位的手牌),附带单调递增的序号和用于重新连接同步的基准标志;来宾提交 `GameIntent`,座位由 `SeatMap` 管理,邀请则经由 `GameInviteRouter` 到达。

## watchOS

UI 完全独立:纯 SwiftUI 加 WatchKit,自有视图和 `WatchGameViewModel`,没有 SpriteKit。手表无法自主向游戏中心提交,因此由 `WatchGameCenterManager` 通过 `WCSession.sendUserInfo` 转发给手机端的 `GameCenterManager`。

## 依赖

三枚 SPM 依赖,均为次大版本升级:

- `googleads/swift-package-manager-google-mobile-ads` 13.6.0(仅 olsen 目标)
- `googleads/swift-package-manager-google-user-messaging-platform` 3.1.0(仅 olsen 目标)
- `hjerpbakk/umami-swift` 1.6.0(两个应用目标)

广告仅限插屏,由 `InterstitialAdManager` 负责,Catalyst 版本已排除。Umami 导入到25个文件中,包括引擎本身。

Apple 框架也在发挥作用:SpriteKit、GameplayKit、GameKit、UIKit、SwiftUI、StoreKit(通过 `ReviewPrompter` 引发评分)、AVFoundation 和 AudioToolbox(`AudioManager` 在代码中合成音效)、WatchConnectivity,以及 Combine 在唯一一个文件中出现。

## 测试

`olsenTests`,Swift Testing(`import Testing`),8 个文件,几乎全是多人模式相关:引擎、快照、意图、座位图、广播器、远程会话。无 UI 测试目标。

而 Concise 风格则缩减至默认风格的一半:

“原生 Apple 技术栈,无跨平台层。”(330 字)

原生 Apple 技术栈,无跨平台层。三个交付端口来自同一个代码库:

**平台与构建**
- Xcode 项目 `olsen.xcodeproj`,两个应用目标:`olsen`(iOS 26.2、iPad、通过 Catalyst 支持 Mac)和 `olsen watchOS Watch App`(watchOS 26.2)。测试在 `olsenTests` 中进行(+ `olsenUITests`),采用 Swift Testing(`import Testing`),而非 XCTest。
- Swift 设置为 `SWIFT_DEFAULT_ACTOR_ISOLATION = MainActor`,并发易于理解。

**渲染**
- iOS/iPad/Mac:SpriteKit。`GameViewController` → `olsen/iOS/Scenes/` 中的 `SKScene` 子类(主菜单、大厅、游戏、玩法、设置、欢迎、教程结束)以及 `olsen/iOS/Nodes/` 中的手工 `SKNode` 子类。卡牌来自一张精灵图集(`Cards.spriteatlas`),经由带有纹理缓存功能的 `CardAtlas` 提取。`CardGlowNode` 使用内联 GLSL 的 `SKShader`,缓存材质参数以实现特殊或可玩卡牌的发光效果。
- watchOS:纯 SwiftUI,采用独立的轻量级实现(`WatchGameViewModel`、`WatchModels`、`WatchCardView`),而非共享引擎代码。

**游戏逻辑**
- `olsen/Shared/ECS/` 中的 GameplayKit ECS:实体(卡牌、牌堆、弃牌堆、玩家)、组件(手牌、回合、AI、动画、卡牌、精灵)、系统(卡牌打出、回合、抽牌、AI)。`GameManager`(878 行)是单例协调者,驱动各部分运作,并通过委托回调。
- AI 基于协议(`AIStrategy`),分为 Easy/Normal/Hard 三档。
- 注意:CLAUDE.md 称游戏流程由 `GKStateMachine` 控制,但代码中并无 `GKStateMachine`。流程存在于 `GameManager` 和各个场景之中。

**多人模式(两条接缝)**
- `GameSession` 协议是场景与游戏之间的接缝:`LocalGameSession` 封装引擎,`RemoteGameSession` 渲染宿主快照。场景从不直接接触 `GameManager.shared`。
- `GameTransport` 是游戏与网络之间的接缝:`MultiplayerSession` 通过 `GKMatch` 实现它,测试则用假对象模拟。主导权归宿主,由 `SnapshotBroadcaster` 向每个席位分发脱敏快照,附带单调递增的序号,同时辅以 `GameIntent`/`GameEvent`、`SeatMap` 和 `GameInviteRouter`。引擎始终不引入 GameKit。
- 手表通过 WatchConnectivity(`WCSession` 在 `GameCenterManager` ↔ `WatchGameCenterManager` 之间)与手机沟通,转达游戏中心的信息。

**依赖(SPM,仅 iOS 目标)**
- Google Mobile Ads 13.6.0 + User Messaging Platform 3.1.0(`InterstitialAdManager`)
- `umami-swift` 1.6.0 — 自托管分析,导入到25个文件中
- Apple 框架:GameKit(游戏中心、20项成就与排行榜)、StoreKit(`ReviewPrompter`)、AVFoundation/AudioToolbox(`AudioManager`)、UIKit触感反馈。

**本地化**:字符串目录(`Localizable.xcstrings`、`InfoPlist.xcstrings`),支持英语与挪威书面语。

三种风格都指出了相同的架构,也揭示了我文档与代码之间的一致性偏差。即便是最精简的版本,也没有遗漏任何关键信息。不过 Opus 5 依然忠实于自身:即便在简化技术英语或 Concise 模式下,也难免会出现冗长之处。

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论