@@ -362,7 +362,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
Personal research mode. This copy is for your own analysis, paper tracking, and manual trade research only. It does not pool money, onboard investors, custody funds, bypass eligibility rules, or place orders without your manual approval.
-
Build v27 active: agents now require measurable post-cost edge, use strategy-specific entry rules, avoid jump-to-settlement events, and wait 72 hours before reconsidering a stopped market. No return is guaranteed.
+
Build v28 active: agents require measurable post-cost edge, use strategy-specific entry rules, avoid jump-to-settlement events, and record structured exit reasons for continuous review. No return is guaranteed.
@@ -743,7 +743,7 @@ footer{margin-top:34px;padding-top:22px;border-top:1px solid var(--border);color
@@ -770,7 +770,7 @@ const EXIT_STALE_DAYS = 10;
const EXIT_RESOLUTION_DAYS = 2;
const AGENTS_KEY = "pma_agents_v2";
const SUG_KEY = "pma_suggestions_v5";
-const SUGGESTION_ENGINE_VERSION = 27;
+const SUGGESTION_ENGINE_VERSION = 28;
const FOCUS_KEY = "pma_focus_v1";
const VIEW_KEY = "pma_view_v1";
const PF_SORT_KEY = "pma_portfolio_sort_v1";
@@ -1578,7 +1578,7 @@ function stopLossLabel(pos){
function stopOutPosition(p,pos){
const proceeds=+(pos.shares*pos.current_price).toFixed(2);
p.cash=+(p.cash+proceeds).toFixed(2);
- pos.exit_price=pos.current_price;pos.closed_at=cycleIso();
+ pos.exit_price=pos.current_price;pos.closed_at=cycleIso();pos.close_reason="Stop loss -18%";pos.close_action="STOP";
pos.realized_pnl=+(proceeds-pos.cost).toFixed(2);
p.closed.push(pos);rememberStop(p,pos);
p.history.push({date:logDay(),action:"STOP",question:pos.question,side:pos.side,
@@ -1612,7 +1612,7 @@ function scaleStopLossPosition(p,pos,tier){
function closePosition(p,pos,reason,action="CLOSE"){
const proceeds=+(pos.shares*pos.current_price).toFixed(2);
p.cash=+(p.cash+proceeds).toFixed(2);
- pos.exit_price=pos.current_price;pos.closed_at=cycleIso();
+ pos.exit_price=pos.current_price;pos.closed_at=cycleIso();pos.close_reason=reason;pos.close_action=action;
pos.realized_pnl=+(proceeds-pos.cost).toFixed(2);
p.closed.push(pos);
p.history.push({date:logDay(),action,question:pos.question,side:pos.side,
@@ -1653,7 +1653,7 @@ function exitReason(pos,fresh,analysis,cfg){
if(pos.quality==="explore")return "Quality audit retired zero-edge exploration exposure";
if(pos.quality==="trend"&&entryEdge