{
  "_class" : "hudson.model.FreeStyleBuild",
  "actions" : [
    {
      "_class" : "hudson.model.CauseAction",
      "causes" : [
        {
          "_class" : "hudson.triggers.TimerTrigger$TimerTriggerCause",
          "shortDescription" : "Started by timer"
        }
      ]
    },
    {
      
    },
    {
      "_class" : "hudson.plugins.git.util.BuildData",
      "buildsByBranchName" : {
        "refs/remotes/origin/dev-student-grouping" : {
          "_class" : "hudson.plugins.git.util.Build",
          "buildNumber" : 44,
          "buildResult" : null,
          "marked" : {
            "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
            "branch" : [
              {
                "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
                "name" : "refs/remotes/origin/dev-student-grouping"
              }
            ]
          },
          "revision" : {
            "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
            "branch" : [
              {
                "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
                "name" : "refs/remotes/origin/dev-student-grouping"
              }
            ]
          }
        }
      },
      "lastBuiltRevision" : {
        "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
        "branch" : [
          {
            "SHA1" : "f9d712f17d56b8e7e3e77ec43df26eba167ebc70",
            "name" : "refs/remotes/origin/dev-student-grouping"
          }
        ]
      },
      "remoteUrls" : [
        "https://github.com/UstadMobile/Respect.git"
      ],
      "scmName" : ""
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    
  ],
  "building" : false,
  "description" : null,
  "displayName" : "#44",
  "duration" : 87266,
  "estimatedDuration" : 199031,
  "executor" : null,
  "fullDisplayName" : "dev-student-grouping #44",
  "id" : "44",
  "inProgress" : false,
  "keepLog" : false,
  "number" : 44,
  "queueId" : 8521,
  "result" : "FAILURE",
  "timestamp" : 1779162240993,
  "url" : "https://devserver3.ustadmobile.com/jenkins/job/dev-student-grouping/44/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.plugins.git.GitChangeSetList",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-datalayer-db/src/jvmTest/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDbTest.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/inviteperson/InvitePersonViewModel.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/list/ReportTemplateListScreen.kt",
          "gradle/libs.versions.toml",
          "respect-lib-xapi-nanohttpd/.gitignore",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/edit/AssignmentEditViewModel.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/edit/AssignmentEditScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/invite/ApproveOrDeclineInviteRequestUseCase.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/manageaccount/ManageAccountViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/waitingforapproval/WaitingForApprovalViewModel.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/AssignmentDataSourceHttp.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/acceptinvite/AcceptInviteViewModel.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/AssignmentDataSourceRepository.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/list/AppListViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/detail/ReportDetailViewModel.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/PersonQrBadgeDataSourceHttp.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/otheroptionsignup/OtherOptionsSignupViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/clazz/detail/ClazzDetailViewModel.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/ClassDataSourceRepository.kt",
          "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/school/PersonPasswordDataSourceExt.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/enrollment/edit/EnrollmentEditViewModel.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/indicator/edit/IndicatorEditScreen.kt",
          "respect-server/src/main/kotlin/world/respect/server/util/ext/ApplicationCallExt.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/EnrollmentDataSourceRepository.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/otheroption/OtherOptionsViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/setusernameandpassword/CreateAccountSetPasswordViewModel.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/schooldirectory/SchoolDirectoryEntryDataSourceHttp.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/setusernameandpassword/CreateAccountSetUserNameViewModel.kt",
          "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/PersonRepositoryIntegrationTest.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/schooldirectory/SchoolDirectoryEntryDataSourceRepository.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/indictor/list/IndicatorListViewmodel.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiResourceProvider.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonPasswordDataSourceRepository.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonDataSourceRepository.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/detail/ClazzDetailScreen.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/opds/OpdsFeedDataSourceRepository.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/xapi/XapiStatementsResourceRepository.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/curriculum/mapping/edit/CurriculumMappingEditViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/edit/ReportEditViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/RespectAccountManager.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/changepassword/ChangePasswordViewModel.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/ClassDataSourceHttp.kt",
          "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/DataLoadStateExt.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/RespectViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/permissions/CheckSchoolPermissionsUseCase.kt",
          "respect-lib-xapi-nanohttpd/build.gradle.kts",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/clazz/edit/ClazzEditViewModel.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/opds/OpdsPublicationDataSourceRepository.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/ext/SchoolDirectoryDataSourceExt.kt",
          "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/LocalModelDataSourceExt.kt",
          "respect-lib-shared/src/jvmMain/kotlin/world/respect/shared/domain/account/authwithpassword/GetTokenAndUserProfileWithCredentialDbImpl.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/detail/AppsDetailViewModel.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/inviteperson/InvitePersonScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/enrollment/list/EnrollmentListViewModel.kt",
          "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/opds/OpdsRespectRepositoryIntegrationTest.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/detail/PersonDetailViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/getstarted/GetStartedViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/launcher/AppLauncherViewModel.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/model/XapiStatement.kt",
          "respect-server/src/main/kotlin/world/respect/server/domain/school/add/AddSchoolUseCase.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/indictor/edit/IndictorEditViewmodel.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/SchoolPermissionGrantDataSourceHttp.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/SchoolPermissionGrantDataSourceRepository.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/apps/list/AppListScreen.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/enrollment/edit/EnrollmentEditScreen.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdSessionExt.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/signup/CreateAccountViewModel.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/passkeyList/PasskeyListScreen.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/pullsync/RunPullSyncUseCase.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonPasskeyDataSourceRepository.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/curriculum/mapping/edit/CurriculumMappingEditScreen.kt",
          "respect-lib-shared/src/jvmMain/kotlin/world/respect/shared/domain/account/child/AddChildAccountUseCaseDb.kt",
          "respect-datalayer-db/src/commonMain/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDb.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/InviteDataSourceHttp.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/EnrollmentDataSourceHttp.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/edit/ClazzEditScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/edit/PersonEditViewModel.kt",
          "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/ext/DataLoadStateExt.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/manageaccount/ManageAccountScreen.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/list/ReportListScreen.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/model/XapiStatementResult.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/apps/launcher/AppLauncherScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/list/PersonListViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/schooldirectory/edit/SchoolDirectoryEditViewModel.kt",
          "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/PlaylistRepositoryIntegrationTest.kt",
          "respect-app-compose/src/androidMain/kotlin/world/respect/credentials/passkey/CheckPasskeySupportUseCaseAndroidImpl.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/opds/OpdsPublicationDataSourceHttp.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/PersonDataSourceHttp.kt",
          "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/opds/OpdsFeedDataSourceHttp.kt",
          "respect-datalayer-db/src/jvmTest/kotlin/world/respect/datalayer/db/school/TestPersonStorage.kt",
          "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/xapi/XapiStatementRepositoryIntegrationTest.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/list/AssignmentListScreen.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/enrollment/list/EnrollmentListScreen.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/InviteDataSourceRepository.kt",
          "settings.gradle.kts",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/indicator/detail/IndicatorDetailScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/accountlist/AccountListViewModel.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonQrCodeBadgeDataSourceRepository.kt",
          "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/SchoolAppDataSourceRepository.kt"
        ],
        "commitId" : "2826c4ba92af36c30d981499671efe3768192b5b",
        "timestamp" : 1777923705000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Work in progress adding embedded Nanohttpd based xapi server.\u000a",
        "date" : "2026-05-04 23:41:45 +0400",
        "id" : "2826c4ba92af36c30d981499671efe3768192b5b",
        "msg" : "Work in progress adding embedded Nanohttpd based xapi server.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/waitingforapproval/WaitingForApprovalViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonQrCodeBadgeDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/launcher/AppLauncherViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/opds/OpdsPublicationDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/passkeyList/PasskeyListScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/kotlin/world/respect/server/util/ext/ApplicationCallExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/inviteperson/InvitePersonScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/enrollment/edit/EnrollmentEditViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/xapi/XapiStatementsResourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/list/AssignmentListScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/PlaylistRepositoryIntegrationTest.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/detail/ReportDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonPasskeyDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/jvmMain/kotlin/world/respect/shared/domain/account/child/AddChildAccountUseCaseDb.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/invite/ApproveOrDeclineInviteRequestUseCase.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/detail/PersonDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/ClassDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/list/ReportTemplateListScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/PersonQrBadgeDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/list/PersonListViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/otheroption/OtherOptionsViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/detail/AssignmentDetailScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/acceptinvite/AcceptInviteViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-db/src/commonMain/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDb.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/changepassword/ChangePasswordViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/kotlin/world/respect/server/domain/school/add/AddSchoolUseCase.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/indicator/detail/IndicatorDetailScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/RespectViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/EnrollmentDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/accountlist/AccountListViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/androidMain/kotlin/world/respect/credentials/passkey/CheckPasskeySupportUseCaseAndroidImpl.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/list/ReportListScreen.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/opds/OpdsRespectRepositoryIntegrationTest.kt"
          },
          {
            "editType" : "edit",
            "file" : "settings.gradle.kts"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/assignment/edit/AssignmentEditScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/detail/ClazzDetailScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/apps/list/AppListScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-db/src/jvmTest/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDbTest.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/opds/OpdsPublicationDataSourceHttp.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdSessionExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/person/manageaccount/ManageAccountScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/edit/ReportEditViewModel.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/ext/DataLoadStateExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/SchoolAppDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/pullsync/RunPullSyncUseCase.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/InviteDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/RespectAccountManager.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/list/AppListViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/indictor/edit/IndictorEditViewmodel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/report/indictor/list/IndicatorListViewmodel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/curriculum/mapping/edit/CurriculumMappingEditViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/curriculum/mapping/edit/CurriculumMappingEditScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/clazz/edit/ClazzEditViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/enrollment/list/EnrollmentListViewModel.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/.gitignore"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/SchoolPermissionGrantDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/ext/SchoolDirectoryDataSourceExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/PersonDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/schooldirectory/SchoolDirectoryEntryDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/enrollment/list/EnrollmentListScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/manageaccount/ManageAccountViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/ClassDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/AssignmentDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/detail/AssignmentDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/enrollment/edit/EnrollmentEditScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/permissions/CheckSchoolPermissionsUseCase.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/edit/PersonEditViewModel.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/build.gradle.kts"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/report/indicator/edit/IndicatorEditScreen.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiResourceProvider.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/AssignmentDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/model/XapiStatementResult.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/getstarted/GetStartedViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/EnrollmentDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/SchoolPermissionGrantDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/LocalModelDataSourceExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/edit/ClazzEditScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/signup/CreateAccountViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/otheroptionsignup/OtherOptionsSignupViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/opds/OpdsFeedDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/jvmMain/kotlin/world/respect/shared/domain/account/authwithpassword/GetTokenAndUserProfileWithCredentialDbImpl.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/schooldirectory/edit/SchoolDirectoryEditViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/school/PersonPasswordDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/opds/OpdsFeedDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/school/PersonPasswordDataSourceExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/clazz/detail/ClazzDetailViewModel.kt"
          },
          {
            "editType" : "delete",
            "file" : "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/DataLoadStateExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-db/src/jvmTest/kotlin/world/respect/datalayer/db/school/TestPersonStorage.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/PersonRepositoryIntegrationTest.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/model/XapiStatement.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/setusernameandpassword/CreateAccountSetPasswordViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-http/src/commonMain/kotlin/world/respect/datalayer/http/school/InviteDataSourceHttp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/jvmTest/kotlin/world/respect/datalayer/repository/school/xapi/XapiStatementRepositoryIntegrationTest.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/detail/AppsDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/setusernameandpassword/CreateAccountSetUserNameViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/person/inviteperson/InvitePersonViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "gradle/libs.versions.toml"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-repository/src/commonMain/kotlin/world/respect/datalayer/repository/schooldirectory/SchoolDirectoryEntryDataSourceRepository.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/apps/launcher/AppLauncherScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/assignment/edit/AssignmentEditViewModel.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdResourceProvider.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCaseAndroid.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiResourceProvider.kt",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/xapinanohttpd/XapiNanoHttpdResourceProviderAndroid.kt",
          "respect-app-compose/src/androidMain/kotlin/world/respect/AppKoinModule.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCase.kt",
          "respect-lib-shared/build.gradle.kts"
        ],
        "commitId" : "901a5b08da74d631ae8e8db83adf9ae8d0383e4a",
        "timestamp" : 1777973593000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Work in progress: setup learning unit detail viewmodel to get xapi launch url using embedded xapi server.\u000a",
        "date" : "2026-05-05 13:33:13 +0400",
        "id" : "901a5b08da74d631ae8e8db83adf9ae8d0383e4a",
        "msg" : "Work in progress: setup learning unit detail viewmodel to get xapi launch url using embedded xapi server.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/xapinanohttpd/XapiNanoHttpdResourceProviderAndroid.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/build.gradle.kts"
          },
          {
            "editType" : "delete",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiResourceProvider.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdResourceProvider.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/androidMain/kotlin/world/respect/AppKoinModule.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCaseAndroid.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCase.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/XAPI.js"
        ],
        "commitId" : "56c69cf8141536edd9ca3a490e7a4d847406e073",
        "timestamp" : 1777982700000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Work in progress: setup learning unit detail viewmodel to get xapi launch url using embedded xapi server.\u000a",
        "date" : "2026-05-05 16:05:00 +0400",
        "id" : "56c69cf8141536edd9ca3a490e7a4d847406e073",
        "msg" : "Work in progress: setup learning unit detail viewmodel to get xapi launch url using embedded xapi server.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/XAPI.js"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-xapi-core/README_PERMISSION_RECIPE.md"
        ],
        "commitId" : "4c50dfefc4af552e7a8914ff22a87baa5a6e0125",
        "timestamp" : 1778436234000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Refine permission recipe to be folder based : simpler for queries, simpler to run on mobile/SQL, and suitable for folder based backends (e.g. Google Drive, NextCloud, etc).\u000a",
        "date" : "2026-05-10 22:03:54 +0400",
        "id" : "4c50dfefc4af552e7a8914ff22a87baa5a6e0125",
        "msg" : "Refine permission recipe to be folder based : simpler for queries, simpler to run on mobile/SQL, and suitable for folder based backends (e.g. Google Drive, NextCloud, etc).",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/README_PERMISSION_RECIPE.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-xapi-core/README_PERMISSION_RECIPE.md"
        ],
        "commitId" : "fd821aaf134d6baa9a915c36fccfd80c49cfcbf6",
        "timestamp" : 1778491957000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Add note on canonical updates to permission recipe.\u000a",
        "date" : "2026-05-11 13:32:37 +0400",
        "id" : "fd821aaf134d6baa9a915c36fccfd80c49cfcbf6",
        "msg" : "Add note on canonical updates to permission recipe.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/README_PERMISSION_RECIPE.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/invite/ApproveOrDeclineInviteRequestUseCase.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/detail/ClazzDetailScreen.kt"
        ],
        "commitId" : "b1f93cb7e0056227f44fbca69dc7a53f52ed2caf",
        "timestamp" : 1778590018000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Merge dev-xapi changes.\u000a",
        "date" : "2026-05-12 16:46:58 +0400",
        "id" : "b1f93cb7e0056227f44fbca69dc7a53f52ed2caf",
        "msg" : "Merge dev-xapi changes.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/account/invite/ApproveOrDeclineInviteRequestUseCase.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/clazz/detail/ClazzDetailScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/kotlin/world/respect/server/Application.kt",
          "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/respect/model/RespectConstants.kt",
          "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/manageuser/termsandcondition/TermsAndConditionScreen.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/termsandcondition/TermsAndConditionViewModel.kt",
          "respect-app-compose/build.gradle.kts"
        ],
        "commitId" : "4513cf5f87165b746305c8498a57997e28a61f51",
        "timestamp" : 1778692885000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Update terms/conditions to use .well-known path on school directory server.\u000aBump version.\u000a",
        "date" : "2026-05-13 21:21:25 +0400",
        "id" : "4513cf5f87165b746305c8498a57997e28a61f51",
        "msg" : "Update terms/conditions to use .well-known path on school directory server.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/kotlin/world/respect/server/Application.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/commonMain/kotlin/world/respect/app/view/manageuser/termsandcondition/TermsAndConditionScreen.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/respect/model/RespectConstants.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/manageuser/termsandcondition/TermsAndConditionViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/build.gradle.kts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "CODE_OF_CONDUCT.md"
        ],
        "commitId" : "230b80b2452d708b0978043e033e0a5826668285",
        "timestamp" : 1778743774000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/noreply",
          "fullName" : "noreply"
        },
        "authorEmail" : "noreply@github.com",
        "comment" : "Add guideline on AI-generated content submission\u000a\u000aAdd explicit guidelines against submission of AI slop\u000a",
        "date" : "2026-05-14 11:29:34 +0400",
        "id" : "230b80b2452d708b0978043e033e0a5826668285",
        "msg" : "Add guideline on AI-generated content submission",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "CODE_OF_CONDUCT.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "CODE_OF_CONDUCT.md"
        ],
        "commitId" : "e5a71f872211b1adc6692b881a207ff34a1d3de0",
        "timestamp" : 1778743821000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/noreply",
          "fullName" : "noreply"
        },
        "authorEmail" : "noreply@github.com",
        "comment" : "Clarify guidelines on submitting AI-generated content\u000a",
        "date" : "2026-05-14 11:30:21 +0400",
        "id" : "e5a71f872211b1adc6692b881a207ff34a1d3de0",
        "msg" : "Clarify guidelines on submitting AI-generated content",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "CODE_OF_CONDUCT.md"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCaseAndroid.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementsResourceExt.kt",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/xapinanohttpd/XapiNanoHttpdResourceProviderAndroid.kt",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdSessionExt.kt"
        ],
        "commitId" : "1b761b2d7f5431b5d5a5eaa8050c5a271e92a7fa",
        "timestamp" : 1778750991000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Initial xAPI embedded server implementation.\u000a\u000aAdd support for cross origin requests for embedded statements endpoint.\u000a Fix nanohttpd bodyAsBytes function\u000a Fix basic auth encoding/decoding\u000a",
        "date" : "2026-05-14 13:29:51 +0400",
        "id" : "1b761b2d7f5431b5d5a5eaa8050c5a271e92a7fa",
        "msg" : "Initial xAPI embedded server implementation.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/xapinanohttpd/XapiNanoHttpdResourceProviderAndroid.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementsResourceExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdSessionExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/xapi/getxapilaunchurl/GetXapiLaunchUrlUseCaseAndroid.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/kotlin/world/respect/server/Application.kt"
        ],
        "commitId" : "1e990ff70a0085f5b22a53f3cf93da7cacc978ff",
        "timestamp" : 1778762633000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Fix ktor path for xapi statements resource.\u000a",
        "date" : "2026-05-14 16:43:53 +0400",
        "id" : "1e990ff70a0085f5b22a53f3cf93da7cacc978ff",
        "msg" : "Fix ktor path for xapi statements resource.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/kotlin/world/respect/server/Application.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdResponseExt.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/xapi_module.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/XAPI.js"
        ],
        "commitId" : "846633c662e52445f3613caeed6ebfa5457d972d",
        "timestamp" : 1778768829000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Initial statement maker.\u000a",
        "date" : "2026-05-14 18:27:09 +0400",
        "id" : "846633c662e52445f3613caeed6ebfa5457d972d",
        "msg" : "Initial statement maker.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/ext/NanoHttpdResponseExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/XAPI.js"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/xapi_module.js"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/navigation/AppRoutes.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.json",
          "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementExt.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/OpenEelXapiConstants.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html"
        ],
        "commitId" : "1bc6aeeb9246345ab46c4839c4a5728d7e8d0e51",
        "timestamp" : 1778952646000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Update statement maker to use a statement json from text area and actor from params.\u000aUpdate LaunchAppUseCase to accept an assignment activity id.\u000a",
        "date" : "2026-05-16 21:30:46 +0400",
        "id" : "1bc6aeeb9246345ab46c4839c4a5728d7e8d0e51",
        "msg" : "Update statement maker to use a statement json from text area and actor from params.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/navigation/AppRoutes.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/learningunit/detail/LearningUnitDetailViewModel.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/OpenEelXapiConstants.kt"
          },
          {
            "editType" : "add",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.json"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-nanohttpd/src/commonMain/kotlin/world/respect/lib/xapi/nanohttpd/XapiNanoHttpdApp.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/script.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/audio.ogg",
          "respect-server/src/main/resources/http/respect-ds/case_valid/appmanifest.json",
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/detail/AppsDetailViewModel.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/video.mp4",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/icon.png",
          "respect-server/src/main/resources/http/respect-ds/case_valid/js/xapi_module.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/js/xapi_statement_maker.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/xapi_module.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/icon.png",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/index.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/script.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/cover.png",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/statementmaker.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/icon.png",
          "respect-server/src/main/resources/http/respect-ds/case_valid/index.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/index.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/audio.ogg",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/video.mp4",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/cover.png"
        ],
        "commitId" : "30e70b9f21b72016986ca29770c01c87cd314d6a",
        "timestamp" : 1778955365000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Update example app structure and naming.\u000a",
        "date" : "2026-05-16 22:16:05 +0400",
        "id" : "30e70b9f21b72016986ca29770c01c87cd314d6a",
        "msg" : "Update example app structure and naming.",
        "paths" : [
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.html"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/index.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/index.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/js/xapi_module.js"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/viewmodel/apps/detail/AppsDetailViewModel.kt"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/cover.png"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/statementmaker.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/audio.ogg"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/script.js"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/grade1.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/js/xapi_statement_maker.js"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/video.mp4"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/index.json"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/lesson001.json"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/audio.ogg"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/cover.png"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/icon.png"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/icon.png"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/xapi_module.js"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/index.html"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/appmanifest.json"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/script.js"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/lesson001/video.mp4"
          },
          {
            "editType" : "delete",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/grade1/statementmaker/statementmaker.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/statementmaker/icon.png"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-space.gif",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-right.gif",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/base64.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/NOTICE",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TC_tetris.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/LICENSE",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/launch.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/jquery-1.6.4.min.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/2.5.3-crypto-sha1.js",
          "respect-datalayer-repository/log/respect-server.2026-05-04.0.log",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-up.gif",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/README.md",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.ico",
          "respect-datalayer-repository/log/respect-server.2026-05-12.0.log",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/icon.png",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/jstetris.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.css",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-left.gif",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.js",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/index.json",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-down.gif",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.html",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TC_tetris.css",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tincan.xml",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/readme.txt"
        ],
        "commitId" : "6187e85e6df49136f148542a2076e86061721555",
        "timestamp" : 1778956821000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Add jstetris example.\u000a",
        "date" : "2026-05-16 22:40:21 +0400",
        "id" : "6187e85e6df49136f148542a2076e86061721555",
        "msg" : "Add jstetris example.",
        "paths" : [
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/jstetris.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/base64.js"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/icon.png"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-space.gif"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/2.5.3-crypto-sha1.js"
          },
          {
            "editType" : "add",
            "file" : "respect-datalayer-repository/log/respect-server.2026-05-12.0.log"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/NOTICE"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TC_tetris.css"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/README.md"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/launch.html"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tincan.xml"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/index.json"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.ico"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TinCanJS/LICENSE"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-up.gif"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/readme.txt"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-down.gif"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/TC_tetris.js"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.css"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-right.gif"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/jquery-1.6.4.min.js"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/key-left.gif"
          },
          {
            "editType" : "add",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/jstetris/tetris.js"
          },
          {
            "editType" : "add",
            "file" : "respect-datalayer-repository/log/respect-server.2026-05-04.0.log"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json",
          "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt",
          "respect-app-compose/src/androidMain/AndroidManifest.xml"
        ],
        "commitId" : "62ccad8b6c976ed3de4ef7ac2ef6e8e401801ced",
        "timestamp" : 1779005615000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Update LaunchAppUseCaseAndroid to handle launching native app if app with a verified app link is available.\u000a\u000aOtherwise fall back to using our own WebView Activity. Handle SDK30+ and pre-SDK30.\u000a",
        "date" : "2026-05-17 12:13:35 +0400",
        "id" : "62ccad8b6c976ed3de4ef7ac2ef6e8e401801ced",
        "msg" : "Update LaunchAppUseCaseAndroid to handle launching native app if app with a verified app link is available.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/androidMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCaseAndroid.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json"
          },
          {
            "editType" : "edit",
            "file" : "respect-app-compose/src/androidMain/AndroidManifest.xml"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/HttpClientExt.kt",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementExt.kt",
          "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json",
          "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/OpenEelXapiConstants.kt",
          "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/DataLoadParams.kt",
          "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/DataLoadMetaInfo.kt",
          "respect-datalayer-db/src/commonMain/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDb.kt"
        ],
        "commitId" : "c9c53997c97601c6ae6fcefb5c3be6229e17d946",
        "timestamp" : 1779014144000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Work in progress: add header xapi header fields\u000a",
        "date" : "2026-05-17 14:35:44 +0400",
        "id" : "c9c53997c97601c6ae6fcefb5c3be6229e17d946",
        "msg" : "Work in progress: add header xapi header fields",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-server/src/main/resources/http/respect-ds/case_valid/examples/lesson001/lesson001.json"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/DataLoadParams.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-dataloadstate/src/commonMain/kotlin/world/respect/lib/dataloadstate/DataLoadMetaInfo.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/ext/XapiStatementExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer/src/commonMain/kotlin/world/respect/datalayer/ext/HttpClientExt.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-lib-xapi-core/src/commonMain/kotlin/world/respect/lib/xapi/OpenEelXapiConstants.kt"
          },
          {
            "editType" : "edit",
            "file" : "respect-datalayer-db/src/commonMain/kotlin/world/respect/datalayer/db/school/xapi/XapiStatementsResourceDb.kt"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-app-compose/build.gradle.kts"
        ],
        "commitId" : "008215d71e69209d9c4fb0b24bc80ece11bbf289",
        "timestamp" : 1779040758000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Bump version for xAPI preview\u000a",
        "date" : "2026-05-17 21:59:18 +0400",
        "id" : "008215d71e69209d9c4fb0b24bc80ece11bbf289",
        "msg" : "Bump version for xAPI preview",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-app-compose/build.gradle.kts"
          }
        ]
      },
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt"
        ],
        "commitId" : "752caaf8214d94e8e6f5ec089405c5095c785dc7",
        "timestamp" : 1779101412000,
        "author" : {
          "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
          "fullName" : "Mike Dawson"
        },
        "authorEmail" : "mike@ustadmobile.com",
        "comment" : "Rename and document LaunchRequest properties.\u000a",
        "date" : "2026-05-18 14:50:12 +0400",
        "id" : "752caaf8214d94e8e6f5ec089405c5095c785dc7",
        "msg" : "Rename and document LaunchRequest properties.",
        "paths" : [
          {
            "editType" : "edit",
            "file" : "respect-lib-shared/src/commonMain/kotlin/world/respect/shared/domain/launchapp/LaunchAppUseCase.kt"
          }
        ]
      }
    ],
    "kind" : "git"
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/mike",
      "fullName" : "Mike Dawson"
    },
    {
      "absoluteUrl" : "https://devserver3.ustadmobile.com/jenkins/user/noreply",
      "fullName" : "noreply"
    }
  ]
}