Fix: fix-7e39daba685cebc1e6a1.
What the agent did
Install the Panorama Tutor plugin from this checkout, enable it, generate the Tutor configuration/environment, and read back Panorama settings with the Tutor CLI; run the Makefile's unit, navigation, format, lint and type checks.
cd <guest-path> && pwd && ls -la && id -u && python3 --version && cat README.md | head -300
cd <guest-path> && sed -n 300,500p README.md; echo ---; cat pyproject.toml; cat Makefile; ls tests docs .coldpass; cat .gitignore; which tutor docker; ls /inputs 2>/dev/null
cd <guest-path> && ls tutorpanorama tests; cat .bumpversion.cfg | head -5; cat tutorpanorama/__about__.py; (python3 -m venv --help >/dev/null 2>&1 && echo venv_ok || echo venv_missing); echo CDP=$CDP_URL $<env-var>; which node npm docker git
cd <guest-path> && python3 -m venv <guest-path> && <guest-path> install --upgrade pip -q && cd <guest-path> && <guest-path> install -e '.[dev]' 2>&1 | tail -15; echo EXIT=$?
export TUTOR_ROOT=<guest-path>; export PATH=<guest-path>; cd <guest-path> && tutor plugins enable mfe panorama 2>&1 | tail -20; echo EXIT=$?; tutor config save 2>&1 | tail -20; echo EXIT2=$?; tutor plugins list 2>&1 | tail -20; ls $TUTOR_ROOT/env/plugins/mfe/build/mfe 2>/dev/null
export TUTOR_ROOT=<guest-path>; export PATH=<guest-path>; cd <guest-path> && grep -i panorama $TUTOR_ROOT/config.yml | head -30; echo ---; grep -n -i 'PANORAMA_MODE\|mode' $TUTOR_ROOT/config.yml | head; echo ---; python3 -m pytest tests -q 2>&1 | tail -8; echo PYTEST_EXIT=$?
export TUTOR_ROOT=<guest-path>; export PATH=<guest-path>; cd <guest-path> && tutor config printvalue PANORAMA_CRONTAB; echo EXIT=$?; tutor config printvalue PANORAMA_MODE; echo EXIT=$?; tutor config printvalue PANORAMA_MFE_PORT; echo EXIT=$?; tutor config printvalue PANORAMA_BASE_PREFIX; echo EXIT=$?; tutor config printvalue PANORAMA_DATALAKE_DATABASE; echo EXIT=$?; grep -n 'MODE\|DEMO' tutorpanorama/plugin.py | head -20
export TUTOR_ROOT=<guest-path>; export PATH=<guest-path>; export NODE_USE_ENV_PROXY=1; cd <guest-path> && node --version && npm --version && npm ci --ignore-scripts 2>&1 | tail -5; echo NPM_EXIT=$?; export PANORAMA_GENERATED_ENV="$TUTOR_ROOT/env/plugins/mfe/build/mfe/env.config.jsx"; ls -la "$PANORAMA_GENERATED_ENV" && node --test tests/navigation.cjs 2>&1 | tail -15; echo NAV_EXIT=$?; grep -rn -i 'cron' tutorpanorama/templates | head -20
export TUTOR_ROOT=<guest-path>; export PATH=<guest-path>; cd <guest-path> && find $TUTOR_ROOT/env -path '*panorama-elt*' -name crontab | head; f=$(find $TUTOR_ROOT/env -path '*panorama-elt*' -name crontab | head -1); cat "$f"; echo ---; export PYTHON=<guest-path>; make test-format 2>&1 | tail -3; echo FMT=$?; make test-lint 2>&1 | tail -3; echo LINT=$?; make test-types 2>&1 | tail -3; echo TYPES=$?
export TUTOR_ROOT=<guest-path>; cd <guest-path> && ls -la $TUTOR_ROOT/env/plugins/panorama/apps/panorama-elt/; wc -c $TUTOR_ROOT/env/plugins/panorama/apps/panorama-elt/crontab; cat tutorpanorama/templates/panorama/apps/panorama-elt/crontab; echo; grep -rn 'crontab' tutorpanorama/plugin.py | head
export PATH=<guest-path>; export TUTOR_ROOT=<guest-path>; cd <guest-path> && tutor plugins enable mfe panorama >/dev/null 2>&1; tutor config save --set PANORAMA_MODE=CUSTOM 2>&1 | tail -3; echo EXIT=$?; tutor config printvalue PANORAMA_MODE; tutor config printvalue PANORAMA_CRONTAB; cat $TUTOR_ROOT/env/plugins/panorama/apps/panorama-elt/crontab; echo ---; tutor config printvalue PANORAMA_CRONTAB >/dev/null; export TUTOR_ROOT=<guest-path>; tutor config printvalue PANORAMA_MODE
cd <guest-path> && mkdir -p .coldpass && cat > .coldpass/probe.json <<'EOF'
{"kind":"cli","argv":["tutor","config","printvalue","PANORAMA_MODE"],"cwd":"<guest-path>","env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"DEMO"}
EOF
cat > .coldpass/claims.json <<'EOF'
[
{"kind":"claim","claim":"Default mode is DEMO","source":"Since 16.3.0, the default mode of Panorama is `DEMO`.","input":"tutor config printvalue PANORAMA_MODE","expected":"DEMO","probe_kind":"cli","argv":["tutor","config","printvalue","PANORAMA_MODE"],"env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"DEMO","cwd":"<guest-path>"},
{"kind":"claim","claim":"MFE port default is 2100","source":"| `PANORAMA_MFE_PORT` | `2100` | Internal port of the Panorama MFE |","input":"tutor config printvalue PANORAMA_MFE_PORT","expected":"2100","probe_kind":"cli","argv":["tutor","config","printvalue","PANORAMA_MFE_PORT"],"env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"2100","cwd":"<guest-path>"},
{"kind":"claim","claim":"Base prefix default is openedx","source":"| `PANORAMA_BASE_PREFIX` | `openedx` | Directory inside the `PANORAMA_BUCKET` to store the raw data |","input":"tutor config printvalue PANORAMA_BASE_PREFIX","expected":"openedx","probe_kind":"cli","argv":["tutor","config","printvalue","PANORAMA_BASE_PREFIX"],"env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"openedx","cwd":"<guest-path>"},
{"kind":"claim","claim":"Hourly schedule at a random minute","source":"Hourly dataset updates at a random minute","input":"tutor config printvalue PANORAMA_CRONTAB","expected":"54 * * * *","probe_kind":"cli","argv":["tutor","config","printvalue","PANORAMA_CRONTAB"],"env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"54 * * * *","cwd":"<guest-path>"}
]
EOF
cat > .coldpass/examples.json <<'EOF'
[
{"kind":"example","claim":"Unit contract tests pass","source":"Makefile test-unit","input":"make test-unit PYTHON=<guest-path>","expected":"pytest reports no failures","argv":["make","test-unit","PYTHON=<guest-path>"],"cwd":"<guest-path>","env":{"PATH":"<guest-path>"},"expected_text":"passed"},
{"kind":"example","claim":"Navigation tests pass on generated MFE config","source":"Makefile test-navigation","input":"make test-navigation PYTHON=<guest-path>","expected":"node tests pass","argv":["make","test-navigation","PYTHON=<guest-path>"],"cwd":"<guest-path>","env":{"PATH":"<guest-path>","NODE_USE_ENV_PROXY":"1"},"expected_text":"# fail 0"},
{"kind":"example","claim":"Formatting check passes","source":"Makefile test-format","input":"make test-format PYTHON=<guest-path>","expected":"black leaves files unchanged","argv":["make","test-format","PYTHON=<guest-path>"],"cwd":"<guest-path>","env":{"PATH":"<guest-path>"},"expected_text":"would be left unchanged"}
]
EOF
cat > .coldpass/cycles.json <<'EOF'
{"detected":true,"checks":[{"claim":"Scheduled extraction cron line is rendered for non-DEMO modes","source":"tutorpanorama/templates/panorama/apps/panorama-elt/crontab","quote":"{% if PANORAMA_MODE != 'DEMO' %}","schedule":"PANORAMA_CRONTAB hourly cron","method":"rendered crontab in CUSTOM mode via tutor config save (no ELT run; no AWS/MySQL available)","input":"TUTOR_ROOT=<guest-path> with PANORAMA_MODE=CUSTOM","expected":"Environment generated with the cron line","kind":"cli","argv":["tutor","config","save"],"cwd":"<guest-path>","env":{"TUTOR_ROOT":"<guest-path>","PATH":"<guest-path>"},"expected_text":"Environment generated in"}]}
EOF
for f in probe claims examples cycles; do python3 -I -m json.tool .coldpass/$f.json >/dev/null && echo "$f ok"; done; export TUTOR_ROOT=<guest-path>; cd <guest-path> && PATH=<guest-path> make test-unit PYTHON=<guest-path> 2>&1 | tail -2
cd <guest-path> && ls <guest-path> /inputs 2>&1 | head; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | tail -60; echo CHECK_EXIT=$?
cd <guest-path> && cat > .coldpass/report.json <<'EOF'
{"outcome":"working","fault_owner":null,"operation":"Install the Panorama Tutor plugin from this checkout, enable it, generate the Tutor configuration/environment, and read back Panorama settings with the Tutor CLI; run the Makefile's unit, navigation, format, lint and type checks.","operation_scope":"Linux guest (Ubuntu, Python 3.12.3, Node v22.23.4, npm 10.9.9). Tutor 22.0.3 and tutor-mfe 22.1.1 installed via pip. No Docker, so no image build or running Open edX/Panorama stack. The ELT extraction job itself was not run (needs panorama-elt image, AWS, MySQL/Mongo). DEMO mode is the default; the scheduled extraction line only renders for non-DEMO modes.","steps":["python3 -m venv <guest-path> && <guest-path> install --upgrade pip","<guest-path> install -e '.[dev]' (README: 'For an unpublished checkout, install with `pip install -e .`')","TUTOR_ROOT=<guest-path> tutor plugins enable mfe panorama","TUTOR_ROOT=<guest-path> tutor config save","TUTOR_ROOT=<guest-path> tutor config printvalue PANORAMA_MODE -> DEMO","tutor config printvalue PANORAMA_MFE_PORT -> 2100; PANORAMA_BASE_PREFIX -> openedx; PANORAMA_CRONTAB -> 54 * * * *","make test-unit (24 passed, 4 skipped)","npm ci --ignore-scripts; make test-navigation (4 passed)","make test-format, make test-lint, make test-types (all pass)","TUTOR_ROOT=<guest-path> tutor config save --set PANORAMA_MODE=CUSTOM -> rendered crontab '4 * * * * /usr/local/bin/python /panorama-elt/panorama.py ... extract-and-load --all'"],"deviations":["README's `pip install --pre 'tutor-contrib-panorama>=22,<23'` is for the published package; used the README's documented `pip install -e .` for the unpublished checkout (with [dev] extras from the Makefile).","Used `tutor plugins enable mfe panorama` (Makefile test-tutor form) instead of only `tutor plugins enable panorama`, because the MFE plugin is required for the navigation test.","Did not run `tutor images build openedx|mfe` or `tutor local restart` (README install steps): requires Docker and a large image build, not available in this guest.","Did not run the Panorama ELT extraction; the cycle check renders the crontab in CUSTOM mode via `tutor config save` as a substitute for a real scheduled run, with no AWS/MySQL.","Tutor prints a harmless warning 'Failed to enable plugin indigo: plugin indigo is not installed' from its default plugin list.","No .git metadata in the workspace; the git init/fetch pin steps were not needed for the documented commands, so I did not verify the snapshot against the pinned commit cfd349828144e7e61da9bffbf8a90b45ab139f84."],"stuck_step":null,"main_blocker":null,"plain_failure":null,"suggested_fix":"None for the tested paths. Docker-based image build and a real extraction run remain untested because they need Docker and AWS/database access."}
EOF
python3 -I -m json.tool .coldpass/report.json >/dev/null && echo report_ok; <env-var>=<guest-path> python3 -I <guest-path> --validate --replay 2>&1 | head -c 300; echo; ls -la .coldpass