Change:
In the Building a Cipher project, comment is first mentioned in step 51: But in step 59, we actually introduce comment and its syntax: In step 51, we introduce function parameters, so I think mentioning comment here would be a little overwhelming. I think the comment introduction should either be moved to an earlier challenge or kept in step 59. If we move the comment introduction to an earlier challenge, step 51 can be kept as-is. But if we keep comment introduction in step 59, we should update step 51. Instead of asking the users to comment out the code, I wonder if we could ask them to remove the line entirely (though the code is in step 50, so it's probably a little odd to immediately remove it in the next step).
This does seems to be out of sequence. I would suggest to not comment out in step 51 and let the exception be(the resolution is there in the coming steps). This part of the instruction can be updated from: to:
If we don't ask to comment out the function call in step 51 and tell the campers they will work on fixing the error in the next steps, it would be logic to address the error in the console () and require to pass the two positional arguments to the function call in step 52. But then the function will seem to work fine, although it's still using the and variable inside its body instead of the function parameters. The alternative is to ignore the in the console for step 52, and address it directly in step 53. For that we should simply keep the function call instead of commenting it out and there is no need to swap the step order. Honestly, I don't like particularly any of these options.

Discussion:
Modify your function declaration so that it takes two parameters called `message` and `offset`. <del> After that, you'll see an error appear in the terminal. As a temporary fix, comment out the `caesar()` call. </del> <ins> After that, you'll see an error appear in the terminal. You'll see how to solve it in the next steps. </ins> # --hints-- <del> You should comment out the `caesar()` function call. ```js ({test: () => assert(runPython( `not _Node(_code).find_calls('caesar')` ))}) ``` </del> Your `caesar` function should take `message` and `offset` as the parameters. Remember to separate the parameters with a comma. ```js

shift = 3 --fcc-editable-region-- def caesar(): <ins> --fcc-editable-region-- </ins> alphabet = 'abcdefghijklmnopqrstuvwxyz' encrypted_text = ''

print('encrypted text:', encrypted_text) caesar() <del> --fcc-editable-region-- </del> ```

print('plain text:', text) print('encrypted text:', encrypted_text) <del> #caesar() </del> <ins> caesar() </ins> --fcc-editable-region-- ```

# --description-- <del> Now, uncomment your `caesar()` call. You'll see that your code raises a `TypeError`, because the `caesar` function is defined with two parameters (`message` and `offset`), therefore it expects to be called with two *arguments*. </del> <ins> Currently, your code raises a `TypeError`, because the `caesar` function is defined with two parameters (`message` and `offset`), therefore it expects to be called with two *arguments*. </ins> Calling `caesar()` without the required arguments stops the execution of the code.

print('plain text:', message) print('encrypted text:', encrypted_text) --fcc-editable-region-- <del> # caesar() </del> <ins> caesar() </ins> --fcc-editable-region-- ```