Skip to content

Commit 84f3750

Browse files
authored
feat: tighten operator shell copy (#96)
* feat: tighten operator shell copy * fix: harden core image pip install retries
1 parent 73431cc commit 84f3750

5 files changed

Lines changed: 36 additions & 14 deletions

File tree

apps/dashboard/app/planner/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,9 @@ export default async function PlannerPage() {
411411
<span className="cell-sub mono muted">
412412
{text.title === "规划桌" ? "当前最该先处理的波次" : "First thing to resolve"}
413413
</span>
414-
<Badge variant={priority.tone}>{rows.length} rows</Badge>
414+
<Badge variant={priority.tone}>
415+
{rows.length === 0 ? (locale === "zh-CN" ? "发车模式" : "Launch mode") : `${rows.length} rows`}
416+
</Badge>
415417
</div>
416418
<strong className="planner-priority-title">{priority.title}</strong>
417419
<p className="planner-priority-summary">{priority.summary}</p>

apps/dashboard/app/runs/[id]/compare/page.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,11 @@ export default async function RunComparePage({
222222
<Card className="compare-archive-card">
223223
<h3>{choreographyTitle}</h3>
224224
<div className="stack-gap-2">
225-
<p className="muted">Keep the second card decision-oriented too. Treat this as operator choreography, not a duplicate summary.</p>
225+
<p className="muted">
226+
{hasCompareReport
227+
? "Keep the second card decision-oriented too. Treat this as operator choreography, not a duplicate summary."
228+
: "Observation mode stays honest here: missing compare data should pause judgment and point you back to replay."}
229+
</p>
226230
<p className="mono">{hasCompareReport ? "Compare first → proof second → replay only after the verdict is clear." : "No compare report yet → return to Run Detail, generate compare, then re-open this room."}</p>
227231
<p className="mono">Evidence chain: {evidenceStatus}</p>
228232
<p className="mono">LLM params: {llmParamsStatus} · Snapshot: {llmSnapshotStatus}</p>

apps/dashboard/tests/home_page.test.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,8 @@ describe("dashboard home run-summary clarity", () => {
437437
expect(screen.getByText("plan / delegate / track / resume / prove")).toBeInTheDocument();
438438
expect(screen.getByText("OpenVibeCoding command tower")).toBeInTheDocument();
439439
expect(screen.getByLabelText("Platform status overview")).toBeInTheDocument();
440-
expect(screen.getByText("Governance view")).toBeInTheDocument();
441-
expect(screen.getByText("Live verification required")).toBeInTheDocument();
442-
expect(screen.getByText("Page-level status")).toBeInTheDocument();
440+
expect(screen.getByText("Operator shell")).toBeInTheDocument();
441+
expect(screen.getByText("Live read-back")).toBeInTheDocument();
442+
expect(screen.getByText("Page contract")).toBeInTheDocument();
443443
});
444444
});

infra/ci/Dockerfile.core

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,30 @@ ARG APT_SHELLCHECK_VERSION=0.9.0-1
2626
ARG APT_BUILD_ESSENTIAL_VERSION=12.10ubuntu1
2727
ARG TARGETARCH
2828

29-
ENV DEBIAN_FRONTEND=noninteractive COREPACK_ENABLE_DOWNLOAD_PROMPT=0 PLAYWRIGHT_BROWSERS_PATH=/ms-playwright PNPM_HOME=/usr/local/share/pnpm CARGO_HOME=/usr/local/cargo RUSTUP_HOME=/usr/local/rustup PATH=/usr/local/share/pnpm:/usr/local/cargo/bin:$PATH
29+
ENV DEBIAN_FRONTEND=noninteractive COREPACK_ENABLE_DOWNLOAD_PROMPT=0 PLAYWRIGHT_BROWSERS_PATH=/ms-playwright PNPM_HOME=/usr/local/share/pnpm CARGO_HOME=/usr/local/cargo RUSTUP_HOME=/usr/local/rustup PIP_DEFAULT_TIMEOUT=120 PIP_DISABLE_PIP_VERSION_CHECK=1 PIP_PROGRESS_BAR=off PATH=/usr/local/share/pnpm:/usr/local/cargo/bin:$PATH
3030

3131
RUN apt-get update && apt-get install -y --no-install-recommends build-essential=${APT_BUILD_ESSENTIAL_VERSION} curl=${APT_CURL_VERSION} ca-certificates=${APT_CA_CERTIFICATES_VERSION} git=${APT_GIT_VERSION} jq=${APT_JQ_VERSION} pkg-config=${APT_PKG_CONFIG_VERSION} xz-utils=${APT_XZ_UTILS_VERSION} python3-venv=${APT_PYTHON3_VENV_VERSION} ripgrep=${APT_RIPGREP_VERSION} shellcheck=${APT_SHELLCHECK_VERSION} && rm -rf /var/lib/apt/lists/*
3232

3333
RUN case "${TARGETARCH}" in amd64) node_arch="x64"; node_sha256="${NODE_SHA256_AMD64}"; ;; arm64) node_arch="arm64"; node_sha256="${NODE_SHA256_ARM64}"; ;; *) echo "unsupported TARGETARCH=${TARGETARCH}" >&2; exit 1 ;; esac && curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" -o /tmp/node.tar.xz && echo "${node_sha256} /tmp/node.tar.xz" | sha256sum -c - && tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 && rm -f /tmp/node.tar.xz
3434

35-
RUN python3 -m pip install --break-system-packages --no-cache-dir "uv==${UV_VERSION}"
36-
RUN python3 -m pip install --break-system-packages --no-cache-dir "playwright==${PLAYWRIGHT_PYTHON_VERSION}"
35+
RUN set -eu; \
36+
install_with_retry() { \
37+
package="$1"; \
38+
attempt=1; \
39+
while [ "$attempt" -le 4 ]; do \
40+
if python3 -m pip install --break-system-packages --no-cache-dir --retries 5 --timeout "${PIP_DEFAULT_TIMEOUT}" "$package"; then \
41+
return 0; \
42+
fi; \
43+
if [ "$attempt" -eq 4 ]; then \
44+
echo "pip install failed for ${package} after ${attempt} attempts" >&2; \
45+
return 1; \
46+
fi; \
47+
sleep "$((attempt * 5))"; \
48+
attempt=$((attempt + 1)); \
49+
done; \
50+
}; \
51+
install_with_retry "uv==${UV_VERSION}"; \
52+
install_with_retry "playwright==${PLAYWRIGHT_PYTHON_VERSION}"
3753

3854
RUN case "${TARGETARCH}" in amd64) gitleaks_arch="x64"; gitleaks_sha256="${GITLEAKS_SHA256_AMD64}"; ;; arm64) gitleaks_arch="arm64"; gitleaks_sha256="${GITLEAKS_SHA256_ARM64}"; ;; *) echo "unsupported TARGETARCH=${TARGETARCH}" >&2; exit 1 ;; esac && curl -fsSL "https://github.com/gitleaks/gitleaks/releases/download/v${GITLEAKS_VERSION}/gitleaks_${GITLEAKS_VERSION}_linux_${gitleaks_arch}.tar.gz" -o /tmp/gitleaks.tar.gz && echo "${gitleaks_sha256} /tmp/gitleaks.tar.gz" | sha256sum -c - && tar -xzf /tmp/gitleaks.tar.gz -C /tmp && install /tmp/gitleaks /usr/local/bin/gitleaks && rm -f /tmp/gitleaks.tar.gz /tmp/gitleaks
3955

packages/frontend-shared/uiCopy.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,9 +1334,9 @@ const UI_COPY: Record<UiLocale, UiCopy> = {
13341334
localeToggleAriaLabel: "Switch to Chinese",
13351335
localeToggleButtonLabel: "中文",
13361336
badges: {
1337-
governanceView: "Governance view",
1338-
liveVerificationRequired: "Live verification required",
1339-
pageLevelStatus: "Page-level status",
1337+
governanceView: "Operator shell",
1338+
liveVerificationRequired: "Live read-back",
1339+
pageLevelStatus: "Page contract",
13401340
},
13411341
approval: {
13421342
pageTitle: "Manual approvals",
@@ -2629,9 +2629,9 @@ const UI_COPY: Record<UiLocale, UiCopy> = {
26292629
localeToggleAriaLabel: "切换到英文",
26302630
localeToggleButtonLabel: "EN",
26312631
badges: {
2632-
governanceView: "治理视图",
2633-
liveVerificationRequired: "需要实时核验",
2634-
pageLevelStatus: "页面级状态",
2632+
governanceView: "操作壳层",
2633+
liveVerificationRequired: "实时回读",
2634+
pageLevelStatus: "页面契约",
26352635
},
26362636
approval: {
26372637
pageTitle: "人工审批",

0 commit comments

Comments
 (0)