|
|
@@ -6,8 +6,8 @@
|
|
|
<script>
|
|
|
// The goal page: supervision surface of one goal — status head
|
|
|
// with lifecycle actions (plus run-control parity: retry
|
|
|
- // supervision, requeue-to-resume), branch/push-state chips, the
|
|
|
- // agent's live progress feed and current activity, the ATTENTION
|
|
|
+ // supervision, requeue-to-resume), branch/push-state chips, one
|
|
|
+ // muted activity line, the agent's live progress feed, the ATTENTION
|
|
|
// blocks (the goal agent's answerable questions/RFCs and the
|
|
|
// completion review), the task status strip with per-row
|
|
|
// capability badges, the locked brief, the goal's effective
|
|
|
@@ -338,51 +338,71 @@
|
|
|
hands the goal to its agent (an orchestrate-mode run task, priority 3).</p>
|
|
|
<p class="muted" stm-if="goal.status == 'paused'">Paused — supervision frozen;
|
|
|
task events queue and coalesce into the resume.</p>
|
|
|
+ <!-- Plan 15 C4: the ONE muted activity line (the
|
|
|
+ Current-activity card is gone) — what the run is
|
|
|
+ doing right now, folded into the status head. -->
|
|
|
+ <p class="muted" stm-if="goal.current_activity.length > 0"
|
|
|
+ stm-text="goal.current_activity">activity</p>
|
|
|
+ <p class="muted" stm-if="goal.saddle_health.length > 0"
|
|
|
+ stm-text="goal.saddle_health">health</p>
|
|
|
</section>
|
|
|
|
|
|
- <!-- The agent's live progress feed (task-page pattern),
|
|
|
- inside the status region: the newest line leads, its
|
|
|
- history behind the expander. -->
|
|
|
- <h3>Agent progress</h3>
|
|
|
- <div stm-if="goal.progress.length > 0">
|
|
|
- <p class="progress-latest" stm-text="goal.progress[0].summary">latest</p>
|
|
|
- <p class="muted" stm-text="'reported ' + goal.progress[0].when_display">when</p>
|
|
|
- <details class="history-expander" stm-if="goal.progress.length > 1">
|
|
|
- <summary>Show history (<span stm-text="goal.progress.length">0</span> updates)</summary>
|
|
|
- <ul class="progress-history">
|
|
|
- <li stm-for-item-in="goal.progress">
|
|
|
- <span class="muted" stm-text="item.when_display">when</span> —
|
|
|
- <span stm-text="item.summary">summary</span>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </details>
|
|
|
- </div>
|
|
|
- <p stm-if="goal.progress.length == 0" class="muted">No progress reports yet — the goal
|
|
|
- agent reports via <code>saddle progress-update</code>.</p>
|
|
|
-
|
|
|
- <!-- Current activity (task-page parity), inside the
|
|
|
- status region: what the agent's open round is doing
|
|
|
- right now, plus its saddle's health. -->
|
|
|
- <section class="card goal-activity" stm-if="goal.run_task_id > 0">
|
|
|
- <h3>Current activity</h3>
|
|
|
- <p stm-if="goal.current_command.length > 0">
|
|
|
- <span class="badge badge-working" stm-if="goal.current_command_running">running</span>
|
|
|
- <code stm-text="goal.current_command">command</code>
|
|
|
- <span class="muted" stm-text="goal.current_command_display">when</span></p>
|
|
|
- <p stm-if="goal.current_command.length == 0" class="muted">No recorded activity in
|
|
|
- the current round — the raw terminal carries the live stream.</p>
|
|
|
- <p stm-if="goal.saddle_health.length > 0" class="muted"
|
|
|
- stm-text="goal.saddle_health">health</p>
|
|
|
+ <!-- The agent's live progress feed (task-page pattern):
|
|
|
+ the newest line leads, its history behind the
|
|
|
+ expander. Plan 15 C4: a CARD again (the goalui
|
|
|
+ restyle regression — every section rides the same
|
|
|
+ card rhythm). -->
|
|
|
+ <section class="card">
|
|
|
+ <h3>Agent progress</h3>
|
|
|
+ <div stm-if="goal.progress.length > 0">
|
|
|
+ <p class="progress-latest" stm-text="goal.progress[0].summary">latest</p>
|
|
|
+ <p class="muted" stm-text="'reported ' + goal.progress[0].when_display">when</p>
|
|
|
+ <details class="history-expander" stm-if="goal.progress.length > 1">
|
|
|
+ <summary>Show history (<span stm-text="goal.progress.length">0</span> updates)</summary>
|
|
|
+ <ul class="progress-history">
|
|
|
+ <li stm-for-item-in="goal.progress">
|
|
|
+ <span class="muted" stm-text="item.when_display">when</span> —
|
|
|
+ <span stm-text="item.summary">summary</span>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </details>
|
|
|
+ </div>
|
|
|
+ <p stm-if="goal.progress.length == 0" class="muted">No progress reports yet — the goal
|
|
|
+ agent reports via <code>saddle progress-update</code>.</p>
|
|
|
</section>
|
|
|
|
|
|
- <!-- ATTENTION (plan 14 B5 order): the goal agent's
|
|
|
- answerable blocks lead — questions and RFCs with full
|
|
|
- markdown bodies and inline answer forms, then the
|
|
|
- completion review when one awaits. -->
|
|
|
- <section class="card" stm-if="goal.blocks.length > 0">
|
|
|
+ <!-- ATTENTION (plan 14 B5 order; plan 15 C4): the goal
|
|
|
+ agent's OPEN blocks lead — questions and RFCs with
|
|
|
+ full markdown bodies and inline answer forms — and
|
|
|
+ the historic answered ones fold behind the
|
|
|
+ answered-blocks expander (the task page's pattern);
|
|
|
+ the completion review follows when one awaits. -->
|
|
|
+ <section class="card"
|
|
|
+ stm-if="goal.open_blocks.length > 0 || goal.answered_blocks.length > 0">
|
|
|
<h3>Goal agent blocks</h3>
|
|
|
- <div stm-for-block-in="goal.blocks" class="goal-block">
|
|
|
- <div stm-if="!block.is_plan_review && !block.is_completion_review">
|
|
|
+ <div stm-for-block-in="goal.open_blocks" class="goal-block">
|
|
|
+ <p><span stm-attribute.class="'badge badge-block-' + block.block_type"
|
|
|
+ stm-text="block.block_type">kind</span>
|
|
|
+ <strong stm-text="block.question">question</strong>
|
|
|
+ <span class="muted" stm-text="block.created_display">when</span></p>
|
|
|
+ <div stm-if="block.show_body && block.body.length > 0"
|
|
|
+ class="md rfc-body goal-body" stm-markdown="block.body">body</div>
|
|
|
+ <form stm-action="block.answer_action">
|
|
|
+ <div stm-if="block.options.length > 0" class="form-row">
|
|
|
+ <label>Options</label>
|
|
|
+ <select name="option">
|
|
|
+ <option stm-for-option-in="block.options" stm-attribute.value="option"
|
|
|
+ stm-text="option">opt</option>
|
|
|
+ </select></div>
|
|
|
+ <div class="form-row">
|
|
|
+ <textarea name="answer" rows="2"
|
|
|
+ placeholder="Reply (or pick an option)"></textarea></div>
|
|
|
+ <button type="submit" class="primary">Answer</button>
|
|
|
+ </form>
|
|
|
+ </div>
|
|
|
+ <details class="history-expander" stm-if="goal.answered_blocks.length > 0">
|
|
|
+ <summary>Answered blocks (<span stm-text="goal.answered_blocks.length">0</span>)</summary>
|
|
|
+ <div stm-for-block-in="goal.answered_blocks" class="goal-block">
|
|
|
<p><span stm-attribute.class="'badge badge-block-' + block.block_type"
|
|
|
stm-text="block.block_type">kind</span>
|
|
|
<strong stm-text="block.question">question</strong>
|
|
|
@@ -392,20 +412,8 @@
|
|
|
<blockquote stm-if="block.answered" class="term-comment-quote">
|
|
|
<span stm-text="block.answered_by">who</span>:
|
|
|
<span stm-text="block.answer">answer</span></blockquote>
|
|
|
- <form stm-if="!block.answered" stm-action="block.answer_action">
|
|
|
- <div stm-if="block.options.length > 0" class="form-row">
|
|
|
- <label>Options</label>
|
|
|
- <select name="option">
|
|
|
- <option stm-for-option-in="block.options" stm-attribute.value="option"
|
|
|
- stm-text="option">opt</option>
|
|
|
- </select></div>
|
|
|
- <div class="form-row">
|
|
|
- <textarea name="answer" rows="2"
|
|
|
- placeholder="Reply (or pick an option)"></textarea></div>
|
|
|
- <button type="submit" class="primary">Answer</button>
|
|
|
- </form>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </details>
|
|
|
</section>
|
|
|
|
|
|
<!-- Completion review: the report, compare link (an
|
|
|
@@ -437,6 +445,62 @@
|
|
|
</details>
|
|
|
</section>
|
|
|
|
|
|
+ <!-- The plan (plan 15 C4): BETWEEN attention and tasks.
|
|
|
+ While a plan review is open the pending submission
|
|
|
+ renders EXPANDED with the remarks queue (plan 14 B2);
|
|
|
+ otherwise the approved plan and the revision history
|
|
|
+ (approved + rejected) sit behind a collapsed
|
|
|
+ expander — the goal page leads with what needs a
|
|
|
+ human, not with settled history. -->
|
|
|
+ <section class="card">
|
|
|
+ <h3>Plan</h3>
|
|
|
+
|
|
|
+ <div stm-if="goal.plan_pending_block != null && goal.plan_pending_block != false"
|
|
|
+ class="plan-review" data-plan-review
|
|
|
+ stm-attribute.data-block-id="goal.plan_pending_block.id">
|
|
|
+ <h4>Plan submitted for review</h4>
|
|
|
+ <div class="md rfc-body goal-body" data-plan-body
|
|
|
+ stm-markdown="goal.plan_pending_block.body">revision</div>
|
|
|
+ <div class="actions">
|
|
|
+ <form stm-action="goal.plan_pending_block.answer_action" class="inline">
|
|
|
+ <input type="hidden" name="answer"
|
|
|
+ value="Plan approved. Proceed with implementation.">
|
|
|
+ <button type="submit" class="approve" data-plan-accept>Approve plan</button>
|
|
|
+ </form>
|
|
|
+ <button type="button" data-plan-toggle>Reject with feedback</button>
|
|
|
+ </div>
|
|
|
+ <div data-plan-feedback hidden>
|
|
|
+ <p class="muted">Highlight plan text to attach a remark to it — the queue
|
|
|
+ rides the rejection numbered, then clears. Approving ignores the queue.</p>
|
|
|
+ <ul class="plan-comments" data-plan-remarks></ul>
|
|
|
+ <textarea name="feedback" rows="2"
|
|
|
+ placeholder="Additional feedback (optional)"></textarea>
|
|
|
+ <button type="button" class="primary" data-plan-submit>Submit feedback</button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <details class="history-expander"
|
|
|
+ stm-if="goal.plan_pending_block == null || goal.plan_pending_block == false">
|
|
|
+ <summary>Approved plan & revisions (<span
|
|
|
+ stm-text="goal.plan_revisions.length">0</span>)</summary>
|
|
|
+ <div stm-if="goal.plan.length > 0" class="md rfc-body goal-body" data-plan-body
|
|
|
+ stm-markdown="goal.plan">plan</div>
|
|
|
+ <p stm-if="goal.plan.length == 0" class="muted">No approved plan yet.</p>
|
|
|
+ <div stm-for-revision-in="goal.plan_revisions" class="plan-revision">
|
|
|
+ <p><span stm-attribute.class="'badge ' + (revision.approved ? 'badge-done' : (revision.answered ? 'badge-failed' : 'badge-plan'))"
|
|
|
+ stm-text="revision.approved ? 'approved' : (revision.answered ? 'rejected' : 'pending')">verdict</span>
|
|
|
+ <span class="muted" stm-text="'Revision #' + revision.id + ' — ' + revision.created_display">when</span></p>
|
|
|
+ <details>
|
|
|
+ <summary>Submitted markdown</summary>
|
|
|
+ <div class="md rfc-body" stm-markdown="revision.body">body</div>
|
|
|
+ </details>
|
|
|
+ <blockquote stm-if="revision.answered" class="term-comment-quote">
|
|
|
+ <span stm-text="revision.answered_by">who</span>:
|
|
|
+ <span stm-text="revision.answer">answer</span></blockquote>
|
|
|
+ </div>
|
|
|
+ </details>
|
|
|
+ </section>
|
|
|
+
|
|
|
<!-- Task status strip + the goal's task list (plan 14 B5:
|
|
|
tasks above the brief; capability badges per row —
|
|
|
no editing here; yeehaw on rows only). -->
|
|
|
@@ -531,59 +595,6 @@
|
|
|
<p stm-if="goal.rules.length == 0" class="muted">No rules apply to this goal.</p>
|
|
|
</section>
|
|
|
|
|
|
- <!-- The plan: the approved markdown; the pending review
|
|
|
- with the remarks queue (plan 14 B2); the revision
|
|
|
- history (approved + rejected) behind the expander,
|
|
|
- task-page pattern. -->
|
|
|
- <section class="card">
|
|
|
- <h3>Plan</h3>
|
|
|
- <div stm-if="goal.plan.length > 0" class="md rfc-body goal-body" data-plan-body
|
|
|
- stm-markdown="goal.plan">plan</div>
|
|
|
- <p stm-if="goal.plan.length == 0 && goal.plan_pending_block == null"
|
|
|
- class="muted">No approved plan yet.</p>
|
|
|
-
|
|
|
- <div stm-if="goal.plan_pending_block != null && goal.plan_pending_block != false"
|
|
|
- class="plan-review" data-plan-review
|
|
|
- stm-attribute.data-block-id="goal.plan_pending_block.id">
|
|
|
- <h4>Plan submitted for review</h4>
|
|
|
- <div class="md rfc-body goal-body" data-plan-body
|
|
|
- stm-markdown="goal.plan_pending_block.body">revision</div>
|
|
|
- <div class="actions">
|
|
|
- <form stm-action="goal.plan_pending_block.answer_action" class="inline">
|
|
|
- <input type="hidden" name="answer"
|
|
|
- value="Plan approved. Proceed with implementation.">
|
|
|
- <button type="submit" class="approve" data-plan-accept>Approve plan</button>
|
|
|
- </form>
|
|
|
- <button type="button" data-plan-toggle>Reject with feedback</button>
|
|
|
- </div>
|
|
|
- <div data-plan-feedback hidden>
|
|
|
- <p class="muted">Highlight plan text to attach a remark to it — the queue
|
|
|
- rides the rejection numbered, then clears. Approving ignores the queue.</p>
|
|
|
- <ul class="plan-comments" data-plan-remarks></ul>
|
|
|
- <textarea name="feedback" rows="2"
|
|
|
- placeholder="Additional feedback (optional)"></textarea>
|
|
|
- <button type="button" class="primary" data-plan-submit>Submit feedback</button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <details class="history-expander" stm-if="goal.plan_revisions.length > 0">
|
|
|
- <summary>Plan revisions & feedback (<span
|
|
|
- stm-text="goal.plan_revisions.length">0</span>)</summary>
|
|
|
- <div stm-for-revision-in="goal.plan_revisions" class="plan-revision">
|
|
|
- <p><span stm-attribute.class="'badge ' + (revision.approved ? 'badge-done' : (revision.answered ? 'badge-failed' : 'badge-plan'))"
|
|
|
- stm-text="revision.approved ? 'approved' : (revision.answered ? 'rejected' : 'pending')">verdict</span>
|
|
|
- <span class="muted" stm-text="'Revision #' + revision.id + ' — ' + revision.created_display">when</span></p>
|
|
|
- <details>
|
|
|
- <summary>Submitted markdown</summary>
|
|
|
- <div class="md rfc-body" stm-markdown="revision.body">body</div>
|
|
|
- </details>
|
|
|
- <blockquote stm-if="revision.answered" class="term-comment-quote">
|
|
|
- <span stm-text="revision.answered_by">who</span>:
|
|
|
- <span stm-text="revision.answer">answer</span></blockquote>
|
|
|
- </div>
|
|
|
- </details>
|
|
|
- </section>
|
|
|
-
|
|
|
<!-- The supervision narrative (plan 14 B6): state events
|
|
|
at full weight, comment events as .footnote — the
|
|
|
feed reads as events-with-occasional-footnotes. -->
|
|
|
@@ -613,13 +624,19 @@
|
|
|
the run (a draft goal has no thread to inject into). -->
|
|
|
<section class="card">
|
|
|
<h3>Comments</h3>
|
|
|
+ <!-- Plan 15 C4: timeless-comment footnote styling —
|
|
|
+ the BODY leads; the author and time read as a
|
|
|
+ muted footnote (status belongs in progress
|
|
|
+ updates). System rows keep their labelled style. -->
|
|
|
<div stm-for-comment-in="goal.comments"
|
|
|
stm-attribute.class="'comment' + (comment.from_agent ? ' agent' : '') + (comment.is_system ? ' system' : '')">
|
|
|
- <strong stm-if="!comment.is_system" stm-text="comment.author">author</strong>
|
|
|
- <span stm-if="comment.is_system" class="system-label">system</span>
|
|
|
- <span class="muted" stm-text="comment.created_display">when</span>
|
|
|
<div class="md" stm-markdown="comment.body">body</div>
|
|
|
<blockquote stm-if="comment.quote.length > 0" stm-text="comment.quote">quote</blockquote>
|
|
|
+ <p class="comment-meta">
|
|
|
+ <strong stm-if="!comment.is_system" stm-text="comment.author">author</strong>
|
|
|
+ <span stm-if="comment.is_system" class="system-label">system</span>
|
|
|
+ <span class="muted" stm-text="comment.created_display">when</span>
|
|
|
+ </p>
|
|
|
</div>
|
|
|
<p stm-if="goal.comments.length == 0" class="muted">No comments yet.</p>
|
|
|
<p stm-if="goal.run_task_id == 0" class="muted">The goal agent has not started
|