Pointf5ive commited on
Commit
ca7d969
Β·
1 Parent(s): 83a57b2

Prevent workbook fallback from populating TOTEM scores

Browse files
Files changed (2) hide show
  1. app.py +20 -6
  2. src/totem_bridge.py +2 -0
app.py CHANGED
@@ -2925,7 +2925,13 @@ def clear_codex_form() -> tuple[None, str, str, str, str, str, str]:
2925
 
2926
  # ── WORKBOOK FUNCTIONS ────────────────────────────────────────────────────────
2927
 
2928
- def _build_dashboard_state_from_workbook(path: Path, status: str, notice: str = "") -> dict:
 
 
 
 
 
 
2929
  """
2930
  UI-layer adapter (Stage 8). Reads workbook analytics and maps into dashboard_state.
2931
  Does NOT change any extractor/scoring logic β€” reads only.
@@ -2938,7 +2944,7 @@ def _build_dashboard_state_from_workbook(path: Path, status: str, notice: str =
2938
  state["dashboard_message"] = notice or ""
2939
  state["last_analysis_at"] = datetime.datetime.now().isoformat(timespec="seconds") if status == "complete" else None
2940
 
2941
- if path.exists():
2942
  try:
2943
  log_df = score_log(path)
2944
  if log_df is not None and not log_df.empty:
@@ -3016,7 +3022,7 @@ def _build_dashboard_state_from_workbook(path: Path, status: str, notice: str =
3016
  def load_workbook(uploaded_file=None, notice: str = ""):
3017
  path = _validate_workbook_path(_clean_path(uploaded_file))
3018
  log_df = score_log(path)
3019
- state = _build_dashboard_state_from_workbook(path, "complete", notice)
3020
  return str(path), render_dashboard(state), log_df, _score_summary(log_df)
3021
 
3022
 
@@ -3049,14 +3055,18 @@ def set_active_workbook(uploaded_file):
3049
  def load_local_path(path_text: str):
3050
  path = _validate_workbook_path(Path(path_text or "").expanduser())
3051
  log_df = score_log(path)
3052
- state = _build_dashboard_state_from_workbook(path, "complete", "Local workbook loaded.")
3053
  return str(path), render_dashboard(state), log_df, _score_summary(log_df)
3054
 
3055
 
3056
  def run_analysis(active_path: str):
3057
  path = _validate_workbook_path(Path(active_path) if active_path else _preferred_workbook_path())
3058
  log_df = score_log(path)
3059
- state = _build_dashboard_state_from_workbook(path, "complete", "TOTEM analysis refreshed.")
 
 
 
 
3060
  return render_dashboard(state), log_df, _score_summary(log_df)
3061
 
3062
 
@@ -3224,7 +3234,11 @@ def run_totem_analysis_from_context(active_path: str, manuscript_context_json: s
3224
  def recalc_log(log_df, active_path: str):
3225
  path = _validate_workbook_path(Path(active_path) if active_path else _preferred_workbook_path())
3226
  recalculated = recalculate_log(log_df, path)
3227
- state = _build_dashboard_state_from_workbook(path, "complete", "Gates recalculated.")
 
 
 
 
3228
  return render_dashboard(state), recalculated, _score_summary(recalculated)
3229
 
3230
 
 
2925
 
2926
  # ── WORKBOOK FUNCTIONS ────────────────────────────────────────────────────────
2927
 
2928
+ def _build_dashboard_state_from_workbook(
2929
+ path: Path,
2930
+ status: str,
2931
+ notice: str = "",
2932
+ *,
2933
+ include_scorecard: bool = False,
2934
+ ) -> dict:
2935
  """
2936
  UI-layer adapter (Stage 8). Reads workbook analytics and maps into dashboard_state.
2937
  Does NOT change any extractor/scoring logic β€” reads only.
 
2944
  state["dashboard_message"] = notice or ""
2945
  state["last_analysis_at"] = datetime.datetime.now().isoformat(timespec="seconds") if status == "complete" else None
2946
 
2947
+ if path.exists() and include_scorecard:
2948
  try:
2949
  log_df = score_log(path)
2950
  if log_df is not None and not log_df.empty:
 
3022
  def load_workbook(uploaded_file=None, notice: str = ""):
3023
  path = _validate_workbook_path(_clean_path(uploaded_file))
3024
  log_df = score_log(path)
3025
+ state = _build_dashboard_state_from_workbook(path, "ready", notice or "Workbook loaded. Upload a manuscript and run TOTEM Analysis.")
3026
  return str(path), render_dashboard(state), log_df, _score_summary(log_df)
3027
 
3028
 
 
3055
  def load_local_path(path_text: str):
3056
  path = _validate_workbook_path(Path(path_text or "").expanduser())
3057
  log_df = score_log(path)
3058
+ state = _build_dashboard_state_from_workbook(path, "ready", "Local workbook loaded. Upload a manuscript and run TOTEM Analysis.")
3059
  return str(path), render_dashboard(state), log_df, _score_summary(log_df)
3060
 
3061
 
3062
  def run_analysis(active_path: str):
3063
  path = _validate_workbook_path(Path(active_path) if active_path else _preferred_workbook_path())
3064
  log_df = score_log(path)
3065
+ state = _build_dashboard_state_from_workbook(
3066
+ path,
3067
+ "ready",
3068
+ "Workbook is ready. Upload a manuscript and click Run TOTEM Analysis to score.",
3069
+ )
3070
  return render_dashboard(state), log_df, _score_summary(log_df)
3071
 
3072
 
 
3234
  def recalc_log(log_df, active_path: str):
3235
  path = _validate_workbook_path(Path(active_path) if active_path else _preferred_workbook_path())
3236
  recalculated = recalculate_log(log_df, path)
3237
+ state = _build_dashboard_state_from_workbook(
3238
+ path,
3239
+ "ready",
3240
+ "Gates recalculated in private controls. Run manuscript analysis to update dashboard metrics.",
3241
+ )
3242
  return render_dashboard(state), recalculated, _score_summary(recalculated)
3243
 
3244
 
src/totem_bridge.py CHANGED
@@ -144,6 +144,8 @@ def run_totem_skill(
144
  skill_text, skill_path = load_totem_skill()
145
 
146
  if _env_truthy("TOTEM_FAKE_API"):
 
 
147
  raw_payload = _fake_dashboard_payload(manuscript)
148
  validated = validate_dashboard_payload(raw_payload)
149
  return validated, {
 
144
  skill_text, skill_path = load_totem_skill()
145
 
146
  if _env_truthy("TOTEM_FAKE_API"):
147
+ if os.getenv("SPACE_ID") and not _env_truthy("TOTEM_ALLOW_FAKE_API_IN_SPACE"):
148
+ raise BridgeError("TOTEM_FAKE_API is disabled on Hugging Face Spaces.")
149
  raw_payload = _fake_dashboard_payload(manuscript)
150
  validated = validate_dashboard_payload(raw_payload)
151
  return validated, {