Skip to content

Conversation

luxaritas
Copy link
Member

@luxaritas luxaritas commented Sep 25, 2025

Summary

Implements Qualtrics reporting for Ribotree SAL/HAI seed grant user study

  • Adds postmessage reporter which filters for relevant events, tied to the qualtrics domain we'll use
  • Adds qualtrics-report feature flag to enable reporter and disable sending the solution to the server
  • Add reporting for script constraint results (as we want to track how the degscore changes over time)
  • Add new timer constraint which prevents the puzzle from solving until the time has elapsed. For this study we want the user to continue playing the puzzle for a certain amount of time, then auto-complete (this will be combined with soft constraints)
  • Supports suppressing the checkmark/glow/sound when a constraint is satisfied as it doesn't make sense for the timer constraint
  • Support soft constraints for challenge puzzles

Implementation Notes

  • We now always create the outline texture even if outline is disabled since it's used for positioning eg the stattext. It would maybe be better to decouple, but this seems to be an innocuous change to maintain the status quo.
  • We selectively only re-evaluate the timer constraint if that is the only part of the state that has changed. This is a small performance benefit, but mostly this is to avoid re-firing eternascripts which may do who-knows what (rerunning this often could cause creating unknown regressions and setting a bad precedent for authors)
  • We split off the last part of updateScore that updates constraints and possibly submits because calling the entirety of updatescore would cause a specbox update, which triggers a poseop, which causes a flicker of the async text. Also this avoids the performance penalty of all the other irrelevant state sync stuff.

Testing

Created puzzle on dev with degscore and timer constraints, verifying it solves correctly and degscore constraint info logs via console reporter as expected. Also verified simple hairpin solves correctly

…ones, which propogate their events to the original button
In particular we want to avoid re-running eternascript constraints,
which could be doing who knows what. In addition to unknown expectations
they may have around only being called on certain user interactions,
we also want to avoid setting an expectation that they'll be called
regularly because that seems ripe for poor author decisions and
later breakakge if we change something
This was due to two things:
1) Using the opqueue to trigger updatescore
2) In updatescore, we also use the opqueue for updating the melting
   point and dot plot for the specbox

We only actually need to recheck constraints, so this also is a bit of
an optimization
@luxaritas
Copy link
Member Author

This is stacked on #852

@luxaritas
Copy link
Member Author

For a stack diff: feat/observability...feat/salhai-report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant