Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
7e00aa5
Reapply "C1: unify work sources and validate recovery (#7430)" (#8265)
loopx-agent Nov 7, 2026
144c7d1
Exercise C1 recovery through the saved complete contract
loopx-agent Nov 7, 2026
93bb563
Merge commit 'ce17fb49f91aa23a0dd2ff471f176d022062a698' into codex/c1…
loopx-agent Nov 7, 2026
0e015d0
Integrate main heartbeat Turn binding into C1
loopx-agent Nov 7, 2026
5be1823
Merge commit '17e614282c83871712614d561373720f3696d2f9' into codex/c1…
loopx-agent Nov 7, 2026
a543d93
Merge commit 'f1d30b2f8f7fdf22a0c620c85d5588fed48f2202' into codex/c1…
loopx-agent Nov 7, 2026
66c651b
Compact C1 thin heartbeat capture guidance
loopx-agent Nov 7, 2026
3510a30
Merge commit '46959c7c1de59b93c5bde62e6056ac3e57e99884' into codex/c1…
loopx-agent Nov 7, 2026
67db021
Merge commit '60089b0feff1e92e6d68d1496fdf01e84cc35a07' into codex/c1…
loopx-agent Nov 7, 2026
7ed3de8
Merge commit '10f66ec5e5586453a5579e9943b189bba84698ca' into codex/c1…
loopx-agent Nov 7, 2026
0b1cdde
Merge commit '22d8daff5b2e9e173908ccdf4a16617a2993a70f' into codex/c1…
loopx-agent Nov 7, 2026
bccf7b9
fix(benchmark): preserve the signed C1 replan capture
loopx-agent Nov 7, 2026
705e3ad
Merge commit '97a34a4b0abb5a03d003cee9eb70e834941d5e23' into codex/c1…
loopx-agent Nov 7, 2026
9857001
refactor(quota): bind prepared selection at capture transport
loopx-agent Nov 7, 2026
6c58542
Merge latest main and retain the C1 source path
loopx-agent Nov 7, 2026
d7750fe
test(benchmark): read direct scheduler state in the budget-stop smoke
loopx-agent Nov 7, 2026
16cf9af
Integrate main's returned legacy budget recovery
loopx-agent Nov 7, 2026
b1b0655
fix(codex): reuse the captured managed claim after lost readiness
loopx-agent Nov 7, 2026
bcd0b89
Integrate main's staged saved replan presenter in C1
loopx-agent Nov 7, 2026
b7263b6
Merge main into the C1 saved context proposal
loopx-agent Nov 7, 2026
6673571
fix(workspace): use the current source Goal projection types
loopx-agent Nov 7, 2026
5578118
Merge main's original Turn archival closeout into C1
loopx-agent Nov 7, 2026
7f26bd8
Reuse the projected body in full native context delivery
loopx-agent Nov 7, 2026
36a9ebe
Verify original native transport before decoding guard policy
loopx-agent Nov 7, 2026
9aaff80
Merge latest main into C1 work contract
loopx-agent Nov 7, 2026
fbd4c03
perf(turn-context): skip inactive anti-entropy validation
loopx-agent Nov 7, 2026
c24dd11
Bind quota context contributions to the composed settlement
loopx-agent Nov 7, 2026
89c8581
Omit governing source from status-only context hook validation
loopx-agent Nov 7, 2026
091f557
Keep quota context preparation outside result emission
loopx-agent Nov 7, 2026
797bb60
Keep quota replan contributions bound across reader publication
loopx-agent Nov 7, 2026
9988917
Compact the exact source for bounded Turn composition
loopx-agent Nov 7, 2026
a2f924d
Limit work context planning to selection facts
loopx-agent Nov 7, 2026
7b737f7
Keep progressive readback valid without an optional command template
loopx-agent Nov 7, 2026
26ffa3e
Exercise DSH acceptance with complete Goal context
loopx-agent Nov 7, 2026
f83df73
Reuse captured replan stages without native continuity
loopx-agent Nov 7, 2026
870dc20
Attach saved progressive first pages with Delta off
loopx-agent Nov 7, 2026
2624d0c
Skip the root index before an attached progressive page
loopx-agent Nov 7, 2026
fc1e93f
Integrate main before validating saved progressive pages
loopx-agent Nov 7, 2026
f634f5d
Defer write scope detail until a progressive Turn is ready
loopx-agent Nov 7, 2026
8ed85cd
Keep progressive scope selection with the interaction owner
loopx-agent Nov 7, 2026
726ab94
Keep the legacy scope read inside the Turn projection
loopx-agent Nov 7, 2026
226fede
Merge current main native context improvements into C1
loopx-agent Nov 7, 2026
3b9d412
Reuse verified sources in staged replan reads
loopx-agent Nov 7, 2026
62cd14b
Integrate main progressive scope delivery with the checked C1 source
loopx-agent Nov 7, 2026
3ebe5d6
Read back interrupted native execution preparation once
loopx-agent Nov 7, 2026
977be7e
Merge remote-tracking branch 'origin/main' into codex/c1-replan-integ…
loopx-agent Nov 7, 2026
1688d07
Merge remote-tracking branch 'origin/main' into codex/c1-replan-integ…
loopx-agent Nov 7, 2026
a6a331a
Reuse outcome ID addresses in progressive first reads
loopx-agent Nov 7, 2026
c45893c
Integrate main bounded context openings with C1 settlement
loopx-agent Nov 7, 2026
1697da2
Integrate stateless progressive reads with the signed C1 owner
loopx-agent Nov 7, 2026
a516479
Keep explicit windows on attached context reads
loopx-agent Nov 7, 2026
61181c4
Integrate verified native claims with one automatic attempt
loopx-agent Nov 7, 2026
83b59e5
Merge commit 'e2371c476805f67903dd3c338a7e2712f577c9cc' into codex/c1…
loopx-agent Nov 7, 2026
8e242f8
Show child research navigation while Goal status loads
loopx-agent Nov 7, 2026
e58ba30
Merge pull request #8315 from loopx-project/codex/research-case-navig…
loopx-agent Nov 7, 2026
f06fccb
Distinguish prepared research input from analyzer judgments
loopx-agent Nov 7, 2026
e2efaf2
Integrate current main into the C1 work contract
loopx-agent Nov 7, 2026
1469c0a
Bound the C1 replan inspection with same-source readback
loopx-agent Nov 7, 2026
8a4d4f9
Merge pull request #8317 from loopx-project/codex/research-judgment-i…
loopx-agent Nov 7, 2026
db8917d
Integrate current main for C1 inspection validation
loopx-agent Nov 7, 2026
f352142
Bound host-ready Turn inspection using the shared decision capture
loopx-agent Nov 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {resolveTestPython} from "../../../../scripts/test-python.mjs";
import {readAnalysisSnapshot, ResearchAnalysisPanel} from "../src/features/personal-workspace/goal-research-analysis.tsx";
import {ResearchCaseStudy} from "../src/features/personal-workspace/research-case-study.tsx";
import {fetchExploreResults} from "../src/data/chat.ts";
import {ResearchGoalNavigation} from "../src/features/personal-workspace/goal-research-workbench.tsx";
import {GoalResearchWorkbench} from "../src/features/personal-workspace/goal-research-workbench.tsx";

// The persisted directory can organize explicitly linked physical sources.
// Navigation must not turn organization into shared evidence or execution.
Expand All @@ -30,8 +30,9 @@ const goals = [
{goalId:'child',parentGoalId:'parent',title:'Local case'},
{goalId:'foreign',parentGoalId:'parent',title:'Foreign case',sourceAccess:{namespace:'other',label:'Other',readOnly:true}},
];
const navigate = goalId => renderToStaticMarkup(createElement(ResearchGoalNavigation, {
goalId, goals, zh:false, onSelect: () => {throw Error('read navigated');},
const navigate = goalId => renderToStaticMarkup(createElement(GoalResearchWorkbench, {
goalId, goals, zh: false, active: true, refreshRevision: 0,
statusNotice: createElement("p", null, "Loading status"), onSelectGoal: () => {throw Error('read navigated');},
}));
assert.ok(navigate('parent').includes('Local case'));
assert.ok(navigate('parent').includes('Foreign case'));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,8 @@ export function ResearchAnalysisPanel({analysis: a, onHistory}: {analysis: Contr
: benefit?.unknown ? (zh ? "原目标收益的检验情况仍未知" : "Original-objective utility testing remains unknown")
: benefit?.yes ? (zh ? "模型记录了收益检验;这不等于收益为正" : "The model identified a utility test; this does not imply positive utility")
: (zh ? "此方法未覆盖原目标收益检验" : "This method does not cover original-objective utility testing");
const scope = p ? <>{p.episode_count} {zh ? "个研究片段" : "research episodes"} · {p.selection.exhaustive ? (zh ? "固定范围" : "Fixed scope") : (zh ? "定向抽样" : "Purposive sample")}</> : null;
const episodeLabel = result ? (zh ? "个研究片段" : "research episodes") : (zh ? "个输入片段" : "input episodes");
const scope = p ? <>{p.episode_count} {episodeLabel} · {p.selection.exhaustive ? (zh ? "固定范围" : "Fixed scope") : (zh ? "定向抽样" : "Purposive sample")}</> : null;
const scopeHelp = p ? <ContextHelp label={zh ? "分析范围" : "Analysis scope"} icon={result?.synthesis ? Sparkles : undefined}>
{result?.synthesis ? <p><strong>{zh ? "Agent 分析 · 未校准" : "Agent analysis · uncalibrated"}</strong></p> : null}
<p>{p.selection.exhaustive ? (zh ? "覆盖此固定分析范围;不等于覆盖全部研究。" : "Covers this fixed analysis scope, not necessarily the whole research history.") : (zh ? "定向抽样,仅分析选定研究片段;范围外或未捕获的工作未纳入,不代表全程。" : "Purposive sample of selected episodes; work outside this scope or not captured is excluded. It does not represent the whole run.")}</p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,19 +281,27 @@ export function ResearchProgress({pack: p, packs, selectedId, zh, onSelect, onCi
const incomplete = usage?.incomplete_turn;
const coverage = usage?.request_coverage;
const number = (n: number) => new Intl.NumberFormat(zh ? "zh-CN" : "en", {maximumFractionDigits: 1}).format(n);
const scope = p ? `${number(p.episode_count)} ${zh ? "个片段" : "episodes"} · ${p.selection.exhaustive ? (zh ? "固定范围" : "Fixed scope") : (zh ? "定向抽样" : "Purposive sample")}` : "";
const duration = (s: number) => `${number(s / 60)} ${zh ? "分钟" : "min"}`;
const stamp = (s: string) => new Intl.DateTimeFormat(zh ? "zh-CN" : "en", {timeZone: "UTC", year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", hour12: false}).format(new Date(s));
return <section className="research-progress" aria-label={zh ? "长程效果与用量" : "Long-horizon results and usage"}>
<header><div className="research-progress-heading"><div className="research-progress-title"><h3>{p?.native_outcomes ? (zh ? "研究结果" : "Research results") : (zh ? "研究效果判读" : "Research effectiveness")}</h3><ContextHelp label={resultHelp} icon={historical ? TriangleAlert : p && !result ? CircleHelp : undefined}>
{historical ? <p>{zh ? "来源或方法已变化;历史捕获与判读不能当作当前结果。" : "The source or method changed; historical captures and judgments cannot establish current results."}</p> : null}
{p && !result ? <p>{zh ? "可先浏览已采集的测量与记录;深度分析需单独点击,不会随浏览自动运行。" : "Captured measurements and records remain readable. Deep analysis requires a separate action and never runs while browsing."}</p> : null}
{p && !result ? <>
<p>{zh ? "分析输入" : "Analysis input"} · {scope}</p>
<p>{zh ? "可先浏览已采集的测量与记录;深度分析需单独点击,不会随浏览自动运行。" : "Captured measurements and records remain readable. Deep analysis requires a separate action and never runs while browsing."}</p>
</> : null}
{p ? <p>{p.title}</p> : null}
<p>{zh ? "分析器判读未校准,仅限所选片段;范围外或未捕获的工作未纳入。数字为“是 / 适用片段”,未知仍在分母中;点选指标可看依据。" : "Uncalibrated judgments of selected episodes only; work outside this scope or not captured is excluded. Counts are yes / eligible episodes, including unknowns. Select a metric for evidence."}</p>
<p>{zh ? "不适用来自原始片段的明确取样规则,不算“否”或“未知”;展开指标可看被排除的片段。" : "Ineligible episodes follow the source's explicit selection, not a no or unknown judgment. Expand a metric to identify them."}</p>
<p>{zh ? "收益检验的“是”不保证收益为正;无益重复的“是”表示发现问题。六项分别判断,不合成总分、成功率或原生收益。" : "Yes for benefit testing does not imply positive utility; yes for repetition identifies a problem. The six judgments are not a total score, success rate or native utility."}</p>
<p>{p?.selection.exhaustive ? (zh ? "仅覆盖声明的固定分析范围,不等于覆盖全部研究。" : "Covers the declared fixed analysis scope, not necessarily the whole study.") : p?.selection.population_episodes == null ? (zh ? "定向抽样,全程覆盖未知。" : "Purposive sample; whole-run coverage is unknown.") : (zh ? "定向抽样,不代表全程。" : "Purposive sample, not the whole run.")}</p>
<p>{zh ? "原生测量缺失时保持未采集;分析器判读不能补成实际收益。完整取样规则与版本在“来源与用量”中。" : "Missing native measurements remain uncaptured; judgments cannot supply realized utility. Full selection rules and revisions are under Sources and usage."}</p>
</ContextHelp></div>{p ? <p className="research-progress-scope" data-pack-id={p.pack_id}>{number(p.episode_count)} {zh ? "个片段" : "episodes"} · {p.selection.exhaustive ? (zh ? "固定范围" : "Fixed scope") : (zh ? "定向抽样" : "Purposive sample")}{result ? (zh ? " · 未校准" : " · Uncalibrated") : ""}</p> : null}</div>{packs.length > 1 ? <label>{zh ? "评估范围" : "Evaluation scope"}<select value={selectedId} onChange={e => onSelect(e.target.value)}>{packs.map(pack => <option key={pack.pack_id} value={pack.pack_id}>{pack.title}</option>)}</select></label> : null}</header>
{result ? <>
<p>{zh ? "分析器判读未校准,仅限所选片段;范围外或未捕获的工作未纳入。数字为“是 / 适用片段”,未知仍在分母中;点选指标可看依据。" : "Uncalibrated judgments of selected episodes only; work outside this scope or not captured is excluded. Counts are yes / eligible episodes, including unknowns. Select a metric for evidence."}</p>
<p>{zh ? "不适用来自原始片段的明确取样规则,不算“否”或“未知”;展开指标可看被排除的片段。" : "Ineligible episodes follow the source's explicit selection, not a no or unknown judgment. Expand a metric to identify them."}</p>
<p>{zh ? "收益检验的“是”不保证收益为正;无益重复的“是”表示发现问题。六项分别判断,不合成总分、成功率或原生收益。" : "Yes for benefit testing does not imply positive utility; yes for repetition identifies a problem. The six judgments are not a total score, success rate or native utility."}</p>
</> : null}
{p ? <>
<p>{p.selection.exhaustive ? (zh ? "仅覆盖声明的固定分析范围,不等于覆盖全部研究。" : "Covers the declared fixed analysis scope, not necessarily the whole study.") : p.selection.population_episodes == null ? (zh ? "定向抽样,全程覆盖未知。" : "Purposive sample; whole-run coverage is unknown.") : (zh ? "定向抽样,不代表全程。" : "Purposive sample, not the whole run.")}</p>
<p>{zh ? "原生测量缺失时保持未采集;分析器判读不能补成实际收益。完整取样规则与版本在“来源与用量”中。" : "Missing native measurements remain uncaptured; judgments cannot supply realized utility. Full selection rules and revisions are under Sources and usage."}</p>
</> : <p>{zh ? "当前没有可读的分析范围。" : "No analysis scope is available."}</p>}
</ContextHelp></div>{p ? <p className="research-progress-scope" data-pack-id={p.pack_id}>{result ? `${scope}${zh ? " · 未校准" : " · Uncalibrated"}` : (zh ? "尚无分析器判读" : "No analyzer judgments yet")}</p> : null}</div>{packs.length > 1 ? <label>{zh ? "评估范围" : "Evaluation scope"}<select value={selectedId} onChange={e => onSelect(e.target.value)}>{packs.map(pack => <option key={pack.pack_id} value={pack.pack_id}>{pack.title}</option>)}</select></label> : null}</header>
{p ? <>
{p.native_outcomes ? <NativeResults native={p.native_outcomes} zh={zh} onCitation={onCitation}/> : null}
{p.native_outcomes ? <RetainedImprovement native={p.native_outcomes} zh={zh} onCitation={onCitation}/> : null}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {useState} from "react";
import {useState, type ReactNode} from "react";
import {GoalResearchHistory} from "./goal-research-history";
import {GoalExploreResults} from "./goal-explore-results";
import {goalHierarchy} from "./goal-hierarchy";
Expand All @@ -9,9 +9,9 @@ import './research-case-study.css';
type ResearchGoal = ResearchChildGoal & Pick<WorkspaceGoal, 'parentGoalId' | 'sourceStrategy'>;

/** Parentage organizes explicit source views; it never combines evidence or execution scope. */
export function ResearchGoalNavigation({goalId, goals, zh, onSelect, directoryUrl, active, refreshRevision}: {
function ResearchGoalNavigation({goalId, goals, zh, onSelect, directoryUrl, active, showTiming, refreshRevision}: {
goalId: string; goals: ResearchGoal[]; zh: boolean; onSelect: (goalId: string) => void;
directoryUrl?: string; active: boolean; refreshRevision: number;
directoryUrl?: string; active: boolean; showTiming: boolean; refreshRevision: number;
}) {
const selected = goals.find(g => g.goalId === goalId);
if (!selected) return null;
Expand All @@ -24,25 +24,30 @@ export function ResearchGoalNavigation({goalId, goals, zh, onSelect, directoryUr
return <nav className="research-goal-navigation" aria-label={zh ? '研究 Goal 层级' : 'Research Goal hierarchy'}>
{parent ? <button type="button" className="research-parent-goal" onClick={() => onSelect(parent.goalId)}>← {parent.title}</button> : null}
{children.length ? <ResearchChildGoals goals={children} zh={zh} onSelect={onSelect}
directoryUrl={directoryUrl} active={active} refreshRevision={refreshRevision}/> : null}
directoryUrl={directoryUrl} active={active} showTiming={showTiming} refreshRevision={refreshRevision}/> : null}
</nav>;
}

/** One read surface for the selected original Goal; opening it never starts research. */
export function GoalResearchWorkbench(props: {goalId: string; active: boolean; zh: boolean; refreshRevision: number; readSourceUrl?: string; directoryReadSourceUrl?: string; goals?: ResearchGoal[]; onSelectGoal?: (goalId: string) => void; onOpenTasks?: () => void}) {
export function GoalResearchWorkbench(props: {goalId: string; active: boolean; zh: boolean; refreshRevision: number; readSourceUrl?: string; directoryReadSourceUrl?: string; goals?: ResearchGoal[]; onSelectGoal?: (goalId: string) => void; onOpenTasks?: () => void; statusNotice?: ReactNode}) {
const selected = props.goals?.find(goal => goal.goalId === props.goalId);
const source = selected?.sourceAccess;
const [evidenceOpen, setEvidenceOpen] = useState(false);
return <div className="goal-research-workbench">
{props.statusNotice}
{/* The directory supplies navigation while the selected snapshot loads.
A denied or stale snapshot still blocks evidence reads. */}
{props.goals && props.onSelectGoal ? <ResearchGoalNavigation goalId={props.goalId} goals={props.goals}
zh={props.zh} onSelect={props.onSelectGoal} directoryUrl={props.directoryReadSourceUrl}
active={props.active} refreshRevision={props.refreshRevision}/> : null}
<GoalResearchHistory {...props} originalGoalId={source?.original_goal_id}
preferHistory={Boolean(source)} sourceStrategy={selected?.sourceStrategy}
onOpenSourceTasks={source ? props.onOpenTasks : undefined}/>
<details className="research-saved-evidence" open={evidenceOpen} onToggle={event => setEvidenceOpen(event.currentTarget.open)}>
<summary>{props.zh ? "阅读已保存的结论" : "Read saved findings"}</summary>
{evidenceOpen ? <GoalExploreResults originalGoalId={source?.original_goal_id} goalId={props.goalId} zh={props.zh} active={props.active} readSourceUrl={props.readSourceUrl}/> : null}
</details>
active={props.active} showTiming={!props.statusNotice} refreshRevision={props.refreshRevision}/> : null}
{!props.statusNotice ? <>
<GoalResearchHistory {...props} originalGoalId={source?.original_goal_id}
preferHistory={Boolean(source)} sourceStrategy={selected?.sourceStrategy}
onOpenSourceTasks={source ? props.onOpenTasks : undefined}/>
<details className="research-saved-evidence" open={evidenceOpen} onToggle={event => setEvidenceOpen(event.currentTarget.open)}>
<summary>{props.zh ? "阅读已保存的结论" : "Read saved findings"}</summary>
{evidenceOpen ? <GoalExploreResults originalGoalId={source?.original_goal_id} goalId={props.goalId} zh={props.zh} active={props.active} readSourceUrl={props.readSourceUrl}/> : null}
</details>
</> : null}
</div>;
}
Loading