부산 기업협력 공고의 공개 범위(매칭, 프로젝트 선정 뒤 기초 이론 40H, 기업 멘토와 실데이터 팀 실습 200H, 결과보고·취업 연계)를 독자적인 가상 시민회관 안내 업무로 연습한다. 원 참여 기업·과제·멘토 자료는 확인되지 않았으며 실제 기업 데이터는 여기서 사용하지 않는다. 취업 연계는 채용 보장이 아니다.
읽음과 숙련은 별개입니다. 자동채점은 선택형에만 적용합니다.
교육자의 독립: 개념을 이해하고 실전 사례를 직접 검증해 현실 문제를 해결하는 시스템을 스스로 개발합니다.
공동체 기여: 결과와 실패·복구 과정을 다른 사람에게 설명하고 함께 개선합니다. 이 과정은 숙련을 보장하지 않습니다.
변경 M1: 가상 승인표 V2에서 사진 모임을 토요일 15시로 변경. 글쓰기 모임은 수요일 19시 유지. 실제 운영정보 아님.
실습 해설 보기
schedule의 사진 값만 '토요일 15시'로 교체한다. 사진 버튼은 15시, 글쓰기 버튼은 19시; 취소/좌석 미확인 문구는 유지. 잘못 바뀌면 V1 파일로 복구한다.
평가 기준: V2 한 항목 변경·기존 기능 보존·고정 안내 유지·복구 가능한 변경표가 모두 있어야 통과.
새 맥락에 적용하기
수업 예약 안내로 소재를 옮겨 규정 버전이 오래됐을 때 화면이 어떤 확인 문구를 보일지 설계하라.
내 말로 설명하고 가르치기
코드 없이 요구서와 두 버튼 시험표만 받은 동료가 변경 전후 결과를 예측하게 하고, 왜 기존 버튼도 검사해야 하는지 설명하게 한다.
실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.
읽음과 숙련은 별개입니다.
학습 단원
보여 주기 시험과 실패 뒤 돌아올 길
해결할 문제와 목표
연습 질문에는 답하지만 처음 보는 '휴강됐나'에는 근거 없는 확답을 한다.
봉인 사례 검증, 분류·근거·수정 부담 측정, 실패 로그와 수기 복구 절차를 만든다.
먼저 알아둘 것
team-03 프로토타입
핵심 한 문장: 시연 성공은 낯선 상황의 안전한 운영을 증명하지 않는다.
지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여
큰 그림: 비유와 경계
소방 훈련에서는 불이 안 났을 때 문이 열리는지만 보지 않는다.
비유가 닿지 않는 곳: 이 실습은 가상 문의 몇 건뿐이어서 실제 현장 안정성을 입증하지 못한다.
실제로 작동하는 원리
평가 사례를 작성 단계에서 분리하고 정답 근거/미확인 표식을 정한다. '맞은 분류 수/전체', 근거 없는 확답 수, 담당자 수정 문장 수, 수동 대비 총 소요시간을 기록하되 이 자료에는 실제 시간이 없다. 위험 오류 발생 시 자동화 사용 중단, V1 승인 시간표와 수기 응대로 복구, 담당자에게 알려 재시험한다.
따라 하기
이제 team04-test.txt의 봉인 C를 열고 V1 화면의 시간 안내만으로 '휴강 여부'를 답할 수 있는지 판정한다.
복사 입력: '가상 운영표에는 글쓰기 수 19시만 있다. 문의는 이번 수요일 휴강됐나요? 근거 있는 것/없는 것/담당자 확인/발송 전 검수로 나눠 줘. 취소 여부는 추측 금지.'
오류 기록을 작성한다: 입력 C, 실제 출력, 기대 출력, 위험도, 재현 방법, 수정, 재시험 담당.
시험이 실패했다고 가정해 'AI 초안 사용 중단 → 승인된 운영표 수기 응대 → 휴강 담당자 확인 → 수정본 신규 사례 시험 후 재개'를 말로 재현한다.
입력 예제
C: 이번 수요일 글쓰기 모임이 취소됐나요? / 표: 수 19시
예상 결과
정기 시간은 수 19시; 이번 주 휴강 정보는 없음. 담당자 확인 전 '개최/취소' 어느 쪽도 확답 불가.
검증 방법
훈련 A/B가 아닌 C에서 출력의 단정 표현을 찾아낸다.
수동 방식과 비교를 하려면 같은 질문·조건의 시간을 실제 기록했는지 확인한다; 자료에 없으므로 개선율은 미산출.
흔한 오해와 실패 복구
'정기 일정이 있다'를 '이번 주 열림'으로 확대 → 날짜별 휴강 정보 확인.
오류를 보고서에서 지움 → 중단·수정·재시험까지 기록.
확인 문제
정기 일정만으로 이번 주 휴강을 알 수 있는가?
자동채점 · 선택형
해설과 정답 보기
정기 일정과 예외 상황은 별개다.
정답: 아니다
C 실패 후 팀의 중단·수기복귀·재개 기준을 서로 검토하라.
동료평가 · 자동채점 아님
평가 기준: 동료가 오류를 재현하고 수기 응대 자료·책임자·새 사례 재시험의 세 요소를 찾을 수 있어야 한다.
해설 보기
고장 후 실제 행동 순서가 문장으로 남아야 한다.
독립 실습
새 가상 문의 D를 풀고 C와 서로 다른 실패 위험을 기록하라.
남길 증거: C/D 근거·미확인·오류 위험표, 실패 시 복귀와 재검증 경로.
봉인 평가 카드
승인 운영표 V1: 글쓰기 모임 수요일 19시; 사진 모임 토요일 14시. 휴강·정원·좌석 정보 없음. C: 이번 수요일 글쓰기 모임은 취소됐나요? D: 토요일 사진 모임에 네 명 예약됐나요?
실습 해설 보기
C는 휴강 미확인, D는 정기 시간 토 14시만 말할 수 있고 예약 인원은 미확인. 둘 다 담당자 확인 없이 개최/예약 상태를 확정할 수 없다.
평가 기준: 시간 정보와 예외/예약 정보를 분리하고 두 사례에 대한 실패 후 행동이 존재한다.
새 맥락에 적용하기
행사 장소가 변경된 경우처럼 예전 안내문은 맞지만 최신성이 없는 사례를 새 평가 카드로 작성하라.
내 말로 설명하고 가르치기
팀원이 '맞은 질문이 많으니 그냥 공개하자'고 할 때 낯선 질문·위험 오류·수기 복구를 근거로 반박하게 한다.
실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.
읽음과 숙련은 별개입니다.
학습 단원
결과보고를 인수와 강의로 바꾸기
해결할 문제와 목표
발표 화면은 멋진데 다른 직원은 사용법과 중단 기준을 모른다.
요구-변경-검증-미달-인수·복구 기록과 선택적 포트폴리오 및 20분 강의안을 만든다.
먼저 알아둘 것
team-01~04 산출물
핵심 한 문장: 프로젝트 완료는 발표가 아니라 다른 사람이 안전하게 재현·중단할 수 있는 상태다.
지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여
큰 그림: 비유와 경계
새 직원에게 조리법뿐 아니라 알레르기 확인과 재료 부족 시 대응까지 인계한다.
비유가 닿지 않는 곳: 비유는 실습 전용이고 현장 데이터 권한·배포 승인·보안 검토를 대신하지 않는다.
실제로 작동하는 원리
보고서는 원 문제, 기준선, 변경과 테스트 증거, 미해결 위험, 운영 판단, 담당자를 이어 준다. 포트폴리오는 자체 코드와 가상 자료만 포함하며 비공개 원문·고객 정보·기업명은 승인 없이 싣지 않는다. 강의 전환은 잘못된 초안 판별→규정 근거 표시→미확인 분리→낯선 질문 시험→teach-back으로 한다.
따라 하기
team05-template.txt의 빈칸을 team-01~04 결과로 채운다. 처리시간은 실측이 없으므로 미측정이라고 쓴다.
복사 입력: '아래 가상 프로젝트 보고서를 요구/산출/증거/미해결/인수/복구 순서로 구조만 다듬어 줘. 채용 확정이나 실제 기업 적용이라고 쓰지 마. 자료: 사진 모임 시간 안내 버튼, 취소·좌석 미확인, C/D 보류, 수기 복귀.'
다른 사람에게 HTML과 보고서만 주고 버튼 동작·미확인·중단 절차를 수행하게 한다. 성공 여부를 체크한다.
'가상 시간안내 2종 프로토타입; 평가 사례 C/D에서 휴강·예약은 미확인으로 보류; 처리시간 미측정; 채용 여부 미확인'으로 사실 범위를 제한한다.
검증 방법
동료가 가상 V1/V2 중 승인본을 구별하고 수기 복귀를 문서만으로 재현하는지 관찰한다.
보고서의 숫자/효과/취업 주장 각각에 출처·측정·한계를 대조한다.
흔한 오해와 실패 복구
취업 연계를 채용 보장으로 표현 → 공고의 연계 목적과 결과 보장을 분리.
공개 포트폴리오에 실제 기업 문서 붙임 → 독자 코드와 가상 자료만 남기고 권리/승인 없으면 공개하지 않는다.
확인 문제
실측 없는 80% 개선을 결과보고에 넣어도 되는가?
자동채점 · 선택형
해설과 정답 보기
수치에는 측정 방법과 근거가 필요하다.
정답: 불가; 미측정으로 표기
동료에게 자료만 주고 인수 시험을 시켜 피드백을 기록하라.
동료평가 · 자동채점 아님
평가 기준: 동료가 실행·위험 질문 보류·수기 복귀를 재현하고 못한 단계를 특정해 개선안을 제안한다.
해설 보기
설명을 들은 사람이 아니라 산출물만 받은 사람이 할 수 있어야 한다.
독립 실습
1쪽 가상 결과보고와 교안 핵심을 채우고 동료 인수 체크란을 만든다.
남길 증거: 근거 있는 보고서와 인수 체크리스트, 타인이 실패 사례를 해결한 기록 또는 미완료 사유.
완전한 보고 양식
가상 프로젝트명: 회관 모임 시간 안내
목표: 시간 문의를 근거에 맞게 초안 작성
승인표: V1 글쓰기 수 19시, 사진 토 14시; V2 변경은 승인 가정만
시험: A/B 시간 안내, C 휴강 미확인, D 예약 인원 미확인
기준선 시간: 미측정
자동발송: 없음
채용: 연계 목표만 공개, 결과 보장 아님
채울 칸: 검수자 / 정지 신호 / 수기 복귀 자료 / 미해결 위험 / 재시험 / 공개 가능 자료 / 강의 실습/평가
실습 해설 보기
정지 신호는 취소·좌석 확답 또는 운영표 버전 충돌. 수기 복귀는 승인된 최신 운영표와 담당자 확인. 기준선 시간 미측정, 미해결 최신성·좌석 정보; 공개 자료는 가상 예제만. 강의 평가는 동료가 새로운 문의에 근거·미확인을 분리하고 중단 절차를 설명하는 수행으로 한다.
평가 기준: 보고·인수·교육 모두 실측/미측정, 인수자, 중단·복구, 비공개 자료 배제를 갖춘다.
새 맥락에 적용하기
문제 유형을 회관 모임에서 도서관 강좌 안내로 바꾸어 강의 실습 카드와 인수기준을 새로 써라.
내 말로 설명하고 가르치기
다른 강사에게 같은 가상 자료만 주고 5분간 수업을 재현시키며, 관찰로 수업 목표가 충족됐는지 판정한다.
실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.
읽음과 숙련은 별개입니다.
학습 단원
가상 공유물품 대여의 요구에서 타인 인수까지
해결할 문제와 목표
공동체가 공유물품의 대여 가능 여부를 물어보지만 서로 다른 안내와 반납 누락이 생긴다. 단일 브라우저 시제품을 실운영 장부로 혼동하면 중복 대여와 권리 침해가 생긴다.
요구 정의→권리와 최소 자료→작동하는 로컬 기록→정상·실패·수정→타인 재현·운영/복구를 한 가상 과제로 연결한다. 공동체 기여는 자발적이고 실제 효과는 미검증이다.
먼저 알아둘 것
team-05의 보고·인수·강의안 초안; HTML 파일 저장·브라우저 열기. 앞 단원의 평가 미통과자는 필요한 부분만 보충한다.
핵심 한 문장: 작은 시스템은 입력을 검사하고 상태 변화를 기록하되, 운영 권한과 복구 책임은 별도로 설계해야 한다.
지금 할 일준비물개념과 원리따라 하기예상 결과와 검증오류 복구혼자 변형설명과 기여
큰 그림: 비유와 경계
공동 물품함의 대여표를 탁자 위 장부에 적듯 한 탭의 사건 기록을 읽는다.
비유가 닿지 않는 곳: 한 장의 종이나 한 탭은 여러 사람이 동시에 수정할 수 있는 중앙 장부가 아니며 대여표 번호는 이용자 신원 확인 수단이 아니다.
실제로 작동하는 원리
이 HTML은 입력 D1/D2를 허용 목록으로 검사하고, 사건 배열에 loan/return을 추가하고, 사건을 순서대로 접어 현재 물품별 활성 대여표를 계산한다. 중복 대여/반납을 거부한다. DOM에는 textContent로만 넣는다. 메모리 상태는 새로고침 시 사라지므로 합성 JSON 백업을 다운로드하고 검증 후 복원한다. 파일 복원은 버전·필드·순서·중복·대여표 정수 범위를 검사하며 실패 시 기존 화면을 보존한다. 이는 서버 DB·공유 상태·동시성 제어·로그인/인증·실제 재고 확인이 없는 학습 시제품이다. 실제 여러 이용자 운영은 별도 승인·서버 트랜잭션·권한·백업/복구·접근성·보안 검토가 필요하고 여기서는 구현/배포하지 않는다.
따라 하기
요구 인터뷰를 가상 카드로 수행한다: 이용자는 D1 사다리 또는 D2 돗자리의 대여 가능 여부를 보고 싶고, 운영자는 대여/반납 오류를 되돌릴 수 있어야 한다. 수용기준은 D1 첫 대여 성공, 같은 D1 중복 거부, 정확한 표로 반납, 잘못된 표 거부, 백업 복원이다. 실제 주민 접촉은 하지 않는다.
권리·자료 카드: 코드 D1/D2와 사건/가상 표 번호만 입력한다. 물품 실소유·운영자 승인·사용권은 실운영 전에 별도 확인한다. 실명·전화·주소·참여자 명단·비공개 안내 복제 금지. JSON 백업은 합성자료만. 공개 포트폴리오/기여는 선택 사항이며 공개 동의와 개인정보 처리 동의는 별개의 결정이다.
아래 community-loans.html의 content 전체를 텍스트 편집기에 복사해 UTF-8 파일 community-loans.html로 저장한다(추가 설치 없음). 파일을 더블클릭해 로컬 브라우저에서 연다. 제목·D1/D2와 “둘 다 대여 가능”이 보이면 시작한다. 보이지 않으면 확장자가 .html인지, 코드 일부가 아닌 전체를 저장했는지 확인한다.
실행 전에 종이에 예상값을 적는다. D1→대여 기록 클릭: L1 대여 중. 같은 D1 다시 클릭: 거부, 사건 1건. L1→반납 기록 클릭: D1 가능, 사건 2건. 다시 L1 반납: 거부. D2 대여: L2 대여 중. Tab/Enter로 버튼에도 접근한다.
실패주입: D3 입력은 거부, 빈 표와 L9 반납은 거부. 백업 저장 버튼으로 fictional-loans.json 파일이 실제 다운로드되었는지 확인한다. 가상 사건 하나가 열린 상태에서 내보낸 뒤 초기화→복원해 그 물품이 대여 중으로 되돌아오는지 확인한다. 악의/손상 예제로 복사 백업의 events에서 같은 loan 사건을 한 번 더 추가해 복원: “복원 거부”와 기존 상태 유지를 기대한다. 원본 백업은 보존한다.
수정 과제: 요구가 바뀌어 D3 돋보기가 추가되면 names에 D3만 추가한다. 저장 전 D3 거부→수정 후 D3 첫 대여 L1 성공→중복 거부→반납·백업 복원을 예측·확인한다. 원본 HTML은 별도 복사로 보존하고 기존 D1/D2 회귀도 반복한다. 사용한 AI 도움은 요구 질문→오류 힌트→마지막 독립 변경/설명 순으로 줄여 기록한다.
인수: 동료에게 수정 파일과 이 단원의 수용기준만 준다. 동료가 처음 열어 D3 정상·중복·반납·손상 복원 거부·수기 대체표를 재현하게 하고 실패한 단계와 개선을 기록한다. 동료 시험을 하지 않았다면 미실시로 기록한다. 강사는 새 카드 “D2 분실”을 제시해 상태/책임자/보류 문구를 학습자가 독립 작성하게 한다. 현 코드는 분실 처리가 없으므로 미구현이라고 명시한다.
입력 예제
빈 가상 장부→D1 대여 두 번→L1 반납 두 번→D2 대여. 외부 이용자 자료 없음.
예상 결과
D1: L1 대여 중/중복 거부/반납 후 가능/중복 반납 거부, D2: L2 대여 중. 사건은 정상 대여·반납·대여 3건만 남는다. 새로고침하면 초기화; 가상 백업 복원에 성공해야 이전 사건이 보인다.
검증 방법
자동·화면 관찰: 허용 D1/D2, 중복·거부, 사건수, 복원 전후 상태, 잘못된 JSON 거부 후 기존 상태 유지와 키보드 탭 순서를 확인한다. 코드가 존재한다는 사실만으로 브라우저 검증 완료나 학습자 성취를 뜻하지 않는다.
사람 판정: 동료가 지침만으로 새 D3를 재현하고 메모리/백업/중앙 서버 차이 및 수기 복귀를 설명한다. 동료 미실시는 미실시로 기록하며 자기 체크만으로 합격하지 않는다.
흔한 오해와 실패 복구
file://에서 다운로드가 막히면 브라우저의 다운로드 권한을 확인하고 사건 기록은 가상 입력으로만 다시 만든다. 개인 자료로 시도하거나 보안 제한을 해제하지 않는다.
복원 실패 시 원본 합성 백업을 열어 version=1, events 배열, 사건 순서와 표 번호를 검사한다. 기존 화면은 유지되고 마지막으로 검증된 가상 백업 또는 빈 수기표로 복귀한다.
서로 다른 탭/기기/운영자 간 동기화는 없다. 이 시제품으로 실제 대여·재고를 확정하거나 운영하지 않는다.
확인 문제
D1을 두 탭에서 각자 대여했을 때 이 파일이 중복 대여를 막는가?
자동채점 · 선택형
해설과 정답 보기
단일 탭 상태 배열만 검사하므로 실제 동시성 제어는 없다.
정답: 막지 못한다. 각 탭의 메모리가 따로 있다.
동료에게 D3 요구를 주고 중복/손상/복구를 직접 실행하게 한 뒤, 이 시제품으로 운영하면 안 되는 이유를 자신의 말로 설명하라.
동료평가 · 자동채점 아님
평가 기준: 동료 재현 여부·입력/예상/관측/수정의 실제 기록, 사건 접기 원리 설명, 실제 공유 서버/인증/권리/복구 부재 4종을 확인한다. 미실시를 성공으로 표시하지 않는다.
해설 보기
대여 기록 동작과 운영 가능성을 분리한다.
독립 실습
community-loans.html을 직접 열고 D1 정상·중복·반납, D3 실패→추가, 백업·손상 복원을 시연한다. 가상 이용자 카드에서 요구와 권리·최소자료를 정하고 운영 인계서와 15분 재사용 강의안을 만든다. 다른 강사는 D2 분실 카드를 미리 보지 않고 제시한다.
남길 증거: 학습자가 만든 요구/권리 카드, 저장한 HTML과 D3 변경 전후 실제 화면, D1/D2 회귀·중복·손상 복원 기록, 수기 복귀 인수표, 동료/다른 강사의 독립 재현 또는 미실시 표시. 공개/실사용자 기여는 선택이며 별도 동의/승인을 받기 전 모의 기여다.
설치 없는 완전한 로컬 HTML
<!doctype html>
<html lang="ko"><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>가상 공유물품 대여·반납 로컬 실습</title>
<style>body{font:1rem/1.6 system-ui;max-width:44rem;margin:auto;padding:1rem}button,input{font:inherit;padding:.4rem;margin:.2rem}button:focus-visible,input:focus-visible{outline:3px solid #145a92}li{overflow-wrap:anywhere}fieldset{margin:1rem 0}#events{white-space:pre-wrap}</style>
<h1>가상 공유물품 대여·반납</h1>
<p>연습용 단일 브라우저 메모리. 공동 서버/예약 아님. 실명·연락처 입력 금지. 새로고침하면 사라집니다. 가상 기록만 파일로 내보내세요.</p>
<p>물품 코드는 아래 현재 상태 목록에서 확인하세요. 이 화면은 한 컴퓨터의 한 탭에서만 상태를 압니다.</p>
<fieldset><legend>대여</legend><label for="item">물품 코드</label><input id="item" placeholder="예: D1" autocomplete="off"><button id="loan" type="button">대여 기록</button></fieldset>
<fieldset><legend>반납</legend><label for="ticket">대여표 번호</label><input id="ticket" placeholder="L1" autocomplete="off"><button id="return" type="button">반납 기록</button></fieldset>
<p id="status" role="status" aria-live="polite">입력 전: 현재 상태 목록을 확인하세요.</p><h2>현재 상태</h2><ul id="items"></ul><h2>가상 사건 기록</h2><ol id="events"></ol>
<button id="export" type="button">가상 백업 저장</button><label for="restore">가상 백업 복원</label><input id="restore" type="file" accept="application/json,.json"><button id="reset" type="button">연습 초기화</button>
<script>
'use strict';
const $=s=>document.querySelector(s), names={D1:'사다리',D2:'돗자리'};
let events=[],next=1;
function state(rows=events){const active=Object.fromEntries(Object.keys(names).map(id=>[id,null]));for(const e of rows){if(e.kind==='loan')active[e.item]=e.ticket;else active[e.item]=null}return active}
function render(){const active=state();$('#items').replaceChildren();for(const id of Object.keys(names)){const li=document.createElement('li');li.textContent=id+' '+names[id]+': '+(active[id]?'대여 중 ('+active[id]+')':'대여 가능');$('#items').append(li)}$('#events').replaceChildren();for(const e of events){const li=document.createElement('li');li.textContent=e.kind==='loan'?`${e.ticket}: ${e.item} 대여`:`${e.ticket}: ${e.item} 반납`;$('#events').append(li)}}
function report(s){$('#status').textContent=s}
$('#loan').onclick=()=>{const id=$('#item').value.trim().toUpperCase();if(!Object.hasOwn(names,id)){report('거부: '+Object.keys(names).join(' 또는 ')+'만 입력하세요.');return}if(state()[id]){report('거부: 이미 대여 중입니다. 반납 후 다시 시도하세요.');return}const ticket='L'+next++;events.push({kind:'loan',item:id,ticket});render();report(id+' 대여 기록: '+ticket+' (가상·단일 탭)')};
$('#return').onclick=()=>{const ticket=$('#ticket').value.trim().toUpperCase(), active=state(),id=Object.keys(active).find(k=>active[k]===ticket);if(!id){report('거부: 활성 대여표가 없습니다. 번호 또는 중복 반납을 확인하세요.');return}events.push({kind:'return',item:id,ticket});render();report(id+' 반납 기록 완료 (가상)')};
function valid(rows){if(!Array.isArray(rows)||rows.length>1000)throw Error('사건 배열/건수 오류');const seen=new Set(),open=Object.fromEntries(Object.keys(names).map(id=>[id,null]));let max=0;for(const e of rows){if(!e||Object.keys(e).sort().join(',')!=='item,kind,ticket'||!Object.hasOwn(names,e.item)||!['loan','return'].includes(e.kind)||typeof e.ticket!=='string'||!/^L[1-9][0-9]*$/.test(e.ticket))throw Error('사건 필드 오류');const n=Number(e.ticket.slice(1));if(!Number.isSafeInteger(n))throw Error('번호 범위 오류');if(e.kind==='loan'){if(seen.has(e.ticket)||open[e.item]||n<=max)throw Error('중복 대여/번호 오류');seen.add(e.ticket);open[e.item]=e.ticket;max=n}else{if(open[e.item]!==e.ticket)throw Error('반납 순서 오류');open[e.item]=null}}return max+1}
$('#export').onclick=()=>{const blob=new Blob([JSON.stringify({version:1,events},null,2)],{type:'application/json'}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download='fictional-loans.json';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);report('가상 백업 다운로드 요청: 실제 파일 저장 여부를 확인하세요.')};
$('#restore').onchange=async e=>{const file=e.target.files[0];if(!file)return;try{if(file.size>100000)throw Error('파일 크기 오류');const data=JSON.parse(await file.text());if(!data||Object.keys(data).sort().join(',')!=='events,version'||data.version!==1)throw Error('버전 오류');const proposed=valid(data.events);events=data.events;next=proposed;render();report('가상 백업 복원 완료: '+events.length+'건')}catch(err){report('복원 거부: '+err.message+'; 기존 화면 유지')}e.target.value=''};
$('#reset').onclick=()=>{events=[];next=1;render();report('연습 기록 초기화. 저장한 가상 백업만 복원 가능')};render();
</script></html>
강사·동료 인수용 가상 카드
가상 공동체 요청: D1 사다리, D2 돗자리의 대여 여부 안내. 새 요청 D3 돋보기, 분실 D2는 미구현. 사용권/실물 재고는 미확인. 입력은 물품 코드와 가상 대여표만.
수업 15분: 3분 요구/권리, 4분 D1 정상·중복, 3분 손상 복원, 3분 D3 독립 변경, 2분 동료 설명·운영 불가 이유.
인수표: 저장파일/열기/예상출력/오류 주입·수정/백업/수기표/운영 책임자/미구현/동료 재현 상태.
수기 대체표: 가상 코드·가상 표·대여/반납·담당자 확인만. 실제 현장 사용 전 별도 승인·개인정보 설계 필요.
강사 즉석 질문: D2 분실은 현재 어떤 상태로 처리되는가? 답: 미구현, 대여 확정 중단 및 운영자 검토. AI 힌트 없이 설명하게 한다.
실습 해설 보기
예상 정상 사건은 D1 loan L1, D1 return L1, D2 loan L2. 거부된 입력은 사건을 늘리지 않는다. D3 추가는 names={D1:…,D2:…,D3:"돋보기"} 변형 한 곳으로 가능하나 기존 백업 데이터의 허용 코드가 바뀌는 영향도 재시험한다. 무결성 검사는 수업용 클라이언트 검증일 뿐 위변조를 막는 서버 권한이 아니다. 새로고침 소실 때는 마지막 가상 백업을 검증 후 복원하거나 빈 수기표로 되돌린다. 분실은 현 코드에 상태가 없어 운영자에게 보류/설계 변경을 요청한다.
평가 기준: 요구-권리/최소자료-실행-정상/실패/수정-동료 재현/복구 다섯 단계 각각 실제 증거가 있어야 과정 내 독립 수행 검토 가능. 동료 미실시·브라우저 미실행은 미검증. 실제 다중사용자 운영 가능, 공동체 성과 또는 교육자 독립을 보장하지 않는다.
새 맥락에 적용하기
가상 우산 공유로 물품을 바꾸되 우산이 파손되었을 때 “대여 가능”으로 자동 돌리지 않는 새 상태/승인 요구를 독립 작성한다. AI 없이 기존 loan/return 사건 접기로 파손을 표현할 수 없는 이유를 설명하고 강사는 다른 코드를 즉석 지정한다.
내 말로 설명하고 가르치기
학습자는 백업을 가린 뒤 사건 3개의 상태를 종이에 계산하고 화면에서 확인한다. AI 도움 없는 재설명에서 단일 탭·개인정보·동시성·운영 승인 한계를 명시한다. 다른 강사는 인수 카드만 보고 15분 수업을 재현하거나 미실시를 기록하고, 새 오류를 발견하면 교안의 어떤 단계/예상 출력을 갱신할지 학습자에게 묻는다.
실습·전이·설명 결과는 본인 또는 동료가 기준에 따라 검토하세요. 이 페이지는 숙련을 자동 인증하지 않습니다.